我正在尝试使用该命令备份 mysql
mysqldump -u root -p database_name > backup.sql
Run Code Online (Sandbox Code Playgroud)
,但它抛出一个错误:
'拒绝访问; 尝试转储表空间时,您需要(至少其中之一)此操作的 PROCESS 特权
另外,我想备份我的数据库,并将所有表单独存储为一个文件。我该怎么做?
mysql 版本 = 5.7.31
wol*_*evo 129
用 --no-tablespaces
mysqldump至少需要转储表的 SELECT 特权,转储视图的 SHOW VIEW,转储触发器的 TRIGGER,如果未使用 --single-transaction 选项则需要 LOCK TABLES,以及(从 MySQL 8.0.21 开始)PROCESS,如果 --不使用 no-tablespaces 选项。某些选项可能需要其他权限,如选项说明中所述。
并查看 param no-tablespaces 的文档
--无表空间,-y
此选项禁止 mysqldump 输出中的所有 CREATE LOGFILE GROUP 和 CREATE TABLESPACE 语句。
pix*_*ets 65
tl;dr在次要 MySQL 更新中引入了重大更改--no-tablespaces,mysqldump从现在开始使用选项(推荐)或PROCESS向运行命令的用户添加全局权限。
我在我的一些机器上遇到了同样的问题。不是一次全部,不是所有命令,不是所有用户。
为什么不是一次全部?
事实证明,这是 2020/07 年 MySQL 次要更新 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 至少需要转储表的 SELECT 特权,转储视图的 SHOW VIEW,转储触发器的 TRIGGER,如果未使用 --single-transaction 选项则需要 LOCK TABLES,以及(从 MySQL 5.7.31 开始)PROCESS 如果 --不使用 no-tablespaces 选项。某些选项可能需要其他权限,如选项说明中所述。
此选项禁止 mysqldump 输出中的所有 CREATE LOGFILE GROUP 和 CREATE TABLESPACE 语句。
查看流程文档
PROCESS 特权控制对有关在服务器内执行的线程的信息(即有关会话正在执行的语句的信息)的访问。PROCESS 特权还允许使用 SHOW ENGINE 语句,访问 INFORMATION_SCHEMA InnoDB 表(名称以 INNODB_ 开头的表),以及(从 MySQL 5.7.31 开始)访问 INFORMATION_SCHEMA FILES 表。
一个什么MySQL的表空间就是为什么它是用来是在另一个问题很好的解释在计算器上了。
一般建议:大多数用户不需要表空间信息,因此可以使用该--no-tablespace选项安全地忽略它。
如果表空间是有意并自愿配置的,那么执行 mysqldumps 的用户应该获得足够的权限。
为什么不针对所有用户?
MySQLroot用户当然不受影响。其他用户可能会或可能不会受到影响,具体取决于他们被授予权限的方式。
该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;。
小智 12
解决方法是添加:
--column-statistics=0 --no-tablespaces
Run Code Online (Sandbox Code Playgroud)
到你的转储命令。我还必须添加列统计信息,因为无表空间不起作用。