バイナリログレプリケーションの設定、開始、停止
以下のストアドプロシージャは、トランザクションが外部データベースから RDS for MySQL、または RDS for MySQL から外部データベースに複製される方法を制御します。
トピック
- mysql.rds_next_master_log
- 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_external_source_gtid_purged
- mysql.rds_set_master_auto_position
- mysql.rds_set_source_delay
- mysql.rds_skip_repl_error
- mysql.rds_start_replication
- mysql.rds_start_replication_until
- mysql.rds_stop_replication
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_reset_external_master
RDS for MySQL DB インスタンスを、Amazon RDS の外部で実行している MySQL インスタンスのリードレプリカとして使用しないように再設定します。
重要
この手順を実行するには、autocommit
を有効にする必要があります。これを有効にするには、autocommit
パラメータを 1
に設定します。パラメータの変更については、「Amazon RDS の 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
に設定します。パラメータの変更については、「Amazon RDS の 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 接続を使用するようにソースデータベースインスタンスを設定します。
注記
可能な場合は、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
に設定します。パラメータの変更については、「Amazon RDS の 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
を呼び出す前に、必ず mysql.rds_set_external_source_gtid_purged を呼び出して、外部ソースから指定された GTID 範囲を持つ gtid_purged
システム変数を設定します。
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 ベースのレプリケーションの使用に関する詳細については、「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
に設定します。パラメータの変更については、「Amazon RDS の 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 ベースのレプリケーションの使用に関する詳細については、「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_external_source_gtid_purged
外部ソースから指定された GTID 範囲を持つ gtid_purgedgtid_purged
値が必要です。
重要
この手順を実行するには、autocommit
を有効にする必要があります。これを有効にするには、autocommit
パラメータを 1
に設定します。パラメータの変更については、「Amazon RDS の DB パラメータグループのパラメータの変更」を参照してください。
構文
CALL mysql.rds_set_external_source_gtid_purged(
server_uuid
,start_pos
,end_pos
);
パラメータ
-
server_uuid
-
GTID 範囲をインポートする外部サーバーの汎用一意識別子 (UUID)。
-
start_pos
-
設定する GTID 範囲の開始位置。
-
end_pos
-
設定する GTID 範囲の終了位置。
使用に関する注意事項
mysql.rds_set_external_source_gtid_purged
の手順は、MySQL 8.0.37 以降の 8.0 バージョンでのみ使用できます。
mysql.rds_set_external_master_with_auto_position または mysql.rds_set_external_source_with_auto_position_for_channel を呼び出す前に mysql.rds_set_external_source_gtid_purged
を呼び出します。
mysql.rds_set_external_source_gtid_purged
を呼び出す前に、データベースのアクティブなレプリケーションチャネルをすべて停止してください。チャネルのステータスを確認するには、MySQL ステートメント SHOW REPLICA STATUS
を使用します。チャネルのレプリケーションを停止するには、mysql.rds_stop_replication_for_channel を呼び出します。
指定する GTID 範囲は、既存の GTID_PURGED
値のスーパーセットである必要があります。このストアドプロシージャは、GTID_PURGED
値を設定する前に以下の値をチェックします。
server_uuid
が有効である。start_pos
の値は、0
より大きく、end_pos
の値より小さい。end_pos
の値がstart_pos
の値以上。
外部サーバーで設定された GTID に複数の値の範囲が含まれている場合は、異なる GTID 設定値でプロシージャを複数回呼び出すことを検討してください。
mysql.rds_set_external_source_gtid_purged
を呼び出すと、Amazon RDS で、時刻、ユーザー、set gtid_purged
のアクションが mysql.rds_history
テーブルに記録されます。
レプリケーションに使用するバックアップに gtid_purged
値を適切に設定しないと、レプリケーションプロセス中にトランザクションが欠落したり、重複したりする可能性があります。正しい gtid_purged
値を設定するには、次の手順を実行します。
レプリカで gtid_purged 値を設定するには
レプリケーションの開始点として使用するポイントインタイムまたは特定のバックアップファイルを決定します。これは、論理バックアップ (mysqldump ファイル) または物理バックアップ (Amazon RDS スナップショット) の場合があります。
gtid_executed
値を決定します。この値は、サーバーでコミットされたすべての GTID のセットを表します。この値を取得するには、ソースインスタンスで次のいずれかを実行します。バックアップが作成された時点で SQL ステートメント
SELECT @@GLOBAL.GTID_EXECUTED;
を実行します。関連するオプションがそれぞれのバックアップユーティリティに含まれている場合は、バックアップファイルから値を抽出します。詳細については、MySQL ドキュメントの「set-gtid-purged
」オプションを参照してください。
mysql.rds_set_external_source_gtid_purged
への呼び出しに使用するgtid_purged
値を決定します。gtid_purged
値には、ソースインスタンスで実行され、レプリケーションに不要になったすべての GTID を含める必要があります。したがって、gtid_purged
値は前のステップで取得したgtid_executed
値のサブセットである必要があります。gtid_purged
値を決定するには、バックアップに含まれておらず、レプリケーションに不要になった GTID を特定します。そのためには、バイナリログを分析するか、mysqlbinlog などのツールを使用してバイナリログから消去された GTID を検索します。または、バックアップポイントまでのすべてのバイナリログを含む一貫したバックアップがある場合は、
gtid_purged
値をバックアップポイントのgtid_executed
値と同じ値に設定できます。バックアップと一致する適切な
gtid_purged
値を決定したら、RDS for MySQL DB インスタンスでmysql.rds_set_external_source_gtid_purged
ストアドプロシージャを呼び出して値を設定します。
例
MySQL DB インスタンスで実行すると、次の例では、UUID 12345678-abcd-1234-efgh-123456789abc
を持つ外部 MySQL サーバーからの GTID 範囲、開始位置 1
、終了位置 100
が設定されます。結果の GTID 値は +12345678-abcd-1234-efgh-123456789abc:1-100
に設定されます。
CALL mysql.rds_set_external_source_gtid_purged('12345678-abcd-1234-efgh-123456789abc', 1, 100);
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 ベースのレプリケーションの詳細については、「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_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
を呼び出して、レプリケーションプロセスを開始します。詳細については、「Amazon RDS for 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_stop_replication
MySQL DB インスタンスからのレプリケーションを停止します。
構文
CALL mysql.rds_stop_replication;
使用に関する注意事項
マスターユーザーが mysql.rds_stop_replication
を実行する必要があります。
Amazon RDS の外部で動作する MySQL インスタンスからデータをインポートするようにレプリケーションを設定している場合は、リードレプリカで mysql.rds_stop_replication
を呼び出して、インポートが完了した後でレプリケーションプロセスを停止することができます。詳細については、「Amazon RDS for 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 インスタンスのリードレプリカの操作」を参照してください。