20201216のMySQLに関する記事は9件です。

MySQLの基本操作

はじめに

MySQLの基本操作のメモ(コマンド一覧).

目次

  1. MySQLの起動方法
  2. データベースの操作
  3. テーブルの操作
  4. sqlFileの中身を実行する

起動方法

ターミナル
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のアドレス);
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[MySQL]基本操作

概要

MySQLの基本操作のメモ(コマンド一覧).

目次

  1. MySQLの起動方法
  2. データベースの操作
  3. テーブルの操作
  4. sqlFileの中身を実行する
  5. テーブルをコピーする

起動方法

ターミナル
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 古いテーブル名;
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[MySQL] 基本操作

概要

MySQLの基本操作のメモ(コマンド一覧).

目次

  1. MySQLの起動方法
  2. データベースの操作
  3. テーブルの操作
  4. sqlFileの中身を実行する
  5. テーブルをコピーする

起動方法

ターミナル
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 古いテーブル名;
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQLの使いかた

はじめに

MySQLの基本操作のメモ(コマンド一覧).

目次

  1. MySQLの起動方法
  2. データベースの操作
  3. テーブルの操作
  4. sqlFileの中身を実行する

起動方法

ターミナル
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のアドレス);
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

インターナル通信でAurora MySQLからCloudSQLへレプリケーションする方法

概要

本記事では、AuroraMySQLからCloudSQLへインターナル通信にてレプリケーションする方法を紹介します。GCPのネットワーク周りで結構ハマりましたので参考になればと思います。

手順

1. AWSのVPC並びにGCPのネットワークの作成

まず、AWSとGCPそれぞれでVPCが無いと始まらないのでそれらの作成を行います。なお本記事ではAWS側をCloudFormationで、GCP側をTerrafromにて記述しています。

  • AWS
cfn.yml
Resources:
  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 RDSDBParameterGroup

4. 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"
}

Google_Cloud_Platformのコピー.png

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が作られたあとは作ったインスタンスは不要になるため削除します。(別の方法が有りましたら教えて下さい。)

Create_MySQL_instance_-_zozo-datapool-dev_-_Google_Cloud_Platform.png

↓が作られる

Peering_connection_details_–_VPC_network_–_zozo-datapool-dev_–_Google_Cloud_Platform.png

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"
}

Router_details_–_Hybrid_Connectivity_–_zozo-datapool-dev_–_Google_Cloud_Platform.png

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のネットワークは知らないとハマりどころが多いので参考になれば幸いです。

参考

以下の記事を参考にさせていただきました。ありがとうございあました!!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【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でテーブルを複製しているので、カラム数は一致していますね。)

以上です!

最後まで読んでいただいた方、ありがとうございました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

SQL概要

目的

SQLの理解が薄いため言語化し定着に勤めたいと思います。

SQLとは

RDBの操作を行うための言語。
RDB(リレーショナルデータベース)表形式でデータを管理する、データベースです。カラムやレコードがある。
RDBMS(RDBマネジメント・システム)RDBを使用する際、それを管理するシステム。
MYSQLRDBMSの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を直接記述することでテーブルからデータを取得できました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 /tmp

2.そして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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む