- 投稿日:2020-12-16T21:07:57+09:00
MySQLの基本操作
はじめに
MySQLの基本操作のメモ(コマンド一覧).
目次
起動方法
ターミナルmysql -u root -p→Enter password: [パスワード]
データベースの操作
↓ データベース一覧を表示するコマンド
mysql>show databases;↓ データベースを作成するコマンド
mysql>create database データベース名;↓ データベースを削除するコマンド
mysql>drop database データベース名;↓ データベースを選択するコマンド
mysql>use データベース名;テーブルを操作するにはこのUSEコマンドで一度データベースを選択しなければならない.
テーブルの操作
↓ テーブル一覧を表示するコマンド
mysql>show tables;↓ テーブルを作成するコマンド(例)
mysql>CREATE table non_index_table (id INT AUTO_INCREMENT, num INT, PRIMARY KEY (id)); INSERT INTO non_index_table (num) VALUES ('7084'); INSERT INTO non_index_table (num) VALUES ('1348');テーブルの作成はCREATE文を使う
データを追加するにはINSERT文を使うCREATE table テーブル名 (カラム名 型, カラム名 型, ...);
INSERT INTO テーブル名 (カラム名, カラム名) VALUES (値, 値);AUTO_INCREMENT は insert するたびに自動で+1して設定してくれる.
PRIMARY KEY (カラム名) で主キーを設定する.↓ テーブルの中身を確認するコマンド
mysql>SELECT * FROM テーブル名;↓ テーブルを削除するコマンド
mysql>drop table テーブル名;↓ データを更新するコマンド(例)
mysql>update non_index_table set num=2411 where id=1668608;update テーブル名 set カラム名1=値1 where カラム名2=値2;
(テーブル名)の(カラム名1=値1)の場所の(カラム名2)を(値2)に更新する.sqlfileの中身を実行する
mysql>source (sqlFile.sqlのアドレス);
- 投稿日:2020-12-16T21:07:57+09:00
[MySQL]基本操作
概要
MySQLの基本操作のメモ(コマンド一覧).
目次
起動方法
ターミナルmysql -u root -p→Enter password: [パスワード]
データベースの操作
↓ データベース一覧を表示するコマンド
mysql>show databases;↓ データベースを作成するコマンド
mysql>create database データベース名;↓ データベースを削除するコマンド
mysql>drop database データベース名;↓ データベースを選択するコマンド
mysql>use データベース名;テーブルを操作するにはこのUSEコマンドで一度データベースを選択しなければならない.
テーブルの操作
↓ テーブル一覧を表示するコマンド
mysql>show tables;↓ テーブルを作成するコマンド(例)
mysql>CREATE table non_index_table (id INT AUTO_INCREMENT, num INT, PRIMARY KEY (id)); INSERT INTO non_index_table (num) VALUES ('7084'); INSERT INTO non_index_table (num) VALUES ('1348');テーブルの作成はCREATE文を使う
データを追加するにはINSERT文を使うCREATE table テーブル名 (カラム名 型, カラム名 型, ...);
INSERT INTO テーブル名 (カラム名, カラム名) VALUES (値, 値);AUTO_INCREMENT は insert するたびに自動で+1して設定してくれる.
PRIMARY KEY (カラム名) で主キーを設定する.↓ テーブルの中身を確認するコマンド
mysql>SELECT * FROM テーブル名;↓ テーブルを削除するコマンド
mysql>drop table テーブル名;↓ データを更新するコマンド(例)
mysql>update non_index_table set num=2411 where id=1668608;update テーブル名 set カラム名1=値1 where カラム名2=値2;
(テーブル名)の(カラム名1=値1)の場所の(カラム名2)を(値2)に更新する.sqlfileの中身を実行する
mysql>source (sqlFile.sqlのアドレス);テーブルをコピーする
mysql>CREATE TABLE 新しいテーブル名 SELECT * FROM 古いテーブル名;
- 投稿日:2020-12-16T21:07:57+09:00
[MySQL] 基本操作
概要
MySQLの基本操作のメモ(コマンド一覧).
目次
起動方法
ターミナルmysql -u root -p→Enter password: [パスワード]
データベースの操作
↓ データベース一覧を表示するコマンド
mysql>show databases;↓ データベースを作成するコマンド
mysql>create database データベース名;↓ データベースを削除するコマンド
mysql>drop database データベース名;↓ データベースを選択するコマンド
mysql>use データベース名;テーブルを操作するにはこのUSEコマンドで一度データベースを選択しなければならない.
テーブルの操作
↓ テーブル一覧を表示するコマンド
mysql>show tables;↓ テーブルを作成するコマンド(例)
mysql>CREATE table non_index_table (id INT AUTO_INCREMENT, num INT, PRIMARY KEY (id)); INSERT INTO non_index_table (num) VALUES ('7084'); INSERT INTO non_index_table (num) VALUES ('1348');テーブルの作成はCREATE文を使う
データを追加するにはINSERT文を使うCREATE table テーブル名 (カラム名 型, カラム名 型, ...);
INSERT INTO テーブル名 (カラム名, カラム名) VALUES (値, 値);AUTO_INCREMENT は insert するたびに自動で+1して設定してくれる.
PRIMARY KEY (カラム名) で主キーを設定する.↓ テーブルの中身を確認するコマンド
mysql>SELECT * FROM テーブル名;↓ テーブルを削除するコマンド
mysql>drop table テーブル名;↓ データを更新するコマンド(例)
mysql>update non_index_table set num=2411 where id=1668608;update テーブル名 set カラム名1=値1 where カラム名2=値2;
(テーブル名)の(カラム名1=値1)の場所の(カラム名2)を(値2)に更新する.sqlfileの中身を実行する
mysql>source (sqlFile.sqlのアドレス);テーブルをコピーする
mysql>CREATE TABLE 新しいテーブル名 SELECT * FROM 古いテーブル名;
- 投稿日:2020-12-16T21:07:57+09:00
MySQLの使いかた
はじめに
MySQLの基本操作のメモ(コマンド一覧).
目次
起動方法
ターミナルmysql -u root -p→Enter password: [パスワード]
データベースの操作
↓ データベース一覧を表示するコマンド
mysql>show databases;↓ データベースを作成するコマンド
mysql>create database データベース名;↓ データベースを削除するコマンド
mysql>drop database データベース名;↓ データベースを選択するコマンド
mysql>use データベース名;テーブルを操作するにはこのUSEコマンドで一度データベースを選択しなければならない.
テーブルの操作
↓ テーブル一覧を表示するコマンド
mysql>show tables;↓ テーブルを作成するコマンド(例)
mysql>CREATE table non_index_table (id INT AUTO_INCREMENT, num INT, PRIMARY KEY (id)); INSERT INTO non_index_table (num) VALUES ('7084'); INSERT INTO non_index_table (num) VALUES ('1348');テーブルの作成はCREATE文を使う
データを追加するにはINSERT文を使うCREATE table テーブル名 (カラム名 型, カラム名 型, ...);
INSERT INTO テーブル名 (カラム名, カラム名) VALUES (値, 値);AUTO_INCREMENT は insert するたびに自動で+1して設定してくれる.
PRIMARY KEY (カラム名) で主キーを設定する.↓ テーブルの中身を確認するコマンド
mysql>SELECT * FROM テーブル名;↓ テーブルを削除するコマンド
mysql>drop table テーブル名;↓ データを更新するコマンド(例)
mysql>update non_index_table set num=2411 where id=1668608;update テーブル名 set カラム名1=値1 where カラム名2=値2;
(テーブル名)の(カラム名1=値1)の場所の(カラム名2)を(値2)に更新する.sqlFileの中身を実行する
mysql>source (sqlFile.sqlのアドレス);
- 投稿日:2020-12-16T19:14:46+09:00
インターナル通信でAurora MySQLからCloudSQLへレプリケーションする方法
概要
本記事では、AuroraMySQLからCloudSQLへインターナル通信にてレプリケーションする方法を紹介します。GCPのネットワーク周りで結構ハマりましたので参考になればと思います。
手順
1. AWSのVPC並びにGCPのネットワークの作成
まず、AWSとGCPそれぞれでVPCが無いと始まらないのでそれらの作成を行います。なお本記事ではAWS側をCloudFormationで、GCP側をTerrafromにて記述しています。
- AWS
cfn.ymlResources: EC2VPC: Type: 'AWS::EC2::VPC' Properties: CidrBlock: !Ref VPCCidrBlock EnableDnsSupport: true EnableDnsHostnames: true InstanceTenancy: 'default' Tags: - Key: 'Name' Value: !Sub ${AWS::StackName} - Key: 'Scope' Value: !Ref GlobalEnvironment EC2DHCPOptions: Type: 'AWS::EC2::DHCPOptions' Properties: DomainName: !Sub '${GlobalEnvironment}.${GlobalPrefix}.internal ${AWS::Region}.compute.internal' DomainNameServers: - 'AmazonProvidedDNS' Tags: - Key: 'Name' Value: !Sub ${AWS::StackName}-dhcp-options - Key: 'Scope' Value: !Ref GlobalEnvironment EC2VPCDHCPOptionsAssociation: Type: 'AWS::EC2::VPCDHCPOptionsAssociation' Properties: DhcpOptionsId: !Ref EC2DHCPOptions VpcId: !Ref EC2VPC
- GCP
// VPC resource "google_compute_network" "vpc" { name = "vpc" auto_create_subnetworks = false routing_mode = "GLOBAL" }2. AWS側サブネットとAuroraの準備
続いてprimaryとなるAurora MySQLの作成を行います。レプリケーションができるように以下のRDSのパラメータグループのオプションを指定しています。
Parameters: binlog_format: 'ROW' gtid-mode: 'ON' enforce_gtid_consistency: 'ON'以下がサブネットとAurora作成のためのテンプレートです。
Resources: # Subnet EC2SubnetPrivateAZ1: Type: 'AWS::EC2::Subnet' Properties: AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: !Ref AWS::Region CidrBlock: !Ref IPCidrBlockPrivateAZ1 MapPublicIpOnLaunch: false Tags: - Key: 'Name' Value: !Sub ${GlobalPrefix}_${GlobalEnvironment}_private_az1 - Key: 'Scope' Value: !Ref GlobalEnvironment VpcId: !Ref EC2VPC EC2RouteTablePrivateAZ1: Type: 'AWS::EC2::RouteTable' Properties: VpcId: !Ref EC2VPC Tags: - Key: 'Name' Value: !Sub ${GlobalPrefix}_${GlobalEnvironment}_route_table_private_az1 - Key: 'Scope' Value: !Ref GlobalEnvironment EC2SubnetRouteTableAssociationPrivateAZ1: Type: 'AWS::EC2::SubnetRouteTableAssociation' Properties: RouteTableId: !Ref EC2RouteTablePrivateAZ1 SubnetId: !Ref EC2SubnetPrivateAZ1 EC2RoutePrivateAZ1NatGateway: Type: 'AWS::EC2::Route' Properties: DestinationCidrBlock: '0.0.0.0/0' NatGatewayId: !Ref EC2NatGatewayAZ1 RouteTableId: !Ref EC2RouteTablePrivateAZ1 ## AZ2 EC2SubnetPrivateAZ2: Type: 'AWS::EC2::Subnet' Properties: AvailabilityZone: Fn::Select: - 1 - Fn::GetAZs: !Ref AWS::Region CidrBlock: !Ref IPCidrBlockPrivateAZ2 MapPublicIpOnLaunch: false Tags: - Key: 'Name' Value: !Sub ${GlobalPrefix}_${GlobalEnvironment}_private_az2 - Key: 'Scope' Value: !Ref GlobalEnvironment VpcId: !Ref EC2VPC EC2RouteTablePrivateAZ2: Type: 'AWS::EC2::RouteTable' Properties: VpcId: !Ref EC2VPC Tags: - Key: 'Name' Value: !Sub ${GlobalPrefix}_${GlobalEnvironment}_route_table_private_az2 - Key: 'Scope' Value: !Ref GlobalEnvironment EC2SubnetRouteTableAssociationPrivateAZ2: Type: 'AWS::EC2::SubnetRouteTableAssociation' Properties: RouteTableId: !Ref EC2RouteTablePrivateAZ2 SubnetId: !Ref EC2SubnetPrivateAZ2 EC2RoutePrivateAZ2NatGateway: Type: 'AWS::EC2::Route' Properties: DestinationCidrBlock: '0.0.0.0/0' NatGatewayId: !Ref EC2NatGatewayAZ2 RouteTableId: !Ref EC2RouteTablePrivateAZ2 # RDS IAMRoleRDSEnhancedMonitoring: Type: 'AWS::IAM::Role' Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: 'Allow' Principal: Service: 'monitoring.rds.amazonaws.com' Action: 'sts:AssumeRole' ManagedPolicyArns: - 'arn:aws:iam::aws:policy/service-role/AmazonRDSEnhancedMonitoringRole' EC2SecurityGroupDatabase: Type: 'AWS::EC2::SecurityGroup' Properties: GroupDescription: !Sub '${AWS::StackName}-database' SecurityGroupIngress: - SourceSecurityGroupId: !Ref MyHomeIp FromPort: 3306 ToPort: 3306 IpProtocol: 'tcp' Tags: - Key: 'Name' Value: !Sub '${AWS::StackName}-database' - Key: 'Scope' Value: !Ref GlobalEnvironment VpcId: !Ref EC2VPC RDSDBClusterParameterGroup: Type: 'AWS::RDS::DBClusterParameterGroup' Properties: Description: !Sub 'cluster parameter group for ${AWS::StackName}' Family: 'aurora-mysql5.7' Parameters: binlog_format: 'ROW' gtid-mode: 'ON' enforce_gtid_consistency: 'ON' Tags: - Key: 'Scope' Value: !Ref GlobalEnvironment RDSDBParameterGroup: Type: 'AWS::RDS::DBParameterGroup' Properties: Description: !Sub 'parameter group for ${AWS::StackName}' Family: 'aurora-mysql5.7' Tags: - Key: 'Scope' Value: !Ref GlobalEnvironment RDSDBSubnetGroup: Type: 'AWS::RDS::DBSubnetGroup' Properties: DBSubnetGroupDescription: !Sub 'db subnet group for ${AWS::StackName}' SubnetIds: - !Ref EC2SubnetPrivateAZ1 - !Ref EC2SubnetPrivateAZ2 Tags: - Key: 'Scope' Value: !Ref GlobalEnvironment RDSDBCluster: Type: 'AWS::RDS::DBCluster' DeletionPolicy: 'Snapshot' Properties: AvailabilityZones: - !Select [0, !GetAZs ''] - !Select [1, !GetAZs ''] BackupRetentionPeriod: 35 DBClusterParameterGroupName: !Ref RDSDBClusterParameterGroup DBSubnetGroupName: !Ref RDSDBSubnetGroup Engine: 'aurora-mysql' EngineVersion: '5.7' KmsKeyId: 'alias/aws/rds' MasterUsername: 'root' MasterUserPassword: 'password' Port: 3306 PreferredBackupWindow: '19:00-19:30' # JST 05:00-05:30 PreferredMaintenanceWindow: 'Thu:20:00-Thu:20:30' # JST FRI 04:00-04:30 StorageEncrypted: true Tags: - Key: 'Scope' Value: !Ref GlobalEnvironment VpcSecurityGroupIds: - !Ref EC2SecurityGroupDatabase RDSDBInstanceFirst: Type: 'AWS::RDS::DBInstance' DeletionPolicy: 'Delete' Properties: AllowMajorVersionUpgrade: false AutoMinorVersionUpgrade: false AvailabilityZone: !Select [0, !GetAZs ''] CopyTagsToSnapshot: true DBClusterIdentifier: !Ref RDSDBCluster DBInstanceClass: 'db.r5.large' Engine: 'aurora-mysql' MonitoringInterval: 15 MonitoringRoleArn: !GetAtt IAMRoleRDSEnhancedMonitoring.Arn PreferredMaintenanceWindow: 'Thu:20:00-Thu:20:30' # JST FRI 04:00-04:30 PubliclyAccessible: false Tags: - Key: 'Scope' Value: !Ref GlobalEnvironment DBParameterGroupName: !Ref RDSDBParameterGroup RDSDBInstanceSecond: Type: 'AWS::RDS::DBInstance' DeletionPolicy: 'Delete' Properties: AllowMajorVersionUpgrade: false AutoMinorVersionUpgrade: false AvailabilityZone: !Select [1, !GetAZs ''] CopyTagsToSnapshot: true DBClusterIdentifier: !Ref RDSDBCluster DBInstanceClass: 'db.r5.large' Engine: 'aurora-mysql' MonitoringInterval: 15 MonitoringRoleArn: !GetAtt IAMRoleRDSEnhancedMonitoring.Arn PreferredMaintenanceWindow: 'Thu:20:00-Thu:20:30' # JST FRI 04:00-04:30 PubliclyAccessible: false Tags: - Key: 'Scope' Value: !Ref GlobalEnvironment DBParameterGroupName: !Ref RDSDBParameterGroup4. AWSとGCPをプライベート接続
AWSとGCPを専用線で結びます。AWSのDirectConnectとGCPのInterConnectを利用することでそれが可能です。今回は個人レベルではそれらを用意することは不可能なのでVPNで代用します。AWSとGCPでVPNを結ぶ方法は以下の記事をご参照ください。
https://qiita.com/katsuyan/items/94eb005c06c517c0c84a
5. GCPのgoogle-managed-services-vpcのCIDRを指定する
CloudSQLはgoogle-managed-services-vpcと言うgoogleのマネージドVPCに作成されます。そこにVPCピアリングする形で、自分たちで作ったネットワークと接続します。そのため、自分たちで作ったサブネットの中にCloudSQLを作成するといったことができません。しかし、CloudSQLのIPがどのCIDRから決まるのかがわかっていないと、AWS側のセキュリティグループの許可設定をCloudSQLが立ち上がるたびに設定する必要が出てきてしまいます。
そこでgoogle-managed-services-vpcのアドレスを設定することでgoogle-managed-services-vpcで作られるサブネットのCIDRを指定します。このアドレスを指定することで、指定したIPレンジからCloudSQLのIPが決まります。VPCのPrivate service connectionで、「google-managed-services-vpc-{プロジェクト名}」というNameでCIDRを指定することで設定が可能です。
resource "google_compute_global_address" "private_ip_alloc_google_managed_service" { name = "google-managed-services-vpc-projectname" purpose = "VPC_PEERING" address_type = "INTERNAL" prefix_length = 24 network = google_compute_network.vpc.id address = "10.165.2.0" }6. AWS側で上記で固定したIPレンジからの通信を許可する
次にAWS側でCloudSQLが作られるgoogle-managed-services-vpcのIPレンジからの通信を許可します。通信を許可するために、ルートテーブルとセキュリティグループの設定を行います。
EC2RoutePrivateDatabaseVGWGCPCloudSQLSubentAZ1: Type: 'AWS::EC2::Route' Properties: DestinationCidrBlock: '10.165.2.0/24' GatewayId: !Ref VGW RouteTableId: !Ref EC2RouteTablePrivateAZ1 EC2RoutePrivateDatabaseVGWGCPCloudSQLSubentAZ2: Type: 'AWS::EC2::Route' Properties: DestinationCidrBlock: '10.165.2.0/24' GatewayId: !Ref VGW RouteTableId: !Ref EC2RouteTablePrivateAZ2更新
EC2SecurityGroupDatabase: Type: 'AWS::EC2::SecurityGroup' Properties: GroupDescription: !Sub '${AWS::StackName}-database' SecurityGroupIngress: - SourceSecurityGroupId: !Ref EC2SecurityGroupAllowSSHFromOffice FromPort: 3306 ToPort: 3306 IpProtocol: 'tcp' - CidrIp: !Ref IPGCPPrivateServiceDev FromPort: 3306 ToPort: 3306 IpProtocol: 'tcp' - CidrIp: !Ref IPGCPSubnetZozoDataPoolDev FromPort: 3306 ToPort: 3306 IpProtocol: 'tcp' - CidrIp: '10.165.2.0/24' FromPort: 3306 ToPort: 3306 IpProtocol: 'tcp' Tags: - Key: 'Name' Value: !Sub '${AWS::StackName}-database' - Key: 'Scope' Value: !Ref GlobalEnvironment VpcId: !Ref EC2VPC詳しくは以下の記事をご参照ください。
https://qiita.com/shiozaki/items/2aa3c249f0399d6b779e
7. 仮のCloudSQL用の作成
「CloudSQLはgoogle-managed-services-vpcと言うgoogleのマネージドVPCに作成されます。そこにVPCピアリングする形で、自分たちで作ったネットワークと接続します。」と説明しましたが、そのVPCが作られるのは初めてCloudSQLを作成したタイミングになります。
レプリケーション用のインスタンスの作成前にCloudSQLが置かれるVPCを作成しておきたいため一度仮のCloudSQLを立ち上げて起きます。VPCが作られたあとは作ったインスタンスは不要になるため削除します。(別の方法が有りましたら教えて下さい。)
↓が作られる
8. CloudSQLのネットワークにAWSへのルートを伝搬する
CloudSQLからAWSのAurora MySQLへ通信するためには、CloudSQLのVPCへAWSへのルートが設定されている必要があります。そこで、作成されたVPC Peeringの設定から「Export custom routes」を有効にする必要があります。「Export custom routes」を指定することでCloudSQL側のVPCへルートが伝搬されます。また、CloudSQL側のVPC Peeringの設定で「Import custom routes」が有効になっている必要がありますが、これはデフォルトで有効になっているようでした。
9. AWSへCloudSQLへのルートを伝搬させる
今度はCloudSQLへのルートをAWSへ伝搬させます。これは、Cloud Routerの設定に伝搬させたいCIDRをCUSTOM IP RANGESに指定することで伝搬させることができます。
resource "google_compute_router" "router" { name = "router" network = google_compute_network.vpc.id bgp { asn = var.router_google_asn advertise_mode = "CUSTOM" advertised_groups = ["ALL_SUBNETS"] } advertised_ip_ranges { range = "10.165.2.0/24" } region = "asia-northeast1" }9. AuroraにCNAMEを貼る
CloudSQLのレプリケーションを作成する場合の制約として、host名を60文字以内にする必要があります。ただし、Auroraの書き込みエンドポイントのhost名は大体の場合60文字を超えてしまいます。そこでAuroraの書き込みエンドポイントへCNAMEを貼って、60文字以内のFQDNを設定します。
10. CloudSQLからレプリケーションする
続いて以下の手順に沿ってレプリケーションを行います。
https://cloud.google.com/sql/docs/mysql/replication/replication-from-external
ただしTerraformがv1.1に対応していないため、ここではv1の手順も混ぜながら構築していきます。
https://cloud.google.com/sql/docs/mysql/replication/replication-from-external_v1
ソース表現インスタンスの作成
まず、ソース表現インスタンスの作成を行います。Terraformでは、host名にFQDNが指定できないためAPIを利用します。
{ "name": "replication-bo-test", "region": "us-central1", "databaseVersion": "MYSQL_5_7", "onPremisesConfiguration": { "hostPort": "hostname:3306" } }ACCESS_TOKEN="$(gcloud auth print-access-token)" curl --header "Authorization: Bearer ${ACCESS_TOKEN}" --header 'Content-Type: application/json' --data @./external_mysql.json -X POST https://www.googleapis.com/sql/v1beta4/projects/{project-name}/instancesレプリケーション用ユーザの作成と初期ダンプ
続いて、Aurora MySQLにてレプリケーション用のユーザの作成します。また、ダンプファイルを作成しGCSへ保存します。やり方についてはドキュメントをご参照ください。
https://cloud.google.com/sql/docs/mysql/replication/replication-from-external
レプリケーション
最後に上記で作成したソース表現インスタンスに対してレプリケーションの作成を行います。
resource "google_sql_database_instance" "replica-instance" { name = "replica-instance" # TODO database_version = "MYSQL_5_7" master_instance_name = "replication" # TODO region = "us-central1" replica_configuration { failover_target = false username = "repuser" password = "password" dump_file_path = "gs://bucket/dump.sql.gz" } settings { tier = "db-n1-standard-1" database_flags { name = "character_set_server" value = "utf8mb4" } ip_configuration { private_network = google_compute_network.vpc.id } } }まとめ
以上のようにインターナル通信でAurora MySQLからCloudSQLへレプリする方法について紹介しました。GCPのネットワークは知らないとハマりどころが多いので参考になれば幸いです。
参考
以下の記事を参考にさせていただきました。ありがとうございあました!!
- 投稿日:2020-12-16T18:49:58+09:00
【MySQL】テーブルを丸ごとバックアップする
やりたいこと
テーブルの中の情報も含めて、同じテーブル(バックアップ用)を作成すること
SQL
既存のテーブル→「info」
新規のテーブル→「info_bk」/*1.テーブル定義を複製する*/ CREATE TABLE info_bk LIKE info; /*2.複製したテーブル定義を確認する*/ show full columns from info_bk; /*3.既存テーブルのデータを新規テーブルに挿入する*/ INSERT INTO info_bk SELECT * FROM info; /*4.新規テーブルの中身を確認する*/ select * from info_bk;解説
1.テーブル定義を複製する CREATE TABLE info_bk LIKE info;
[infoテーブル]をもとに、新しく[info_bk]という箱が作成されます。中身のデータは入っていませんが、インデックスやプライマリーキーなどもコピーして作成されます。
以下のSQLを使うと、データの移行も含めて、新しいテーブルができますが、インデックスやプライマリーキー、デフォルト値は再設定が必要になります。
CREATE TABLE info_bk SELECT * FROM info;3.既存テーブルのデータを新規テーブルに挿入する INSERT INTO info_bk SELECT * FROM info;
[info]テーブルのデータを、[info_bk]テーブルの中に追加できます。VALUESをselectの前に書きたくなってしまいますが、このinsert文については、VALUESは必要ありません。
info_bkとinfoのカラムの数が一致する必要があります。(1でテーブルを複製しているので、カラム数は一致していますね。)以上です!
最後まで読んでいただいた方、ありがとうございました。
- 投稿日:2020-12-16T16:27:13+09:00
SQL概要
目的
SQLの理解が薄いため言語化し定着に勤めたいと思います。
SQLとは
RDBの操作を行うための言語。
RDB
(リレーショナルデータベース)表形式でデータを管理する、データベースです。カラムやレコードがある。
RDBMS
(RDBマネジメント・システム)RDBを使用する際、それを管理するシステム。
MYSQL
RDBMSの1つです。特徴:拡張機能が多い。:小規模から大規模のデータも取り扱いが可能。:柔軟性が高い。
SQLはデータベースやテーブルに対して様々な命令を行いますが、その命令は大きく分けて3つです。
データを定義するDDL
(Data Definition Language)
データを操作するDML
(Data Manipulation Language)
データを制御するDCL
(Data Control Language)
DDLのできること
CREATE(データベースやテーブルの設定)
ALTER(データベースやテーブルの更新)
DROP(データベースやテーブルの削除)
DMLのできること
INSERT(データの登録)
UPDATE(データの更新)
DELETE(データの削除)
SELECT(データの検索)
DCLのできること
COMMIT(DBの変更の確定)
ROLLBACK(DBの変更の取り消し)
GRANT(ユーザーに操作権限を付与)
REVOKE(ユーザーの操作権限を無効化)SQLはどのような種類のRDBに対しても、基本的に同じ文法で操作ができます。なので一つのSQLを学んでしまえば他のRDBを扱う時でもその知識は役立つ事が保証される。
SQLの裏側
SQLにも文法があり、ルールに沿って記述すると「データベースからデータを取得する」事ができる。
(例)投稿一覧ページ(index)には様々な処理がされている。ターミナルでログを確認すると色文字で書かれているところがSQL文です。あくまで例ですがSQL文を見ると
SELECT text FROM tweets;
が書かれており。textは取得したいデータ。tweetsはテーブル名となっている。
なので一覧表示ページには、取得したSQLが表示される。SQLを使用してみる
find_by_sql
=> Ruby on RailsでSQL文を使用し、データを検索し取得する際に使用するメソッドです。def index #@tweets = Tweet.includes(:user).order("created_at DESC") query = "SELECT * FROM tweets" @tweets = Tweet.find_by_sql(query) end
"SELECT * FROM tweets"
tweetテーブルからすべてのレコードを取得するSQLなのでTweet.allと同義となる。
このように、SQLを直接記述することでテーブルからデータを取得できました。
- 投稿日:2020-12-16T02:39:22+09:00
Railsで、"Mysql2::Error: Operand should contain 1 column(s) " エラーが出た際の対処法
みなさんこんにちは、@ryosk7です。
状況
さくっと本題から入ります。
Mysql2::Error: Operand should contain 1 column(s)このようなエラーが出た場合の対処法です。
状況としては、
user_ids = @current_user.sample_contents.pluck(:to_user_id) @samples = SampleModel.where(' (user_id = ? and status = ?) or (user_id = ? and status is not null)', user_ids, SampleModel.statuses[:open], @current_user.id) .order(id: "DESC")このようなコードを書いた際に出力されました。
解決方法
こちらです。
user_ids = @current_user.sample_contents.pluck(:to_user_id) @samples = SampleModel.where(' (user_id = ? and status = ?) or (user_id = ? and status is not null)', user_ids.join(","), SampleModel.statuses[:open], @current_user.id) .order(id: "DESC")違いにお気づきでしょうか。
配列をカンマで連結した文字列に変えています。
user_ids.join(",")原因
Active Recordを利用した場合なら、user_idに配列のまま渡しても問題なく認識されますが、
SQL上でも同じようにやっていたことが原因でした。
単一の値であれば問題ないですが、複数の値であれば、リストにした文字列を渡す必要があります。実際にはこんな感じでSQLが作られます。joinで変換したところはそのままですね。
SQLに強くないので、勉強になりました。SELECT `sample_models`.* FROM `sample_models` WHERE ((user_id = '10,23,55' and status = 0) or (user_id = 14 and status is not null)) ORDER BY `sample_models`.`id` DESC参考記事では、INを使ってクエリを叩いています。
同じように書くと、user_ids = @current_user.sample_contents.pluck(:to_user_id) @samples = SampleModel.where(' (user_id in (?) and status = ?) or (user_id = ? and status is not null)', user_ids.join(","), SampleModel.statuses[:open], @current_user.id) .order(id: "DESC")このようになります。
SQLもINで作成されていますね。
SELECT `sample_models`.* FROM `sample_models` WHERE ((user_id in ('10,23,55') and status = 0) or (user_id = 14 and status is not null)) ORDER BY `sample_models`.`id` DESCどちらも同じ結果が得られます。
参考
https://stackoverflow.com/questions/10012695/sql-statement-using-where-clause-with-multiple-values
- 投稿日:2020-12-16T01:42:12+09:00
MYSQLが起動できない
前書き
作業していると突然画面が固まりMacが再起動した。(原因不明)
その後ポートフォリオを開こうとしたところ
Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)
と表示されてしまい動かなくなってしまった。(正直死んだと思いました)目標
MYSQLに接続する。
解決策
ネットで検索しているとどうやらmysql.sockというMySQLへ接続するためのファイルが突然消えることがあるらしい(少なくとも自分は消えた)
そして先ほどのエラー文を見ると
Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)
翻訳するとこの文の意味はmysql.sockなるファイルが/tmp配下に無いよと言っているようなので作っていきます。1.まずtmpディレクトリに移動します。
cd /tmp2.そしてtouchコマンドで作成していきます。(ここでlsで本当にmysql.sockがないかを確認した方がいいかもです。)
touch mysql.sockあとはサーバーをスタート起動させていきます。
mysql.server startこんな感じになっていれば成功です!!
Starting MySQL . SUCCESS!以上です!
ポートフォリオが全く見れなくなってしまったので本当に焦りました。割とよくあるエラーのようなので自力で解決する経験を得ることができたのは良かったかなとポジティブに考えております。
参考にしたサイト様 https://medium.com/wado-jp/%E3%82%88%E3%81%8F%E3%81%82%E3%82%8Bmysql%E3%82%A8%E3%83%A9%E3%83%BC%E9%9B%86-a6dc33e77a9a