こんにちは!ひこにきです
現在稼働しているシステムで crontab で定期的に mysqldump で論理バックアップを取得していたのですが、いつの間に下記のエラーが発生するようになってました
エラーの内容 Couldn’t execute ‘FLUSH TABLES WITH READ LOCK’
エラーの詳細内容
mysqldump: Couldn't execute 'FLUSH TABLES WITH READ LOCK': Access denied for user 'xx_user'@'%' (using password: YES) (1045)
以下は バックアップで実行していたmysqldumpコマンドです
mysqldump --single-transaction -u${DB_USER} -h${DB_HOST} -p${DB_PW} ${DB_NM} | gzip > ${GZFILE}
原因
正直、mysqldump が権限エラーになる要因はまったく思い当たらなかったのですが、直近では php のアップグレード対応で各パッケージモジュールを更新したことでしょうか
mysqldump の バージョン確認
mysqldump --version
mysqldump Ver 10.13 Distrib 5.7.43, for Linux (x86_64)
むむぅ、、色々調査してみると mysql の bugfix に以下の記述がありました
参考:https://bugs.mysql.com/bug.php?id=1096855.7.42: With mysqldump, using --single-transaction required either the RELOAD or FLUSH_TABLES privilege with mysqldump v5.7.41. This requirement now only applies when gtid_mode=ON (defaults to OFF) and with --set-gtid-purged =ON|AUTO (defaults to AUTO).
記載の通り –single-transaction を指定する場合に RELOAD もしくは FLUSH_TABLES の権限が必要になったとのこと、そしてその条件は gtid_mode=ON でかつ –set-gtid-purged が ON もしくは AUTO の場合必要とのことでした
エラーの解消方法
–set-gtid-purged の デフォルトは AUTO なので mysqldump のオプションで –set-gtid-purged=OFF を指定することで対応します
以下のようにコマンドを修正してエラー解消されました!
mysqldump --single-transaction --set-gtid-purged=OFF -u${DB_USER} -h${DB_HOST} -p${DB_PW} ${DB_NM} | gzip > ${GZFILE}
mysqldump(client側ツール)のアップデートでまさかの権限エラーになるとは思いもしませんでした、、、
サーバー側の設定など調査し始めたらハマりそうな事象ですね
同様の事象が発生した際に参考になれば幸いです!