mysqldump 转储完整模式所需的最小授权? (触发器不见了!!)

Posted

技术标签:

【中文标题】mysqldump 转储完整模式所需的最小授权? (触发器不见了!!)【英文标题】:Minimum GRANTs needed by mysqldump for dumping a full schema? (TRIGGERs are missing!!) 【发布时间】:2012-01-29 08:21:27 【问题描述】:

我有一个名为 dumpmysql 用户,具有以下权限:

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

转储文件一切正常,除了触发器,它们丢失了!!

如果我使用 root MySQL 用户尝试 mysqldump,触发器会正确转储:

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

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

【问题讨论】:

【参考方案1】:

假设完全转储还意味着VIEWs 和EVENTs,您将需要:

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'@'%';

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

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

【讨论】:

对于 5.5 及以上版本,您实际上不需要 TRIGGER 权限来转储触发代码。 我使用的是 5.5,需要 TRIGGER 权限来转储触发代码。 在我的情况下,我似乎还需要LOCK TABLES 在我试图转储自己的数据库上......使用5.5.49-MariaDB 关于@0xC0000022L 的注释,是否锁定表对于mysqldump 是可选的,具体取决于您的mysqldump 参数(相关参数为--opt--lock-tables--lock-all-tables--single-transaction 和各自的@ 987654333@ 变种。【参考方案2】:

我找到了我需要的额外 GRANT!

  GRANT TRIGGER ON `myschema`.* TO 'dump'@'%'

这里有官方文档的参考:http://dev.mysql.com/doc/refman/5.5/en/privileges-provided.html#priv_trigger

TRIGGER 权限启用触发器操作。您必须拥有此表的权限才能为该表创建、删除或执行触发器。

【讨论】:

名字其实是TRIGGER,不是TRIGGERS 尽管这可能是对作者问题的回答,但它并没有回答以下问题:“执行完整转储的最低 GRANT 要求是什么”。一方面:缺少 EVENT 和 SHOW VIEW。 对于 5.5 及以上版本,您实际上不需要TRIGGER 权限来转储触发代码。 我用的是 5.5,我确实需要它【参考方案3】:

我发现,有时如果 VIEW DEFINER 用户不存在,转储会失败。

更改它,如there 所述

【讨论】:

不知道为什么这被否决了,解决了我的问题。我已将定义器指定为 person 而不是 person@localhost。谢谢!【参考方案4】:

除了Jannes 答案,当使用带有--tab 选项的mysqldump 时(为每个转储表生成一个制表符分隔的文本文件),您的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,所以它 必须可由您的系统登录帐户写入。

【讨论】:

以上是关于mysqldump 转储完整模式所需的最小授权? (触发器不见了!!)的主要内容,如果未能解决你的问题,请参考以下文章

我们是不是应该将授权所需的所有内容存储在 OAuth 令牌中

如何使用基于策略的授权将所需的声明附加到令牌?

在授权所需的服务器中测试用户名和密码的程序? [关闭]

使序列的所有元素为 0 所需的最小步骤数

搜索排序数组中出现次数超过一半的元素所需的最小比较

给定数组表示 S 所需的最小数字计数