RDSでは、マスターユーザーでさえSUPER
を許可していません 特権。これは、FLUSH TABLES WITH READ LOCK
を実行するために必要です。 。 (これはRDSの残念な制限です。)
失敗したステートメントは、--master-data
によって生成されています もちろん、これは、バックアップが開始される正確なbinlog座標を学習できるようにする場合に必要です。 FLUSH TABLES WITH READ LOCK
すべてのテーブルのグローバル読み取りロックを取得します。これにより、mysqldumpはSTART TRANSACTION WITH CONSISTENT SNAPSHOT
(--single-transaction
の場合と同様 )次にSHOW MASTER STATUS
バイナリログ座標を取得します。その後、表示データをそのログ位置と一致する状態に保つトランザクションがあるため、グローバル読み取りロックを解放します。
RDSは、SUPER
を拒否することで、このメカニズムを破ります 特権があり、明らかな回避策はありません。
これを適切に回避するために利用できるハッキーなオプションがいくつかありますが、どれも特に魅力的ではない可能性があります:
-
トラフィックが少ない時間帯にバックアップを実行します。バックアップを開始してからバックアップが出力ファイルまたは宛先サーバーへのデータの書き込みを開始した後までにbinlog座標が変更されていない場合(
--single-transaction
を使用したと仮定) )プロセスの実行中に座標が変更されなかったことがわかっているため、これは機能します。 -
バックアップを開始する直前にマスターのbinlogの位置を確認し、これらの座標を
CHANGE MASTER TO
で使用します 。マスターのbinlog_format
の場合ROW
に設定されています そうすれば、これは機能するはずですが、いくつかの初期エラーをスキップする必要がありますが、その後エラーが発生する必要はありません。これが機能するのは、行ベースのレプリケーションが非常に決定論的であり、すでに存在するものを挿入しようとしたり、すでになくなったものを削除しようとしたりすると停止するためです。エラーを過ぎると、一貫性のあるスナップショットが実際に開始された真のbinlog座標になります。 -
前の項目と同じですが、バックアップを復元した後、
mysqlbinlog --base64-output=decode-rows --verbose
を使用して正しい位置を特定してください。 取得した座標でマスターのbinlogを読み取り、スナップショットが実際に開始される前にどのイベントがすでに実行されている必要があるかを新しいスレーブで確認し、この方法で決定された座標を使用してCHANGE MASTER TO
。 -
外部プロセスを使用して、サーバー上のすべてのテーブルの読み取りロックを取得します。これにより、すべての書き込みが停止します。
SHOW MASTER STATUS
からのbinlogの位置を確認します はインクリメントを停止し、バックアップを開始して、それらのロックを解放します。
おそらく最後のアプローチ以外のこれらのアプローチのいずれかを使用する場合は、テーブルの比較を行って、実行後にスレーブがマスターと同一であることを確認することが特に重要です。その後のレプリケーションエラーが発生した場合は、そうではありませんでした。
おそらく最も安全なオプションですが、おそらく最も厄介なオプションです 必要ではないように思われるので、RDSマスターのRDSリードレプリカを作成することから始めます。起動してマスターに同期されたら、RDSが提供するストアドプロシージャCALL mysql.rds_stop_replication
を実行することで、RDSリードレプリカでのレプリケーションを停止できます。 RDS5.6.13および5.5.33で導入されました> SUPER
は必要ありません 特権。
RDSレプリカスレーブを停止した状態で、mysqldump
を取得します RDS読み取りレプリカから。これにより、特定のマスター座標のセットの時点で不変のデータセットが設定されます。このバックアップをオフサイトスレーブに復元してから、SHOW SLAVE STATUS
からRDS読み取りレプリカのマスター座標を使用します Exec_Master_Log_Pos
およびRelay_Master_Log_File
CHANGE MASTER TO
として 座標。
Exec_Master_Log_Pos
に表示される値 スレーブでは、次のトランザクションの開始または処理されるイベント
、そしてそれはまさにあなたの新しいスレーブがマスターで読み始める必要がある場所です。
次に、外部スレーブが稼働し始めたら、RDSリードレプリカを廃止できます。