仅在 Linux 上出现 AWS RDS `flush tables` 错误的 mysqldump
我有一个使用mysqldump从AWS RDS的MariaDB导出数据的过程,这个过程已经在Concourse的docker-image中成功运行了好几年。
从两天前的晚上开始,这个过程开始失败,并出现了错误。
mysqldump: Couldn't execute 'FLUSH TABLES WITH READ LOCK': Access denied for user 'admin'@'%' (using password: YES) (1045)
AWS的官方解释似乎是,因为他们不允许主用户有超级权限或GLOBAL READ LOCK,如果设置了 --master-data选项,mysqldump就会失败。
我没有设置这个选项。我正在用这些标志运行。
mysqldump -h ${SOURCE_DB_HOST} ${SOURCE_CREDENTIALS} ${SOURCE_DB_NAME} --single-transaction --compress | grep -v '^SET .*;$' > /tmp/dump.sql
mysqldump在我的本地Mac上执行时工作正常。但在Linux环境下,它失败了,因为它无法执行FLUSH TABLES WITH READ LOCK。
我的问题是,有人知道如何在linux上禁用mysqldump中的FLUSH TABLES WITH READ LOCK命令吗?
编辑:很高兴接受下面@sergey-payu的回答,因为他已经解决了我的问题,但这里有一个MySQL错误报告的链接,以利于其他任何人遇到这个问题https://bugs.mysql.com/bug.php?id=109685 。
5.7.42
/ 8.0.33
版本开始修复,这里是文档团队提议的更新日志条目。5.7.42
:在mysqldump
中,使用--single-transaction
需要RELOAD
或FLUSH_TABLES
的权限和mysqldump
v5.7.41
。现在这个要求只适用于gtid_mode=ON
(默认为OFF
)和--set-gtid-purged = ON|AUTO
(默认为AUTO
)时。[...]"
- cueedee 2023-02-28
几天前我也遇到了同样的问题。我的mysqldump脚本多年来一直工作得很好,直到它开始给我带来Access denied; you need (at least one of) the RELOAD privilege(s) for this operation
错误。我的第一直觉是授予这个权限。但在那之后,我开始得到Access denied for user 'user'@'%' (using password: YES) (1045)
错误,这在AWS文档中是记载的。经过几个小时的调查,发现这是mysql最新的5.7.41版本的一个错误(它是1月17日发布的,正是我们开始出现错误的时候)。降级到5.7.40版本解决了这个问题。有趣的是,5.7.41 changelog并没有列出任何接近FLUSH TABLES WITH READ LOCK或默认值的东西。
sudo apt-get install mysql-client-8.0=8.0.19-0ubuntu5
之后是sudo apt-get install mysql-client-core-8.0=8.0.19-0ubuntu5
这将使你得到mysqldump 8.0.19版本,它修复了这个问题> 我还搁置了两个软件包。sudo apt-mark hold mysql-client-8.0
和sudo apt-mark hold mysql-client-core-8.0
- Panda 2023-01-27
apt-cache madison
,需要修复的版本是初始的jammy
,即8.0.28-0ubuntu4
。
- theist 2023-01-30
apt-get install mysql-client-core-8.0=8.0.28-0ubuntu4 mysql-client-8.0=8.0.28-0ubuntu4; apt-mark hold mysql-client-core-8.0 mysql-client-8.0
注意,你的可用软件包可能会因发行版/可用存储库等而不同。对于任何基于apt的发行版来说,一个通用的解决方案是用apt-cache madison <package>
检查可用的版本,看看为你的系统提供了哪些版本
- theist 2023-02-07
根据5.7.41版本的更新日志。
当同时使用选项--single-transaction和-set-gtid-purged=ON时,mysqldump备份的数据和GTIDs是不一致的。这是因为GTID_EXECUTED是在转储结束时获取的,这时服务器上的GTID可能已经增加。修正了这个问题后,在转储开始时执行了FLUSH TABLES WITH READ LOCK,并在转储结束后立即获取GTID_EXECUTED,以确保其值与mysqldump获取的快照一致。