在MySQL Server 8.0.32, Oracle修复了Bug #105761:
"mysqldump make a non-consistent backup with ‐‐single-transaction option"
这引起了用户的一波抱怨,他们无法再使用mysqldump程序进行备份,因为缺乏所需的权限。
Bug #109701 "Fix for #33630199 in 8.0.32 introduces regression when ‐‐set-gtid-purged=OFF"
Bug #109685 "mysqldump has incompatible change in MySQL 8.0.32″
之后,Oracle承认了这个问题,甚至在MySQL Server 8.0.32版本说明中增加了一个新的段落。
Limitation: This fix adds a requirement for the RELOAD privilege when using ‐‐single-transaction to execute FLUSH TABLES WITH READ LOCK; the MySQL team is investigating a solution. (Bug #33630199, Bug #105761)
Percona Server for MySQL 8.0.32-24对这个问题提出一个更好的方案。
下面将详细描述mysqldump程序在创建转储时使用的机制。
名词解释
·STWCS – START TRANSACTION WITH CONSISTENT SNAPSHOT
·FTWRL – FLUSH TABLES WITH READ LOCK
1.开启了GTID模式
mysqldump命令行参数 |
MySQL Server 8.0.31中的mysqldump |
MySQL Server 8.0.32中的mysqldump |
Percona Server 8.0.32中的mysqldump |
--single-transaction --set-gtid-purged=OFF |
STWCS |
FTWRL STWCS |
STWCS |
--single-transaction --set-gtid-purged=ON |
STWCS |
FTWRL STWCS |
STWCS |
2.未开启GTID模式
mysqldump命令行参数 |
MySQL Server 8.0.31中的mysqldump |
MySQL Server 8.0.32中的mysqldump |
Percona Server 8.0.32中的mysqldump |
--single-transaction |
STWCS |
FTWRL STWCS |
STWCS |
综上所述,当不开启gtid时,使用Percona Server的mysqldump程序(MySQL 8.0.32)和"‐‐single-transaction"命令行参数是安全的。当开启gtid时,使用Percona Server的mysqldump程序(MySQL 8.0.32)和"‐‐single-transaction ‐‐set-gtid-purged=OFF"命令行参数是安全的。创建这些转储不依赖于向MySQL发送FTWRL,因此备份用户不需要要RELOAD/FLUSH_TABLES特权。
另一方面,Percona Server for MySQL 8.0.32使用mysqldump工具时,"‐‐single-transaction ‐‐set-gtd-purged=On",只有STWCS语句(没有FTWRL)会被发送到MySQL,这保证了只有在使用Percona Server for MySQL(而不是Oracle MySQL Server)时结果一致。这是因为Percona Server for MySQL有额外的代码补丁,而Oracle MySQL Server没有。
基本上,当你在MySQL 8.0.32的实例上使用Percona Server的mysqldump工具时,"‐‐single-transaction ‐‐set-GTID-purged=ON",你会得到旧的(错误的)8.0.31行为,它不能保证快照和被PURGE的GTID集是同步的。
如果你确实需要在Oracle MySQL Server实例上运行mysqldump"‐‐single-transaction ‐‐set-gtid-purged=ON",并且你想要获得数据的一致快照,你别无选择,只能使用MySQL Server 8.0.32的mysqldump二进制文件。在这种情况下,你的用户需要具有RELOAD或FLUSH_TABLES特权。
请注意,这些建议只是临时解决方案,在Oracle正确修复这些错误之前可以使用(这些修复目前计划包含在即将推出的MySQL Server 8.0.33中)。