mysqldump需要的最小GRANT权限来转储完整模式?(触发器丢失!!)

90

我有一个名为 dump 的MySQL用户,拥有以下权限:

GRANT USAGE ON *.* TO 'dump'@'%' IDENTIFIED BY ...
GRANT SELECT, LOCK TABLES ON `mysql`.* TO 'dump'@'%'
GRANT SELECT, LOCK TABLES ON `myschema`.* TO 'dump'@'%'

我想使用 dump 用户倾倒所有数据(包括触发器和存储过程)。我以以下方式调用mysqldump:

mysqldump -u dump -p --routines --triggers --quote-names --opt \
    --add-drop-database --databases myschema > myschema.sql

除了触发器缺失之外,转储文件的一切都正常!!

如果我使用MySQL的root用户尝试使用mysqldump,则触发器会被正确导出:

mysqldump -u root -p --routines --triggers --quote-names --opt \
    --add-drop-database --databases myschema > myschema.sql

所以,我猜这是一个权限问题...我的dump MySQL用户需要哪些额外授权才能正确执行完整的转储?

4个回答

118

假设您所说的完整转储包括 VIEWEVENT,您需要:

GRANT USAGE ON *.* TO 'dump'@'%' IDENTIFIED BY ...;
GRANT SELECT, LOCK TABLES ON `mysql`.* TO 'dump'@'%';
GRANT SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER ON `myschema`.* TO 'dump'@'%';

如果您有执行函数的 VIEW,那么不幸的是您还需要 EXECUTE

我的问题是:如果我只想进行无数据转储,为什么还需要 SELECT


2
对于5.5及以上版本,您实际上不需要TRIGGER权限来转储触发器代码。 - bluecollarcoder
1
我正在使用5.5版本,需要TRIGGER权限来转储触发器代码。 - heuri
在我的情况下,似乎我还需要在尝试转储的数据库上使用LOCK TABLES...使用5.5.49-MariaDB - 0xC0000022L
2
关于@0xC0000022L的评论,对于mysqldump来说锁定表格是可选的,这取决于您的mysqldump参数(相关参数包括--opt--lock-tables--lock-all-tables--single-transaction以及相应的--skip-*变体)。 - Torque

8

3
名字实际上是TRIGGER,而不是TRIGGERS。 - thenickdude
尽管这可能是对作者问题的回答,但它并没有回答问题:“进行完整转储的最低GRANT要求是什么”。首先:缺少EVENT和SHOW VIEW。 - Jannes
对于5.5及以上版本,实际上您不需要“TRIGGER”权限来转储触发器代码。 - bluecollarcoder
5
我使用5.5,实际上我需要它。 - Emilio Nicolás

1
我发现,有时如果 VIEW DEFINER 用户不存在,则转储失败。
按照这里所述进行更改。

不确定为什么会被投票否决,但这解决了我的问题。我将定义者指定为 person@localhost 而不是 person。谢谢! - stianlik

1
除了Jannes的回答之外,当使用mysqldump命令并添加--tab选项(产生一个用于每个转储表的制表符分隔文本文件)时,您的MySQL用户还必须被授予FILE权限。
GRANT FILE ON *.* TO 'dump'@'%';

官方文档参考:https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html#option_mysqldump_tab 本节提到:
仅当mysqldump在与mysqld服务器相同的机器上运行时才应使用此选项。由于服务器在指定的目录中创建*.txt文件,因此该目录必须可写入服务器并且您使用的MySQL帐户必须具有FILE特权。因为mysqldump在同一目录中创建*.sql,所以必须由您的系统登录帐户可写入。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接