【追記あり】MySQL8.0.32と5.7.41のmysql-clientだとAmazon RDS/Auroraに--single-transactionオプションつけたmysqldumpが実行できない

技術本部 サービスリライアビリティグループ(SRG)の鬼海(@fat47)です。
#SRG(Service Reliability Group)は、主に弊社メディアサービスのインフラ周りを横断的にサポートしており、既存サービスの改善や新規立ち上げ、OSS貢献などを行っているグループです。
本記事は、SRG 内にある DBWG(DBワーキンググループ)が全社内向けに提供しているデータベースに関する資料を公開します。
なにかの役に立てば幸いです。
 

概要


タイトルにある通りですが、2023年1月にリリースされた最新バージョンだと、mysqldumpの--single-transactionオプションを利用したときの挙動が変わったため、Amazon RDS/Auroraで実行ができません。
💡
2023年4月18日にMySQL 8.0.33がリリースされ、この現象を回避できるようになりました。 https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-33.html 詳細を記事下部に追記しています。
 

対象のバージョン


MySQL8.0.32
MySQL5.7.41
 

mysqldumpの挙動が変更


MySQL8.0.32のリリースノートには下記のように書いてあります。
The data and the GTIDs backed up by mysqldump  were inconsistent when the options   and   were both used. It was because in between the transaction started by mysqldump  and the fetching of  , GTIDs on the server could have increased already. With this fixed, a   is performed before the fetching of   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環境でのオプションを指定したmysqldumpが利用できなくなります。
'FLUSH TABLES WITH READ LOCK’が権限不足でAuroraでは実行できない為です。
もしかしてオンプレ環境のMySQLでもmysqldump中ずっとが有効になるのか!?と思い検証しましたが、流石にそんなことはなくmysqldump中も更新処理は動きました。
 

回避方法


—single-transactionオプションを利用しないという手がまずあります。
下記のAmazon公式記事は、RDSに対してオプションを利用した際に が実行されるので利用できない。という記事になります。
 
事象としては今回と同じになるので、ここで記載された2つの解決方法は以下の通りです。
  • アプリケーションを停止して更新がない状態でmysqldumpを実行する
  • リードレプリカのレプリケーションを停止してmysqldumpを実行する
 
論理バックアップが必要なときはmysqldumpではなく、MySQL Shell Dump Utilityを利用するのも解決策の一つかと思います。
こちらのほうが並列でダンプ・リストアが動くので高速です。
8.0.22以降のMySQL shellであればが取得できなかったら、かわりにをつかって一貫性のあるバックアップを取得することができるので、RDS/Auroraでも実行可能です。
 

【2023/04/20追記】MySQL 8.0.33で対応されました


Using --single-transaction with mysqldump version 8.0.32 required either the RELOAD or FLUSH_TABLES privilege. This requirement now applies only when both gtid_mode=ON (default OFF) and with --set-gtid-purged = ON|AUTO (default AUTO). (Bug #109685, Bug #109701, Bug #34993824, Bug #34998910, Bug #35020512)
References: This issue is a regression of: Bug #105761, Bug #33630199.
5.7.42もリリースされ対応されています。
 
記載のとおり上記バージョンにて対応されましたので確認してみます。
 

MySQL8.0.32で動かなかったmysqldumpコマンド

 

MySQL8.0.33では動きます

 
ちなみにAuroraのデフォルトのクラスタパラメータグループでは、になっています。
この状態ですと上記にリリースノートの記載にある通り、にしないとエラーでdumpができません。
 

終わりに


SRG では一緒に働く仲間を募集しています。 ご興味ありましたらぜひこちらからご連絡ください。
 
このエントリーをはてなブックマークに追加