我正在尝试使用命令
mysqldump -u root -p  database_name > backup.sql

备份mysql,但它抛出错误:

'访问被拒绝;尝试转储表空间时,您需要(至少一种)该过程的PROCESS特权


此外,我想备份所有表分开存储的数据库作为文件。我该怎么办?
mysql version = 5.7.31

#1 楼

使用--no-tablespaces
请参见mysqldump-Documentation

mysqldump至少对转储的表具有SELECT特权,对于转储的视图至少应具有SHOW VIEW,对于转储的触发器应具有TRIGGER,对表要锁定
如果未使用--single-transaction选项,并且(自MySQL
8.0.21起),则处理(如果未使用--no-tablespaces选项。
某些选项可能还需要其他特权,如所述)在选项
描述中。

,请参阅参数无表空间的文档
mysqldump的输出中的LOGFILE GROUP和CREATE TABLESPACE
语句。


评论


在5.7分支中,MySQL 5.7.31中对此进行了更改。

–nwellnhof
20年8月22日在13:08

#2 楼

tl; dr MySQL的次要更新中引入了重大更改,从现在开始(建议)在--no-tablespaces中使用mysqldump选项(推荐)或向运行命令的用户添加全局PROCESS特权。
我在某些机器上遇到了相同的问题。不是一次全部,不是全部命令,不是全部用户。
为什么不是一次全部?
结果证明这是2020年MySQL次要更新5.7.31和8.0.21中引入的重大更改。 / 07。
请参阅5.7.31发行说明/ 8.0.21发行说明

安全说明

不兼容的更改:现在,访问INFORMATION_SCHEMA.FILES表需要PROCESS特权。
此更改影响mysqldump命令的用户,该命令访问FILES表中的表空间信息,因此现在也需要PROCESS特权。不需要转储表空间信息的用户可以通过使用--no-tablespaces选项调用mysqldump来解决此要求。 (缺陷号30350829)


上述发行编号应在http://mybug.no.oracle.com/orabugs/bug.php?id=30350829处提供。但是,Oracle的错误跟踪器似乎已关闭。另一个公共问题是https://bugs.mysql.com/bug.php?id=100219。
因此,此问题必须在所有MySQL> = 5.7的计算机上发生,并最终获得系统更新。
次要更新中的重大更改是意外的。但是,这是一个安全问题。很遗憾,这个问题及其解决方法没有得到更好的传达。恕我直言,对于此重大更改,更实用的解决方案是默认情况下删除mysqldump中的表空间并添加--add-tablespaces选项。
为什么不对所有命令都使用?
在大多数情况下,不需要上述特权PROCESS 。但是mysqldump尝试访问INFORMATION_SCHEMA.FILES表,如上所述-该表现在需要PROCESS特权。
因此mysqldump现在需要具有足够特权的用户或使用--no-tablespaces选项来启动。
请参见mysqldump文档

mysqldump至少对转储的表具有SELECT特权,对转储的视图至少具有SHOW VIEW,对于转储的触发器至少具有TRIGGER,如果不使用--single-transaction选项,则需要LOCK TABLES;对于-自MySQL 5.7.31起,则至少需要PROCESS不使用no-tablespaces选项。某些选项可能需要其他特权,如选项说明中所述。

请参见--no-tablespaces文档

此选项禁止输出中的所有CREATE LOGFILE GROUP和CREATE TABLESPACE语句mysqldump。

请参阅流程文档

PROCESS特权控制对服务器内执行线程的信息(即,有关会话正在执行的语句的信息)的访问。 /> PROCESS特权还允许使用SHOW ENGINE语句,访问INFORMATION_SCHEMA InnoDB表(名称以INNODB_开头的表),以及(从MySQL 5.7.31开始)访问INFORMATION_SCHEMA FILES表。

为什么要使用MySQL表空间,已经在StackOverflow的另一个问题中得到了很好的解释。
一般建议:大多数用户不需要表空间信息,因此可以使用--no-tablespace选项安全地忽略它。
如果表空间是已知配置的并且愿意,那么执行mysqldumps的用户应该获得足够的特权。
为什么不对所有用户都适用?
MySQL root用户当然不受影响。其他用户可能会或不会受到影响,具体取决于获得特权的方式。
GRANT选项在全局级别,单个数据库,单个表甚至列或例程中添加特权。某些特权,例如所说的PROCESS特权,需要在全局级别上添加。
请参阅授权文档

下表总结了可以为GRANT和REVOKE指定的允许的特权类型。语句,以及可以授予每个特权的级别。
|特权|含义和授予级别|
|工艺流程使用户能够使用SHOW PROCESSLIST查看所有进程。级别:全球。 |

因此sql命令GRANT ALL PRIVILEGES ON somedatabase.* TO someuser@localhost;将仅向一个数据库上的用户添加所有可用特权。全局特权是使用ON *.*添加的。
在我的情况下,大多数数据库用户仅具有所选数据库的特权。使用SHOW GRANTS for someuser@localhost;检查用户特权。要添加全局特权,请使用SQL命令GRANT PROCESS ON *.* TO someuser@localhost;。除非您知道此特权的后果,否则不要这样做。要撤消特权,请使用REVOKE PROCESS ON *.* FROM someuser@localhost;

评论


要求--add-tablespace选项将意味着您的备份现在不完整,这可能比根本没有备份还糟,也可能没有,更糟糕的是,相当多的系统都有备份cronjob,其错误发生在/ dev /空值。更好的主意是仅在实际上存在需要特权才能备份的表空间的情况下,才将大火烧死。

–马特西亚斯·乌利希斯(Matthias Urlichs)
20 Sep 6'13:54



您提到了8.2.21,但可能是8.0.21,对吧?

– cherouvim
20/12/3在11:56

@cherouvim对,谢谢。替换了版本。

–pixelbrackets
20/12/04在12:40

*。*授予someuser @ localhost的授权过程;确实解决了问题。 :)

–里卡多·马丁斯(Ricardo Martins)
20 Dec 16'在8:10