レプリケーション
以下のストアドプロシージャは、トランザクションが外部データベースから RDS for MySQL、または RDS for MySQL から外部データベースに複製される方法を制御します。RDS for MySQL でグローバルトランザクション ID (GTID) に基づいてレプリケーションを使用する方法については、「Amazon RDS for MySQL の GTID ベースレプリケーションを使用する」を参照してください。
トピック
- mysql.rds_import_binlog_ssl_material
- mysql.rds_next_master_log
- mysql.rds_remove_binlog_ssl_material
- mysql.rds_reset_external_master
- mysql.rds_set_external_master
- mysql.rds_set_external_master_with_auto_position
- mysql.rds_set_external_master_with_delay
- mysql.rds_set_master_auto_position
- mysql.rds_set_source_delay
- mysql.rds_skip_transaction_with_gtid
- mysql.rds_skip_repl_error
- mysql.rds_start_replication
- mysql.rds_start_replication_until
- mysql.rds_start_replication_until_gtid
- mysql.rds_stop_replication
mysql.rds_import_binlog_ssl_material
認証局証明書、クライアント証明書、およびクライアントキーを RDS for MySQL DB インスタンスにインポートします。この情報は SSL 通信および暗号化レプリケーションに必要です。
構文
CALL mysql.rds_import_binlog_ssl_material (
ssl_material
);
パラメータ
-
ssl_material
-
MySQL クライアント用の以下の .pem 形式のコンテンツを含む JSON ペイロード。
-
"ssl_ca":"
認証局証明書
" -
"ssl_cert":"
クライアント証明書
" -
"ssl_key":"
クライアントキー
"
-
使用に関する注意事項
この手順を実行する前に、暗号化レプリケーションを準備します。
-
外部の MySQL 出典データベースインスタンスで有効になった SSL がなく、またクライアントキーおよびクライアント証明書が準備されていない場合、MySQL データベースサーバーで SSL を有効にし、必要なクライアントキーおよびクライアントの証明書を生成します。
-
SSL が外部ソースデータベースインスタンスで有効になっている場合RDS for MySQL DB インスタンスにクライアントキーおよび証明書を提供します。これらがない場合、RDS for MySQL DB インスタンス用に新しいキーと証明書を生成します。クライアント証明書に署名するには、外部の MySQL 出典データベースインスタンスで SSL の設定に使用した認証局キーが必要です。
詳細については、MySQL ドキュメントの「Creating SSL Certificates and Keys Using openssl
重要
暗号化レプリケーションをじゅんびしたら、SSL 接続を使用してこの手順を実行します。クライアントのキーは、安全ではない接続で転送するべきではありません。
この手順では、外部の MySQL データベースから SSL 情報を RDS for MySQL DB インスタンスにインポートします。SSL 情報は、RDS for MySQL DB インスタンスの SSL 情報を含んだ .pem 形式のファイルにあります。暗号化されたレプリケーション時、RDS for MySQL DB インスタンスは MySQL データベースサーバーに対するクライアントとして動作します。RDS for MySQL クライアントの証明書およびキーは、.pem 形式のファイルにあります。
上記のファイルからこの情報を正しい JSON ペイロードで ssl_material
パラメータにコピーできます。暗号化レプリケーションをサポートするには、この SSL 情報を RDS for MySQL DB インスタンスにインポートします。
JSON ペイロードは、次のようになります。
'{"ssl_ca":"-----BEGIN CERTIFICATE-----
ssl_ca_pem_body_code
-----END CERTIFICATE-----\n","ssl_cert":"-----BEGIN CERTIFICATE-----ssl_cert_pem_body_code
-----END CERTIFICATE-----\n","ssl_key":"-----BEGIN RSA PRIVATE KEY-----ssl_key_pem_body_code
-----END RSA PRIVATE KEY-----\n"}'
例
次の例では、SSL 情報を RDS for MySQL DB インスタンスにインポートします。.pem 形式ファイルでは、通常の場合、コード本文に例に示されるコード本文より長くなっています。
call mysql.rds_import_binlog_ssl_material( '{"ssl_ca":"-----BEGIN CERTIFICATE----- AAAAB3NzaC1yc2EAAAADAQABAAABAQClKsfkNkuSevGj3eYhCe53pcjqP3maAhDFcvBS7O6V hz2ItxCih+PnDSUaw+WNQn/mZphTk/a/gU8jEzoOWbkM4yxyb/wB96xbiFveSFJuOp/d6RJhJOI0iBXr lsLnBItntckiJ7FbtxJMXLvvwJryDUilBMTjYtwB+QhYXUMOzce5Pjz5/i8SeJtjnV3iAoG/cQk+0FzZ qaeJAAHco+CY/5WrUBkrHmFJr6HcXkvJdWPkYQS3xqC0+FmUZofz221CBt5IMucxXPkX4rWi+z7wB3Rb BQoQzd8v7yeb7OzlPnWOyN0qFU0XA246RA8QFYiCNYwI3f05p6KLxEXAMPLE -----END CERTIFICATE-----\n","ssl_cert":"-----BEGIN CERTIFICATE----- AAAAB3NzaC1yc2EAAAADAQABAAABAQClKsfkNkuSevGj3eYhCe53pcjqP3maAhDFcvBS7O6V hz2ItxCih+PnDSUaw+WNQn/mZphTk/a/gU8jEzoOWbkM4yxyb/wB96xbiFveSFJuOp/d6RJhJOI0iBXr lsLnBItntckiJ7FbtxJMXLvvwJryDUilBMTjYtwB+QhYXUMOzce5Pjz5/i8SeJtjnV3iAoG/cQk+0FzZ qaeJAAHco+CY/5WrUBkrHmFJr6HcXkvJdWPkYQS3xqC0+FmUZofz221CBt5IMucxXPkX4rWi+z7wB3Rb BQoQzd8v7yeb7OzlPnWOyN0qFU0XA246RA8QFYiCNYwI3f05p6KLxEXAMPLE -----END CERTIFICATE-----\n","ssl_key":"-----BEGIN RSA PRIVATE KEY----- AAAAB3NzaC1yc2EAAAADAQABAAABAQClKsfkNkuSevGj3eYhCe53pcjqP3maAhDFcvBS7O6V hz2ItxCih+PnDSUaw+WNQn/mZphTk/a/gU8jEzoOWbkM4yxyb/wB96xbiFveSFJuOp/d6RJhJOI0iBXr lsLnBItntckiJ7FbtxJMXLvvwJryDUilBMTjYtwB+QhYXUMOzce5Pjz5/i8SeJtjnV3iAoG/cQk+0FzZ qaeJAAHco+CY/5WrUBkrHmFJr6HcXkvJdWPkYQS3xqC0+FmUZofz221CBt5IMucxXPkX4rWi+z7wB3Rb BQoQzd8v7yeb7OzlPnWOyN0qFU0XA246RA8QFYiCNYwI3f05p6KLxEXAMPLE -----END RSA PRIVATE KEY-----\n"}');
mysql.rds_next_master_log
出典データベースインスタンスのログの位置を、出典データベースインスタンスの次のバイナリログの先頭に変更します。このプロシージャは、リードレプリカでレプリケーション I/O エラー 1236 が発生した場合にのみ使用してください。
構文
CALL mysql.rds_next_master_log(
curr_master_log
);
パラメータ
-
curr_master_log
-
現在のマスターログファイルのインデックス。例えば、現在のファイルが
mysql-bin-changelog.012345
という名前の場合は、インデックスは 12345 になります。現在のマスターログファイルの名前を調べるには、SHOW REPLICA STATUS
コマンドを実行し、Master_Log_File
フィールドを確認します。注記
MySQL の旧バージョンは、
SHOW SLAVE STATUS
ではなくSHOW REPLICA STATUS
を使用していました。8.0.23 より前の MySQL バージョンを使用している場合は、SHOW SLAVE STATUS
を使用します。
使用に関する注意事項
マスターユーザーが mysql.rds_next_master_log
を実行する必要があります。
警告
mysql.rds_next_master_log
は、レプリケーション出典であるマルチ AZ DB インスタンスのフェイルオーバーの後でレプリケーションが失敗し、Last_IO_Errno
の SHOW REPLICA STATUS
フィールドが I/O エラー 1236 を示している場合にのみ呼び出してください。
mysql.rds_next_master_log
を呼び出すと、フェイルオーバーイベントが発生する前にソースインスタンスのトランザクションがディスク上のバイナリログに書き込まれなかった場合、リードレプリカのデータが失われる可能性があります。
ソースインスタンスのパラメータ sync_binlog
および innodb_support_xa
を 1
に設定することで、このような問題が発生する可能性を減らすことができますが、パフォーマンスが低下する恐れがあります。詳細については、「MySQL リードレプリカに関する問題のトラブルシューティング」を参照してください。
例
RDS for MySQL リードレプリカでレプリケーションが失敗すると仮定します。リードレプリカで SHOW REPLICA STATUS\G
を実行すると、次の結果が返されます。
*************************** 1. row *************************** Replica_IO_State: Source_Host: myhost.XXXXXXXXXXXXXXX.rr-rrrr-1.rds.amazonaws.com Source_User: MasterUser Source_Port: 3306 Connect_Retry: 10 Source_Log_File: mysql-bin-changelog.012345 Read_Source_Log_Pos: 1219393 Relay_Log_File: relaylog.012340 Relay_Log_Pos: 30223388 Relay_Source_Log_File: mysql-bin-changelog.012345 Replica_IO_Running: No Replica_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_Source_Log_Pos: 30223232 Relay_Log_Space: 5248928866 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Source_SSL_Allowed: No Source_SSL_CA_File: Source_SSL_CA_Path: Source_SSL_Cert: Source_SSL_Cipher: Source_SSL_Key: Seconds_Behind_Master: NULL Source_SSL_Verify_Server_Cert: No Last_IO_Errno: 1236 Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Client requested master to start replication from impossible position; the first event 'mysql-bin-changelog.013406' at 1219393, the last event read from '/rdsdbdata/log/binlog/mysql-bin-changelog.012345' at 4, the last byte read from '/rdsdbdata/log/binlog/mysql-bin-changelog.012345' at 4.' Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Source_Server_Id: 67285976
Last_IO_Errno
フィールドはインスタンスが I/O エラー 1236 を受け取ったことを示します。Master_Log_File
フィールドは、ファイル名が mysql-bin-changelog.012345
であることを示しています。これは、ログファイルのインデックスが 12345
であることを表しています。エラーを解決するには、次のパラメータを使用して mysql.rds_next_master_log
を呼び出すことができます。
CALL mysql.rds_next_master_log(12345);
注記
MySQL の旧バージョンは、SHOW SLAVE STATUS
ではなく SHOW REPLICA STATUS
を使用していました。8.0.23 より前の MySQL バージョンを使用している場合は、SHOW SLAVE STATUS
を使用します。
mysql.rds_remove_binlog_ssl_material
SSL 通信と暗号化レプリケーション用の認証局証明書、クライアント証明書およびクライアントキーを削除します。mysql.rds_import_binlog_ssl_material を使用してこの情報をインポートします。
構文
CALL mysql.rds_remove_binlog_ssl_material;
mysql.rds_reset_external_master
RDS for MySQL DB インスタンスを、Amazon RDS の外部で実行している MySQL インスタンスのリードレプリカとして使用しないように再設定します。
重要
この手順を実行するには、autocommit
を有効にする必要があります。これを有効にするには、autocommit
パラメータを 1
に設定します。パラメータの変更については、「DB パラメータグループのパラメータの変更」を参照してください。
構文
CALL mysql.rds_reset_external_master;
使用に関する注意事項
マスターユーザーが mysql.rds_reset_external_master
を実行する必要があります。このプロシージャは、Amazon RDS の外部で動作する MySQL インスタンスのリードレプリカとしての設定が解除される MySQL DB インスタンス上で実行する必要があります。
注記
可能な場合は、2 つの Amazon RDS DB インスタンス間のレプリケーションを管理するために、リードレプリカを使用することをお勧めします。その場合、このプロシージャとレプリケーション関連のストアドプロシージャだけを使用することをお勧めします。これらのプラクティスにより、Amazon RDS DB インスタンス間で、より複雑なレプリケーショントポロジが有効になります。これらのストアドプロシージャは、主に Amazon RDS 外部で実行されている MySQL インスタンスのレプリケーションの有効化のために提供されています。Amazon RDS DB インスタンス間でのレプリケーションの管理の詳細については、「DB インスタンスのリードレプリカの操作」を参照してください。
レプリケーションを使用して、Amazon RDS の外部で動作する MySQL インスタンスからデータをインポートする方法の詳細については、「外部のソースインスタンスを使用したバイナリログファイル位置のレプリケーションの設定」を参照してください。
mysql.rds_set_external_master
RDS for MySQL DB インスタンスを、Amazon RDS の外部で実行している MySQL インスタンスのリードレプリカとして使用するように設定します。
重要
この手順を実行するには、autocommit
を有効にする必要があります。これを有効にするには、autocommit
パラメータを 1
に設定します。パラメータの変更については、「DB パラメータグループのパラメータの変更」を参照してください。
注記
mysql.rds_set_external_master_with_delay ストアドプロシージャを使用して、外部出典データベースインスタンスと遅延レプリケーションを設定できます。
構文
CALL mysql.rds_set_external_master (
host_name
,host_port
,replication_user_name
,replication_user_password
,mysql_binary_log_file_name
,mysql_binary_log_file_location
,ssl_encryption
);
パラメータ
-
host_name
-
出典データベースインスタンスとなる、Amazon RDS の外部で動作する MySQL インスタンスのホスト名または IP アドレス。
-
host_port
-
Amazon RDS の外部で動作する MySQL インスタンス (出典データベースインスタンス) で使用されるポート。ポート番号を変換する Secure Shell (SSH) ポートのレプリケーションがネットワーク設定に含まれる場合、SSH によって発行されるポート番号を指定します。
-
replication_user_name
-
Amazon RDS の外部で実行される MySQL インスタンスの
REPLICATION CLIENT
およびREPLICATION SLAVE
のアクセス許可を持つユーザーの ID。外部インスタンスのレプリケーション専用のアカウントを使用することをお勧めします。 -
replication_user_password
-
replication_user_name
で指定されたユーザー ID のパスワード。 -
mysql_binary_log_file_name
-
レプリケーション情報を含む出典データベースインスタンス上のバイナリログの名前。
-
mysql_binary_log_file_location
-
mysql_binary_log_file_name
バイナリログ内の場所。レプリケーションでは、この場所からレプリケーション情報の読み取りをスタートします。binlog ファイルの名前と場所は、
SHOW MASTER STATUS
出典データベースインスタンス上で実行することによって決定できます。 -
ssl_encryption
-
レプリケーション接続で Secure Socket Layer (SSL) 暗号化を使用するかどうかを指定する値。1 は SSL 暗号化を使用することを指定し、0 は暗号化を使用しないことを指定します。デフォルトは 0 です。
注記
MASTER_SSL_VERIFY_SERVER_CERT
オプションはサポートされていません。このオプションは 0 に設定されます。つまり、接続は暗号化されますが、証明書は検証されません。
使用に関する注意事項
マスターユーザーが mysql.rds_set_external_master
を実行する必要があります。このプロシージャは、Amazon RDS の外部で動作する MySQL インスタンスのリードレプリカとして設定される MySQL DB インスタンス上で実行する必要があります。
mysql.rds_set_external_master
を実行する前に、Amazon RDS の外部で動作する MySQL インスタンスを出典データベースインスタンスとして必ず設定してください。Amazon RDS の外部で動作する MySQL インスタンスに接続するには、MySQL の外部インスタンスの replication_user_name
および replication_user_password
アクセス権限を持つレプリケーションユーザーを示す REPLICATION CLIENT
および REPLICATION SLAVE
の値を指定する必要があります。
MySQL の外部インスタンスを出典データベースインスタンスとして設定するには
選択した MySQL クライアントを使用して、MySQL の外部インスタンスに接続し、レプリケーションに使用されるユーザーアカウントを作成します。次に例を示します。
MySQL 5.7
CREATE USER 'repl_user'@'mydomain.com' IDENTIFIED BY '
password
';MySQL 8.0
CREATE USER 'repl_user'@'mydomain.com' IDENTIFIED WITH mysql_native_password BY '
password
';注記
セキュリティ上のベストプラクティスとして、ここに示されているプロンプト以外のパスワードを指定してください。
-
MySQL の外部インスタンスで、
REPLICATION CLIENT
とREPLICATION SLAVE
の特権をレプリケーションユーザーに付与します。次の例では、ドメインの 「repl_user」ユーザーに、すべてのデータベースのREPLICATION CLIENT
およびREPLICATION SLAVE
特権を付与します。MySQL 5.7
GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user'@'mydomain.com' IDENTIFIED BY '
password
';MySQL 8.0
GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user'@'mydomain.com';
暗号化されたレプリケーションを使用するには、SSL 接続を使用するように出典データベースインスタンスを設定します。また、mysql.rds_import_binlog_ssl_material 手順を使用して、DB インスタンスあるいは DB クラスターに認証局証明書、クライアント証明書およびクライアントキーをインポートします。
注記
可能な場合は、2 つの Amazon RDS DB インスタンス間のレプリケーションを管理するために、リードレプリカを使用することをお勧めします。その場合、このプロシージャとレプリケーション関連のストアドプロシージャだけを使用することをお勧めします。これらのプラクティスにより、Amazon RDS DB インスタンス間で、より複雑なレプリケーショントポロジが有効になります。これらのストアドプロシージャは、主に Amazon RDS 外部で実行されている MySQL インスタンスのレプリケーションの有効化のために提供されています。Amazon RDS DB インスタンス間でのレプリケーションの管理の詳細については、「DB インスタンスのリードレプリカの操作」を参照してください。
mysql.rds_set_external_master
を呼び出して Amazon RDS DB インスタンスをリードレプリカとして設定した後で、このリードレプリカで mysql.rds_start_replication を呼び出してレプリケーションプロセスをスタートできます。mysql.rds_reset_external_master を呼び出して、リードレプリカの設定を削除することもできます。
mysql.rds_set_external_master
が呼び出されると、Amazon RDS では、時刻、ユーザー、set master
アクションが mysql.rds_history
テーブルと mysql.rds_replication_status
テーブルに記録されます。
例
MySQL DB インスタンス上で実行すると、DB インスタンスが Amazon RDS の外部で動作する MySQL インスタンスのリードレプリカとして設定されます。次に例を示します。
call mysql.rds_set_external_master( 'Externaldb.some.com', 3306, 'repl_user', '
password
', 'mysql-bin-changelog.0777', 120, 0);
mysql.rds_set_external_master_with_auto_position
RDS for MySQL DB インスタンスを、Amazon RDS の外部で動作する MySQL インスタンスのリードレプリカとして設定します。このプロシージャは、遅延レプリケーション、および、グローバルトランザクション識別子 (GTID) ベースのレプリケーションも設定します。
重要
この手順を実行するには、autocommit
を有効にする必要があります。これを有効にするには、autocommit
パラメータを 1
に設定します。パラメータの変更については、「DB パラメータグループのパラメータの変更」を参照してください。
構文
CALL mysql.rds_set_external_master_with_auto_position (
host_name
,host_port
,replication_user_name
,replication_user_password
,ssl_encryption
,delay
);
パラメータ
-
host_name
-
出典データベースインスタンスとなる、Amazon RDS の外部で動作する MySQL インスタンスのホスト名または IP アドレス。
-
host_port
-
Amazon RDS の外部で動作する MySQL インスタンス (出典データベースインスタンス) で使用されるポート。ポート番号を変換する Secure Shell (SSH) ポートのレプリケーションがネットワーク設定に含まれる場合、SSH によって発行されるポート番号を指定します。
-
replication_user_name
-
Amazon RDS の外部で実行される MySQL インスタンスの
REPLICATION CLIENT
およびREPLICATION SLAVE
のアクセス許可を持つユーザーの ID。外部インスタンスのレプリケーション専用のアカウントを使用することをお勧めします。 -
replication_user_password
-
replication_user_name
で指定されたユーザー ID のパスワード。 -
ssl_encryption
-
レプリケーション接続で Secure Socket Layer (SSL) 暗号化を使用するかどうかを指定する値。1 は SSL 暗号化を使用することを指定し、0 は暗号化を使用しないことを指定します。デフォルトは 0 です。
注記
MASTER_SSL_VERIFY_SERVER_CERT
オプションはサポートされていません。このオプションは 0 に設定されます。つまり、接続は暗号化されますが、証明書は検証されません。 -
delay
-
出典データベースインスタンスからのレプリケーションを遅延させる最小秒数。
このパラメータの上限は 1 日 (86400 秒) です。
使用に関する注意事項
マスターユーザーが mysql.rds_set_external_master_with_auto_position
を実行する必要があります。このプロシージャは、Amazon RDS の外部で動作する MySQL インスタンスのリードレプリカとして設定される MySQL DB インスタンス上で実行する必要があります。
この手順は すべての RDS for MySQL 5.7 バージョン、RDS for MySQL 8.0.26 以降の 8.0 バージョンでサポートされています。
mysql.rds_set_external_master_with_auto_position
を実行する前に、Amazon RDS の外部で動作する MySQL インスタンスを出典データベースインスタンスとして必ず設定してください。Amazon RDS の外部で実行する MySQL インスタンスに接続するには、replication_user_name
および replication_user_password
の値を指定する必要があります。これらの値は、MySQL の外部インスタンスで、REPLICATION CLIENT
および REPLICATION SLAVE
アクセス権限を持つレプリケーションユーザーを示す必要があります。
MySQL の外部インスタンスを出典データベースインスタンスとして設定するには
選択した MySQL クライアントを使用して、MySQL の外部インスタンスに接続し、レプリケーションに使用されるユーザーアカウントを作成します。次に例を示します。
CREATE USER 'repl_user'@'mydomain.com' IDENTIFIED BY 'SomePassW0rd'
-
MySQL の外部インスタンスで、
REPLICATION CLIENT
とREPLICATION SLAVE
の特権をレプリケーションユーザーに付与します。次の例では、ドメインのREPLICATION CLIENT
ユーザーに、すべてのデータベースのREPLICATION SLAVE
および'repl_user'
特権を付与します。GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user'@'mydomain.com' IDENTIFIED BY 'SomePassW0rd'
詳細については、「外部のソースインスタンスを使用したバイナリログファイル位置のレプリケーションの設定」を参照してください。
注記
可能な場合は、2 つの Amazon RDS DB インスタンス間のレプリケーションを管理するために、リードレプリカを使用することをお勧めします。その場合、このプロシージャとレプリケーション関連のストアドプロシージャだけを使用することをお勧めします。これらのプラクティスにより、Amazon RDS DB インスタンス間で、より複雑なレプリケーショントポロジが有効になります。これらのストアドプロシージャは、主に Amazon RDS 外部で実行されている MySQL インスタンスのレプリケーションの有効化のために提供されています。Amazon RDS DB インスタンス間でのレプリケーションの管理の詳細については、「DB インスタンスのリードレプリカの操作」を参照してください。
mysql.rds_set_external_master_with_auto_position
を呼び出して Amazon RDS DB インスタンスをリードレプリカとして設定した後で、このリードレプリカで mysql.rds_start_replication を呼び出してレプリケーションプロセスをスタートできます。mysql.rds_reset_external_master を呼び出して、リードレプリカの設定を削除することもできます。
mysql.rds_set_external_master_with_auto_position
を呼び出すと、Amazon RDS では、時刻、ユーザー、set master
アクションが mysql.rds_history
テーブルと mysql.rds_replication_status
テーブルに記録されます。
障害復旧のために、このプロシージャを mysql.rds_start_replication_until または mysql.rds_start_replication_until_gtid ストアドプロシージャで使用できます。mysql.rds_set_external_master_with_auto_position
プロシージャを実行して、遅延したリードレプリカへの変更を災害発生直前の時点までロールフォワードできます。mysql.rds_start_replication_until_gtid
でのレプリケーションが停止したら、「リードレプリカをスタンドアロン DB インスタンスに昇格させる」の手順に従ってリードレプリカを新しいプライマリ DB インスタンスに昇格させることができます。
mysql.rds_rds_start_replication_until_gtid
プロシージャを使用するためには、GTID ベースのレプリケーションを有効にする必要があります。障害の原因となることが知られている特定の GTID ベースの処理をスキップするために、mysql.rds_skip_transaction_with_gtid ストアドプロシージャを使用できます。GTID ベースのレプリケーションの使用に関する詳細については、「Amazon RDS for MySQL の GTID ベースレプリケーションを使用する」を参照してください。
例
MySQL DB インスタンス上で実行すると、DB インスタンスが Amazon RDS の外部で動作する MySQL インスタンスのリードレプリカとして設定されます。次に例を示します。この例では、MySQL DB インスタンスでのレプリケーションの最小遅延間隔を 1 時間 (3600 秒) に設定します。Amazon RDS の外部で動作する MySQL 出典データベースインスタンスの変更は、少なくとも 1 時間は MySQL DB インスタンスのリードレプリカに適用されません。
call mysql.rds_set_external_master_with_auto_position( 'Externaldb.some.com', 3306, 'repl_user', 'SomePassW0rd', 0, 3600);
mysql.rds_set_external_master_with_delay
RDS for MySQL DB インスタンスを、Amazon RDS の外部で動作する MySQL インスタンスのリードレプリカとして設定し、さらに遅延レプリケーションを設定します。
重要
この手順を実行するには、autocommit
を有効にする必要があります。これを有効にするには、autocommit
パラメータを 1
に設定します。パラメータの変更については、「DB パラメータグループのパラメータの変更」を参照してください。
構文
CALL mysql.rds_set_external_master_with_delay (
host_name
,host_port
,replication_user_name
,replication_user_password
,mysql_binary_log_file_name
,mysql_binary_log_file_location
,ssl_encryption
,delay
);
パラメータ
-
host_name
-
Amazon RDS の外部で動作する MySQL インスタンス (出典データベースインスタンス) のホスト名または IP アドレス。
-
host_port
-
Amazon RDS の外部で動作する MySQL インスタンス (出典データベースインスタンス) で使用されるポート。ポート番号を変換する SSH ポートのレプリケーションがネットワーク設定に含まれる場合、SSH によって公開されるポート番号を指定します。
-
replication_user_name
-
Amazon RDS の外部で実行される MySQL インスタンスの
REPLICATION CLIENT
およびREPLICATION SLAVE
のアクセス許可を持つユーザーの ID。外部インスタンスのレプリケーション専用のアカウントを使用することをお勧めします。 -
replication_user_password
-
replication_user_name
で指定されたユーザー ID のパスワード。 -
mysql_binary_log_file_name
-
出典データベースインスタンスのバイナリログの名前には、レプリケーション情報が含まれています。
-
mysql_binary_log_file_location
-
mysql_binary_log_file_name
バイナリログ内の場所。レプリケーションでは、この場所からレプリケーション情報の読み取りをスタートします。binlog ファイルの名前と場所は、
SHOW MASTER STATUS
出典データベースインスタンス上で実行することによって決定できます。 -
ssl_encryption
-
レプリケーション接続で Secure Socket Layer (SSL) 暗号化を使用するかどうかを指定する値。1 は SSL 暗号化を使用することを指定し、0 は暗号化を使用しないことを指定します。デフォルトは 0 です。
注記
MASTER_SSL_VERIFY_SERVER_CERT
オプションはサポートされていません。このオプションは 0 に設定されます。つまり、接続は暗号化されますが、証明書は検証されません。 -
delay
-
出典データベースインスタンスからのレプリケーションを遅延させる最小秒数。
このパラメータの上限は 1 日 (86400 秒) です。
使用に関する注意事項
マスターユーザーが mysql.rds_set_external_master_with_delay
を実行する必要があります。このプロシージャは、Amazon RDS の外部で動作する MySQL インスタンスのリードレプリカとして設定される MySQL DB インスタンス上で実行する必要があります。
mysql.rds_set_external_master_with_delay
を実行する前に、Amazon RDS の外部で動作する MySQL インスタンスを出典データベースインスタンスとして必ず設定してください。Amazon RDS の外部で実行する MySQL インスタンスに接続するには、replication_user_name
および replication_user_password
の値を指定する必要があります。これらの値は、MySQL の外部インスタンスで、REPLICATION CLIENT
および REPLICATION SLAVE
アクセス権限を持つレプリケーションユーザーを示す必要があります。
MySQL の外部インスタンスを出典データベースインスタンスとして設定するには
-
選択した MySQL クライアントを使用して、MySQL の外部インスタンスに接続し、レプリケーションに使用されるユーザーアカウントを作成します。次に例を示します。
CREATE USER 'repl_user'@'mydomain.com' IDENTIFIED BY 'SomePassW0rd'
-
MySQL の外部インスタンスで、
REPLICATION CLIENT
とREPLICATION SLAVE
の特権をレプリケーションユーザーに付与します。次の例では、ドメインのREPLICATION CLIENT
ユーザーに、すべてのデータベースのREPLICATION SLAVE
および'repl_user'
特権を付与します。GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user'@'mydomain.com' IDENTIFIED BY 'SomePassW0rd'
詳細については、「外部のソースインスタンスを使用したバイナリログファイル位置のレプリケーションの設定」を参照してください。
注記
可能な場合は、2 つの Amazon RDS DB インスタンス間のレプリケーションを管理するために、リードレプリカを使用することをお勧めします。その場合、このプロシージャとレプリケーション関連のストアドプロシージャだけを使用することをお勧めします。これらのプラクティスにより、Amazon RDS DB インスタンス間で、より複雑なレプリケーショントポロジが有効になります。これらのストアドプロシージャは、主に Amazon RDS 外部で実行されている MySQL インスタンスのレプリケーションの有効化のために提供されています。Amazon RDS DB インスタンス間でのレプリケーションの管理の詳細については、「DB インスタンスのリードレプリカの操作」を参照してください。
mysql.rds_set_external_master_with_delay
を呼び出して Amazon RDS DB インスタンスをリードレプリカとして設定した後で、このリードレプリカで mysql.rds_start_replication を呼び出してレプリケーションプロセスをスタートできます。mysql.rds_reset_external_master を呼び出して、リードレプリカの設定を削除することもできます。
mysql.rds_set_external_master_with_delay
を呼び出すと、Amazon RDS では、時刻、ユーザー、set master
アクションが mysql.rds_history
テーブルと mysql.rds_replication_status
テーブルに記録されます。
障害復旧のために、このプロシージャを mysql.rds_start_replication_until または mysql.rds_start_replication_until_gtid ストアドプロシージャで使用できます。mysql.rds_set_external_master_with_delay
プロシージャを実行して、遅延したリードレプリカへの変更を災害発生直前の時点までロールフォワードできます。mysql.rds_start_replication_until
でのレプリケーションが停止したら、「リードレプリカをスタンドアロン DB インスタンスに昇格させる」の手順に従ってリードレプリカを新しいプライマリ DB インスタンスに昇格させることができます。
mysql.rds_rds_start_replication_until_gtid
プロシージャを使用するためには、GTID ベースのレプリケーションを有効にする必要があります。障害の原因となることが知られている特定の GTID ベースの処理をスキップするために、mysql.rds_skip_transaction_with_gtid ストアドプロシージャを使用できます。GTID ベースのレプリケーションの使用に関する詳細については、「Amazon RDS for MySQL の GTID ベースレプリケーションを使用する」を参照してください。
mysql.rds_set_external_master_with_delay
プロシージャは、以下のバージョンの RDS for MySQL で利用できます。
-
MySQL のバージョン 8.0 (8.0.26 以降)
-
すべての 5.7 バージョン
例
MySQL DB インスタンス上で実行すると、DB インスタンスが Amazon RDS の外部で動作する MySQL インスタンスのリードレプリカとして設定されます。次に例を示します。この例では、MySQL DB インスタンスでのレプリケーションの最小遅延間隔を 1 時間 (3600 秒) に設定します。Amazon RDS の外部で動作する MySQL 出典データベースインスタンスの変更は、少なくとも 1 時間は MySQL DB インスタンスのリードレプリカに適用されません。
call mysql.rds_set_external_master_with_delay( 'Externaldb.some.com', 3306, 'repl_user', 'SomePassW0rd', 'mysql-bin-changelog.000777', 120, 0, 3600);
mysql.rds_set_master_auto_position
バイナリログファイルの位置、または、グローバルトランザクション識別子 (GTID) ベースのレプリケーションモードを設定します。
構文
CALL mysql.rds_set_master_auto_position (
auto_position_mode
);
パラメータ
-
auto_position_mode
-
ファイルの位置に基づくレプリケーション、または GTID ベースのレプリケーションかどうかを示す値:
-
0
- バイナリログファイルの位置に基づくレプリケーション方法を使用します。デフォルト:0
。 -
1
- GTID ベースのレプリケーション方法を使用します。
-
使用に関する注意事項
マスターユーザーが mysql.rds_set_master_auto_position
を実行する必要があります。
この手順は すべての RDS for MySQL 5.7 バージョン、RDS for MySQL 8.0.26 以降の 8.0 バージョンでサポートされています。
mysql.rds_set_source_delay
出典データベースインスタンスから現在のリードレプリカへのレプリケーションを遅延させる最小秒数を設定します。出典データベースインスタンスからのレプリケーションを遅延させるリードレプリカに接続している場合に、このプロシージャを使用します。
構文
CALL mysql.rds_set_source_delay(
delay
);
パラメータ
-
delay
-
出典データベースインスタンスからのレプリケーションを遅延させる最小秒数。
このパラメータの上限は 1 日 (86400 秒) です。
使用に関する注意事項
マスターユーザーが mysql.rds_set_source_delay
を実行する必要があります。
障害復旧のために、このプロシージャを mysql.rds_start_replication_until ストアドプロシージャ、または、mysql.rds_start_replication_until_gtid ストアドプロシージャで使用できます。mysql.rds_set_source_delay
プロシージャを実行して、遅延したリードレプリカへの変更を災害発生直前の時点までロールフォワードできます。mysql.rds_start_replication_until
、または mysql.rds_start_replication_until_gtid
プロシージャによりレプリケーションが停止したら、「リードレプリカをスタンドアロン DB インスタンスに昇格させる」の手順に従ってリードレプリカを新しいプライマリ DB インスタンスに昇格させることができます。
mysql.rds_rds_start_replication_until_gtid
プロシージャを使用するためには、GTID ベースのレプリケーションを有効にする必要があります。障害の原因となることが知られている特定の GTID ベースの処理をスキップするために、mysql.rds_skip_transaction_with_gtid ストアドプロシージャを使用できます。GTID ベースのレプリケーションの詳細については、「Amazon RDS for MySQL の GTID ベースレプリケーションを使用する」を参照してください。
mysql.rds_set_source_delay
プロシージャは、以下のバージョンの RDS for MySQL で利用できます。
-
MySQL のバージョン 8.0 (8.0.26 以降)
-
すべての 5.7 バージョン
例
出典データベースインスタンスから現在のリードレプリカへのレプリケーションを少なくとも 1 時間 (3600 秒) 遅延させるには、次のパラメータを使用して mysql.rds_set_source_delay
を呼び出すことができます。
CALL mysql.rds_set_source_delay(3600);
mysql.rds_skip_transaction_with_gtid
MySQL DB インスタンスで、指定されたグローバルトランザクション識別子 (GTID) のあるトランザクションのレプリケーションをスキップします。
特定の GTID トランザクションが問題の原因となることが知られている場合、障害復旧のためにこのプロシージャを使用できます。このストアドプロシージャを使用して、問題となるトランザクションをスキップします。問題のあるトランザクションの例には、レプリケーションを無効にしたり、重要なデータを削除したり、DB インスタンスを利用不可にするトランザクションが含まれます。
構文
CALL mysql.rds_skip_transaction_with_gtid (
gtid_to_skip
);
パラメータ
-
gtid_to_skip
-
スキップするレプリケーショントランザクションの GTID。
使用に関する注意事項
マスターユーザーが mysql.rds_skip_transaction_with_gtid
を実行する必要があります。
この手順は すべての RDS for MySQL 5.7 バージョン、RDS for MySQL 8.0.26 以降の 8.0 バージョンでサポートされています。
例
次の例では、GTID 3E11FA47-71CA-11E1-9E33-C80AA9429562:23
を使用したトランザクションのレプリケーションをスキップします。
call mysql.rds_skip_transaction_with_gtid('3E11FA47-71CA-11E1-9E33-C80AA9429562:23');
mysql.rds_skip_repl_error
MySQL DB リードレプリカのレプリケーションエラーをスキップして、削除します。
構文
CALL mysql.rds_skip_repl_error;
使用に関する注意事項
マスターユーザーはリードレプリカに対して mysql.rds_skip_repl_error
プロシージャを実行する必要があります。この手順の詳細については、「mysql.rds_skip_repl_error の手順を呼び出します。」(現在のレプリケーションエラーをスキップする) を参照してください。
MySQL の SHOW REPLICA STATUS\G
コマンドを実行して、エラーがあるかどうかを判断します。レプリケーションエラーが重要ではない場合、mysql.rds_skip_repl_error
を実行して、エラーをスキップすることができます。複数のエラーがある場合、mysql.rds_skip_repl_error
では、初期のエラーを削除してから、他のエラーが存在することを警告します。その後で SHOW REPLICA STATUS\G
を使用して、次のエラーに対処するための適切な対応方法を判断することができます。戻り値の詳細については、MySQL ドキュメントの「SHOW REPLICA STATUS statement
注記
MySQL の旧バージョンは、SHOW SLAVE STATUS
ではなく SHOW REPLICA STATUS
を使用していました。8.0.23 より前の MySQL バージョンを使用している場合は、SHOW SLAVE STATUS
を使用します。
Amazon RDS でのレプリケーションエラーの対処方法の詳細については「MySQL リードレプリカに関する問題のトラブルシューティング」を参照してください。
レプリケーション停止エラー
mysql.rds_skip_repl_error
プロシージャを呼び出すと、レプリカがダウンしているか無効であることを示すエラーメッセージが表示されることがあります。
このエラーメッセージは、リードレプリカではなくプライマリインスタンスでプロシージャを実行した場合に表示されます。このプロシージャを機能させるには、リードレプリカに対してこのプロシージャを実行する必要があります。
このエラーメッセージは、リードレプリカに対してプロシージャを実行したが、レプリケーションを正常に再開できない場合にも表示されることがあります。
多数のエラーをスキップする必要がある場合は、レプリケーションの遅延により、バイナリログ (binlog) ファイルがデフォルトの保持期間を超えて増大する場合があります。この場合、バイナリログファイルがリードレプリカで再生される前に破棄されるため、致命的なエラーが発生することがあります。この破棄によりレプリケーションが停止し、mysql.rds_skip_repl_error
コマンドを呼び出してレプリケーションエラーをスキップすることができなくなります。
この問題は、出典データベースインスタンスでバイナリログファイルの保持時間を増加させることで軽減できます。バイナリログ保持時間を長くすると、レプリケーションを再開し、必要に応じて mysql.rds_skip_repl_error
コマンドを使用できるようになります。
バイナリログの保持期間を設定するには、「mysql.rds_set_configuration」の手順を使用して、DB クラスターのバイナリログファイルの保持期間に合わせて、'binlog
retention hours'
の設定パラメータを指定します。以下の例では、バイナリログファイルの保持期間を 48 時間に設定しています。
CALL mysql.rds_set_configuration('binlog retention hours', 48);
mysql.rds_start_replication
RDS for MySQL DB インスタンスからのレプリケーションを開始します。
注記
mysql.rds_start_replication_until または mysql.rds_start_replication_until_gtid ストアドプロシージャを使用して、RDS for MySQL DB インスタンスからのレプリケーションを開始し、指定したバイナリログファイルの場所でレプリケーションを停止できます。
構文
CALL mysql.rds_start_replication;
使用に関する注意事項
マスターユーザーが mysql.rds_start_replication
を実行する必要があります。
Amazon RDS の外部の MySQL インスタンスからデータをインポートするには、mysql.rds_set_external_master
を呼び出してレプリケーション設定を構築した後、リードレプリカに対して mysql.rds_start_replication
を呼び出して、レプリケーションプロセスを開始します。詳細については、「MySQL DB インスタンスへのバックアップの復元」を参照してください。
Amazon RDS の外部の MySQL インスタンスにデータをエクスポートするには、リードレプリカに対して mysql.rds_start_replication
と mysql.rds_stop_replication
を呼び出して、バイナリログの消去などのレプリケーションアクションを制御します。詳細については、「レプリケーションを使用した MySQL DB インスタンスからのデータのエクスポート」を参照してください。
リードレプリカで mysql.rds_start_replication
を呼び出すことで、mysql.rds_stop_replication
の呼び出しによって前に停止したレプリケーションプロセスを再開することもできます。詳細については、「DB インスタンスのリードレプリカの操作」を参照してください。
mysql.rds_start_replication_until
RDS for MySQL DB インスタンスからレプリケーションを開始し、指定したバイナリログファイルの場所でレプリケーションを停止します。
構文
CALL mysql.rds_start_replication_until (
replication_log_file
,replication_stop_point
);
パラメータ
-
replication_log_file
-
出典データベースインスタンスのバイナリログの名前には、レプリケーション情報が含まれています。
-
replication_stop_point
-
replication_log_file
バイナリログ内でレプリケーションが停止する場所。
使用に関する注意事項
マスターユーザーが mysql.rds_start_replication_until
を実行する必要があります。
mysql.rds_start_replication_until
プロシージャは、以下のバージョンの RDS for MySQL で利用できます。
-
MySQL のバージョン 8.0 (8.0.26 以降)
-
すべての 5.7 バージョン
このプロシージャは、災害対策用の遅延レプリケーションで使用できます。遅延レプリケーションを設定している場合は、このプロシージャを使用して、遅延したリードレプリカへの変更を災害発生直前の時点までロールフォワードできます。このプロシージャでのレプリケーションが停止したら、「リードレプリカをスタンドアロン DB インスタンスに昇格させる」の手順に従ってリードレプリカを新しいプライマリ DB インスタンスに昇格させることができます。
次のストアドプロシージャを使用して遅延レプリケーションを設定できます。
replication_log_file
パラメータに指定するファイル名は、出典データベースインスタンスの binlog ファイル名と一致する必要があります。
replication_stop_point
パラメータで指定した停止場所が過去の時点である場合、レプリケーションは即座に停止します。
例
次の例では、レプリケーションをスタートし、120
バイナリログファイルの場所 mysql-bin-changelog.000777
に達するまで変更をレプリケートします。
call mysql.rds_start_replication_until( 'mysql-bin-changelog.000777', 120);
mysql.rds_start_replication_until_gtid
RDS for MySQL DB インスタンスからのレプリケーションを開始し、指定したグローバルトランザクション識別子 (GTID) の後でレプリケーションを停止します。
構文
CALL mysql.rds_start_replication_until_gtid(
gtid
);
パラメータ
-
gtid
-
レプリケーションがその後で停止する GTID。
使用に関する注意事項
マスターユーザーが mysql.rds_start_replication_until_gtid
を実行する必要があります。
この手順は すべての RDS for MySQL 5.7 バージョン、RDS for MySQL 8.0.26 以降の 8.0 バージョンでサポートされています。
このプロシージャは、災害対策用の遅延レプリケーションで使用できます。遅延レプリケーションを設定している場合は、このプロシージャを使用して、遅延したリードレプリカへの変更を災害発生直前の時点までロールフォワードできます。このプロシージャでのレプリケーションが停止したら、「リードレプリカをスタンドアロン DB インスタンスに昇格させる」の手順に従ってリードレプリカを新しいプライマリ DB インスタンスに昇格させることができます。
次のストアドプロシージャを使用して遅延レプリケーションを設定できます。
gtid
パラメータで指定したトランザクションがレプリカによって既に実行されている場合、レプリケーションは即座に停止します。
例
次の例では、レプリケーションをスタートし、GTID 3E11FA47-71CA-11E1-9E33-C80AA9429562:23
に達するまで変更をレプリケートします。
call mysql.rds_start_replication_until_gtid('3E11FA47-71CA-11E1-9E33-C80AA9429562:23');
mysql.rds_stop_replication
MySQL DB インスタンスからのレプリケーションを停止します。
構文
CALL mysql.rds_stop_replication;
使用に関する注意事項
マスターユーザーが mysql.rds_stop_replication
を実行する必要があります。
Amazon RDS の外部で動作する MySQL インスタンスからデータをインポートするようにレプリケーションを設定している場合は、リードレプリカで mysql.rds_stop_replication
を呼び出して、インポートが完了した後でレプリケーションプロセスを停止することができます。詳細については、「MySQL DB インスタンスへのバックアップの復元」を参照してください。
Amazon RDS の外部にある MySQL インスタンスにデータをエクスポートするようにレプリケーションを設定している場合は、リードレプリカで mysql.rds_start_replication
と mysql.rds_stop_replication
を呼び出して、バイナリログの消去などのレプリケーションアクションを制御できます。詳細については、「レプリケーションを使用した MySQL DB インスタンスからのデータのエクスポート」を参照してください。
mysql.rds_stop_replication
を使用して、2 つ Amazon RDS DB インスタンス間のレプリケーションを停止することもできます。通常、レプリケーションの停止は、リードレプリカでの長時間のオペレーション (リードレプリカで大規模なインデックスを作成するなど) を実行するために行います。停止したレプリケーションプロセスは、リードレプリカで mysql.rds_start_replication を呼び出して再開できます。詳細については、「DB インスタンスのリードレプリカの操作」を参照してください。