mysqldump最小权限需select和lock tables;备份视图、存储过程或事件还需show view、execute、event;--all-databases要求select on .;--single-transaction可省lock tables但仅限innodb且版本≥5.7.21。

mysqldump 需要哪些最小权限才能备份
只给 SELECT 和 LOCK TABLES 权限,基本能跑通大多数表级逻辑备份。但实际中容易漏掉几个关键点:
-
SELECT是必须的——没它连数据都读不出来 -
LOCK TABLES用于--single-transaction外的场景(比如 MyISAM 表),否则会报ERROR 1045 (28000): Access denied - 如果备份含视图、存储过程或事件,还得加
SHOW VIEW、EXECUTE、EVENT权限,否则mysqldump会跳过或报错 - 用
--all-databases时,SELECT权限必须对*.*授予,不能只给单库
如何创建专用备份账号并授最小权限
别用 root 或高权限账号跑定时备份脚本,既不安全也不利于审计。执行以下语句即可建一个干净的账号:
CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'strong_password'; GRANT SELECT, LOCK TABLES ON *.* TO 'backup_user'@'localhost'; FLUSH PRIVILEGES;
注意:如果只备份特定库(比如 app_db),就把 ON *.* 换成 ON app_db.*;但得确认该库下没跨库视图,否则 SELECT 权限范围不够。
为什么 --single-transaction 不需要 LOCK TABLES
因为 --single-transaction 依赖 InnoDB 的 MVCC 特性,在事务开始时拍个一致性快照,全程不锁表。这时候 LOCK TABLES 权限可省,但前提是:
- 所有待备份表必须是 InnoDB 引擎(MyISAM 不支持)
- MySQL 版本 ≥ 5.7.21 或 8.0.1+(老版本有已知 bug,即使加了
--single-transaction仍可能尝试锁表) - 备份期间不能有长事务阻塞快照建立,否则
mysqldump会卡住甚至超时
若混用引擎,建议显式排除非 InnoDB 表:mysqldump --single-transaction --ignore-table=db.myisam_table ...
常见权限错误现象与定位方法
遇到备份失败,先看错误信息里有没有明确提示权限不足,比如:
-
mysqldump: Got error: 1142: SELECT command denied to user 'backup_user'@'localhost' for table 'users'→ 缺SELECT -
mysqldump: Got error: 1045: Access denied; you need (at least one of) the SUPER privilege(s) for this operation→ 可能误用了--master-data或--flush-logs,它们需要REPLICATION CLIENT或RELOAD权限 - 备份出来的 SQL 文件里缺视图定义,且没报错 → 很可能是漏了
SHOW VIEW权限,mysqldump默认静默跳过
查当前账号权限用:SHOW GRANTS FOR 'backup_user'@'localhost';,别靠记忆判断。
权限这事看着简单,但跨引擎、跨版本、混用选项时,很容易在某个边缘 case 上栽跟头。尤其是 --single-transaction 和 LOCK TABLES 的权限边界,很多人以为开了前者就彻底不用锁表权限,其实不是。










