MySQL8.0.32と5.7.41のmysql-clientだとAmazon RDS/Auroraに--single-transactionオプションつけたmysqldumpが実行できない
Created
2023/1/26 4:46
技術本部 サービスリライアビリティグループ(SRG)の鬼海(@fat47)です。
#SRG(Service Reliability Group)は、主に弊社メディアサービスのインフラ周りを横断的にサポートしており、既存サービスの改善や新規立ち上げ、OSS貢献などを行っているグループです。
なにかの役に立てば幸いです。
概要
タイトルにある通りですが、2023年1月にリリースされた最新バージョンだと、mysqldumpの--single-transactionオプションを利用したときの挙動が変わったため、Amazon RDS/Auroraで実行ができません。
対象のバージョン
MySQL8.0.32
MySQL5.7.41
mysqldumpの挙動が変更
MySQL8.0.32のリリースノートには下記のように書いてあります。
The data and the GTIDs backed up by mysqldump were inconsistent when the options--single-transaction
and--set-gtid-purged=ON
were both used. It was because in between the transaction started by mysqldump and the fetching ofGTID_EXECUTED
, GTIDs on the server could have increased already. With this fixed, aFLUSH TABLES WITH READ LOCK
is performed before the fetching ofGTID_EXECUTED
to ensure its value is consistent with the snapshot taken by mysqldump
--single-transaction と --set-gtid-purged=ON のオプションを両方使用した場合、mysqldump でバックアップされたデータと GTID に矛盾が発生しました。これは、mysqldumpによって開始されたトランザクションとGTID_EXECUTEDのフェッチの間に、サーバ上のGTIDが既に増加している可能性があったためです。この修正により、FLUSH TABLES WITH READ LOCK が GTID_EXECUTED のフェッチの前に実行され、その値が mysqldump が取得したスナップショットと一致することが確認されました。
なぜか5.7.41のリリースノートには何も書かれていませんが、同様の修正が入っている模様です。
つまりなにが都合悪くなる?
Aurora環境で
--single-transaction
のオプションを指定したmysqldumpが利用できなくなります。'FLUSH TABLES WITH READ LOCK’が権限不足でAuroraでは実行できない為です。
もしかしてオンプレ環境のMySQLでもmysqldump中ずっと
FLUSH TABLES WITH READ LOCK
が有効になるのか!?と思い検証しましたが、流石にそんなことはなくmysqldump中も更新処理は動きました。回避方法
—single-transactionオプションを利用しないという手がまずあります。
下記のAmazon公式記事は、RDSに対して
—master-data
オプションを利用した際にFLUSH TABLES WITH READ LOCK
が実行されるので利用できない。という記事になります。事象としては今回と同じになるので、ここで記載された2つの解決方法は以下の通りです。
- アプリケーションを停止して更新がない状態でmysqldumpを実行する
- リードレプリカのレプリケーションを停止してmysqldumpを実行する
論理バックアップが必要なときはmysqldumpではなく、MySQL Shell Dump Utilityを利用するのも解決策の一つかと思います。
こちらのほうが並列でダンプ・リストアが動くので高速です。
8.0.22以降のMySQL shellであれば
FLUSH TABLES WITH READ LOCK
が取得できなかったら、かわりにLOCK TABLES ... READ
をつかって一貫性のあるバックアップを取得することができるので、RDS/Auroraでも実行可能です。終わりに
SRG では一緒に働く仲間を募集しています。
ご興味ありましたらぜひこちらからご連絡ください。