sql >> データベース >  >> RDS >> Mysql

Google Cloud SQLforMySQLをオンプレミスサーバーに移行する

    Google Cloud SQL for MySQLは、Google Cloud PlatformでMySQLリレーショナルデータベースを設定、維持、管理、管理するのに役立つフルマネージドデータベースサービスです。ただし、Cloud SQLと、制限された制御、制限されたリソース、データの局所性、予算、セキュリティなどの標準のMySQL機能には違いがあり、Google Cloud SQLインスタンスから移行して、データベースサービスをオンプレミスでホストする最終決定に影響を与える可能性があります。代わりにオンプレミスインフラストラクチャ。

    このブログ投稿では、GoogleCloudSQLからオンプレミスサーバーへのオンライン移行を実行する方法について説明します。オンプレミスサーバー上のターゲットデータベースはDebianサーバーですが、手順と手順は、パッケージが適切にインストールされている限り、他のバージョンのLinuxにも適用されます。

    Google CloudMySQLインスタンスはMySQL5.7で実行されており、必要なものは次のとおりです。

      マスターで作成されたレプリケーションスレーブユーザー。 スレーブはマスターと同じメジャーバージョンでインストールする必要があります。
    • セキュリティ上の理由から、地理的レプリケーションに対してSSLを有効にする必要があります。

    Google CloudはデフォルトでMySQLのGTIDレプリケーションを有効にしているため、このレプリケーションスキームに基づいて移行を行います。したがって、この投稿で説明されている手順は、MySQL8.0インスタンスでも機能するはずです。

    レプリケーションスレーブユーザーの作成

    まず、GoogleCloudSQLインスタンスでレプリケーションスレーブユーザーを作成する必要があります。 Google CloudPlatformにログイン->データベース->SQL->MySQLインスタンスを選択->ユーザー->ユーザーアカウントを追加し、必要な詳細を入力します:

    202.187.194.255は、オンプレミスにあるスレーブパブリックIPアドレスです。このインスタンスから複製する予定のオンプレミス。ご覧のとおり、このインターフェースから作成されたユーザーは、Google Cloud SQLが提供できる最高の特権(SUPERとFILEを除くほとんどすべて)を持つため、特権の構成はありません。特権を確認するには、次のコマンドを使用できます。

    mysql> SHOW GRANTS FOR [email protected]\G
    *************************** 1. row ***************************
    Grants for [email protected]: GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, 
    DROP, RELOAD, SHUTDOWN, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, 
    CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, 
    CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, 
    CREATE TABLESPACE ON *.* TO 'slave'@'202.187.194.255' WITH GRANT OPTION

    スレーブユーザーがスレーブとして実行するために必要な権限を持っているようです(REPLICATIONSLAVE)。

    mysqldumpバックアップの作成

    外部のmysqldumpバックアップを作成する前に、パブリックネットワークを介してインスタンスに接続するリスクがあるため、クライアントのSSL証明書を構成する必要があります。これを行うには、「接続」->「SSLクライアント証明書の構成」->「クライアント証明書の作成」に移動します。

    上記のファイル(server-ca.pem、client-cert)をダウンロードします。 pemおよびclient-key.pem)を作成し、それらをスレーブサーバー内に保存します。これらの証明書を使用して、スレーブサーブからマスターに安全に接続します。プロセスを簡素化するために、上記のすべての証明書とキーファイルは「gcloud-certs」というディレクトリに配置されます:

    $ mkdir -p /root/gcloud-certs # put the certs/key here

    権限、特に秘密鍵ファイルclient-key.pemが正しいことを確認してください:

    $ chmod 600 /root/gcloud-certs/client-key.pem

    これで、Google Cloud SQLMySQL5.7インスタンスからmysqldumpバックアップを安全に取得する準備が整いました。

    $ mysqldump -uroot -p \
    -h 35.198.197.171 \
    --ssl-ca=/root/gcloud-certs/server-ca.pem \
    --ssl-cert=/root/gcloud-certs/client-cert.pem \
    --ssl-key=/root/gcloud-certs/client-key.pem \
    --single-transaction \
    --all-databases \
    --triggers \
    --routines > fullbackup.sql
    次の警告が表示されます:

    "警告:GTIDを持つサーバーからの部分的なダンプには、デフォルトで、データベースの抑制された部分を変更したトランザクションも含め、すべてのトランザクションのGTIDが含まれます。 GTIDを復元するには、-set-gtid-purged =OFFを渡します。完全なダンプを作成するには、-all-databases --triggers--routines--eventsを渡します。"

    上記の警告は、SUPER特権を必要とする--eventsフラグの定義をスキップしたために発生します。すべてのGoogleCloudSQLインスタンス用に作成されたrootユーザーには、FILEおよびSUPER権限が付属していません。これは、このメソッドを使用することの欠点の1つであり、MySQLイベントをGoogleCloudSQLからインポートできないことです。

    スレーブサーバーの構成

    スレーブサーバーに、Debian10用のMySQL5.7をインストールします。

    $ echo 'deb http://repo.mysql.com/apt/debian/ buster mysql-5.7' > /etc/apt/sources.list.d/mysql.list
    $ apt-key adv --keyserver pgp.mit.edu --recv-keys 5072E1F5
    $ apt update
    $ apt -y install mysql-community-server

    次に、/ etc / mysql / my.cnf(またはその他の関連するMySQL構成ファイル)内の[mysqld]セクションの下に次の行を追加します。

    server-id = 1111 # different value than the master
    log_bin = binlog
    log_slave_updates = 1
    expire_logs_days = 7
    binlog_format = ROW
    gtid_mode = ON
    enforce_gtid_consistency = 1
    sync_binlog = 1
    report_host = 202.187.194.255 # IP address of this slave

    MySQLサーバーを再起動して、上記の変更を適用します。

    $ systemctl restart mysql
    このサーバーでmysqldumpバックアップを復元します:

    $ mysql -uroot -p < fullbackup.sql

    この時点で、スレーブサーバーのMySQLルートパスワードはGoogleCloudSQLのパスワードと同じである必要があります。今後は別のrootパスワードでログインする必要があります。

    GoogleCloudのrootユーザーには完全な権限がないことに注意してください。このサーバーをより詳細に制御できるため、rootユーザーがMySQL内のすべての特権を持つことを許可することにより、スレーブ側でいくつかの変更を加える必要があります。これを行うには、MySQLのユーザーテーブルを更新する必要があります。 MySQLルートユーザーとしてスレーブのMySQLサーバーにログインし、次のステートメントを実行します。

    mysql> UPDATE mysql.user SET Super_priv = 'Y', File_priv = 'Y' WHERE User = 'root';
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0

    特権テーブルをフラッシュします:

    mysql> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0.00 sec)

    現在のターミナルを終了し、再度ログインします。次のコマンドを実行して、rootユーザーが最高レベルの権限を持っていることを確認します。

    mysql> SHOW GRANTS FOR [email protected];
    +---------------------------------------------------------------------+
    | Grants for [email protected]                                           |
    +---------------------------------------------------------------------+
    | GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
    +---------------------------------------------------------------------+

    レプリケーションリンクの設定

    セキュリティ上の理由から、レプリケーションスレーブユーザーはSSL暗号化チャネルを介してマスターホスト(Google Cloudインスタンス)に接続する必要があります。したがって、SSLキーと証明書を正しい権限で準備し、mysqlユーザーがアクセスできるようにする必要があります。 gcloudディレクトリを/etc/ mysqlにコピーし、正しい権限と所有権を割り当てます:

    $ mkdir -p /etc/mysql
    $ cp /root/gcloud-certs /etc/mysql
    $ chown -Rf mysql:mysql /etc/mysql/gcloud-certs

    スレーブサーバーで、レプリケーションリンクを次のように構成します。

    mysql> CHANGE MASTER TO MASTER_HOST = '35.198.197.171', 
    MASTER_USER = 'slave', 
    MASTER_PASSWORD = 'slavepassword', 
    MASTER_AUTO_POSITION = 1, 
    MASTER_SSL = 1, 
    MASTER_SSL_CERT = '/etc/mysql/gcloud-certs/client-cert.pem', 
    MASTER_SSL_CA = '/etc/mysql/gcloud-certs/server-ca.pem', 
    MASTER_SSL_KEY = '/etc/mysql/gcloud-certs/client-key.pem';

    次に、レプリケーションスレーブを開始します:

    mysql> START SLAVE;

    次のように出力を確認します。

    mysql> SHOW SLAVE STATUS\G
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 35.198.197.171
                      Master_User: slave
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000003
              Read_Master_Log_Pos: 1120160
                   Relay_Log_File: puppet-master-relay-bin.000002
                    Relay_Log_Pos: 15900
            Relay_Master_Log_File: mysql-bin.000003
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
                  Replicate_Do_DB:
              Replicate_Ignore_DB:
               Replicate_Do_Table:
           Replicate_Ignore_Table:
          Replicate_Wild_Do_Table:
      Replicate_Wild_Ignore_Table:
                       Last_Errno: 0
                       Last_Error:
                     Skip_Counter: 0
              Exec_Master_Log_Pos: 1120160
                  Relay_Log_Space: 16115
                  Until_Condition: None
                   Until_Log_File:
                    Until_Log_Pos: 0
               Master_SSL_Allowed: Yes
               Master_SSL_CA_File: /etc/mysql/gcloud-certs/server-ca.pem
               Master_SSL_CA_Path:
                  Master_SSL_Cert: /etc/mysql/gcloud-certs/client-cert.pem
                Master_SSL_Cipher:
                   Master_SSL_Key: /etc/mysql/gcloud-certs/client-key.pem
            Seconds_Behind_Master: 0
    Master_SSL_Verify_Server_Cert: No
                    Last_IO_Errno: 0
                    Last_IO_Error:
                   Last_SQL_Errno: 0
                   Last_SQL_Error:
      Replicate_Ignore_Server_Ids:
                 Master_Server_Id: 2272712871
                      Master_UUID: 8539637e-14d1-11eb-ae3c-42010a94001a
                 Master_Info_File: /var/lib/mysql/master.info
                        SQL_Delay: 0
              SQL_Remaining_Delay: NULL
          Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
               Master_Retry_Count: 86400
                      Master_Bind:
          Last_IO_Error_Timestamp:
         Last_SQL_Error_Timestamp:
                   Master_SSL_Crl:
               Master_SSL_Crlpath:
               Retrieved_Gtid_Set: 8539637e-14d1-11eb-ae3c-42010a94001a:5611-5664
                Executed_Gtid_Set: 8539637e-14d1-11eb-ae3c-42010a94001a:1-5664,
    b1dabe58-14e6-11eb-840f-0800278dc04d:1-2
                    Auto_Position: 1
             Replicate_Rewrite_DB:
                     Channel_Name:
               Master_TLS_Version:

    Slave_IO_RunningとSlave_SQL_Runningの値が「Yes」であり、Seconds_Behind_Masterが0であることを確認します。これは、スレーブがマスターに追いついたことを意味します。 Executed_Gtid_Setには2つのGTIDがあることに注意してください。

    • 8539637e-14d1-11eb-ae3c-42010a94001a:1-5664
    • b1dabe58-14e6-11eb-840f-0800278dc04d:1-2

    最初のGTIDは、現在のマスター(Google Cloud SQLインスタンス)からの変更を表し、2番目のGTIDは、スレーブホスト上のMySQLrootユーザーの権限を変更したときに行った変更を表します。最初のGTIDに注意して、データベースが正しく複製されているかどうかを確認します(整数部分は複製中に増分する必要があります)。

    マスターの観点から、スレーブホストがレプリケーションの一部であるかどうかを確認します。 rootとしてSQLCloudインスタンスにログインします:

    $ mysql -uroot -p \
    -h 35.198.197.171 \
    --ssl-ca=/root/gcloud-certs/server-ca.pem \
    --ssl-cert=/root/gcloud-certs/client-cert.pem \
    --ssl-key=/root/gcloud-certs/client-key.pem

    そして、次のステートメントを実行します:

    mysql> SHOW SLAVE HOSTS;
    *************************** 1. row ***************************
     Server_id: 1111
          Host: 202.187.194.255
          Port: 3306
     Master_id: 2272712871
    Slave_UUID: b1dabe58-14e6-11eb-840f-0800278dc04d

    この時点で、データベースワークロードをアプリケーションからこのスレーブサーバーに新しいマスターとしてリダイレクトし、GoogleCloudの古いマスターを廃止する次の動きを計画できます。

    最終的な考え

    Google Cloud SQLforMySQLからオンプレミスサーバーへのオンライン移行を簡単に実行できます。これにより、適切な時期が来たときにプライバシーと制御のためにデータベースをクラウドベンダーの外に移動することができます。


    1. OracleApplicationsR12でステージングされたAPPL_TOP

    2. Oracleはnullと空の文字列を区別していませんか?

    3. SQL Serverでのdatetime2とdatetimeoffsetの違い:違いは何ですか?

    4. ビューで使用されるPostgreSQL列を変更する