MySQL 8.0.32中mysqldump需要"reload/flush_tables权限"问题的解决方案

发布时间 2023-03-27 10:23:17作者: abce

在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中)。