mysqldump专用账号必须具备select+lock tables+show view+trigger权限,缺一不可;仅select会导致锁表失败或access denied错误,因默认行为依赖锁表、视图与触发器权限。

直接给 mysqldump 用的账号,必须有 SELECT + LOCK TABLES + SHOW VIEW + TRIGGER 权限,缺一不可;仅 SELECT 不够,导出会卡在锁表阶段或报错 Access denied
为什么不能只给 SELECT 权限
mysqldump 默认会对表加读锁(--lock-tables)或启动一致性快照(--single-transaction),这分别依赖 LOCK TABLES 和 SELECT 配合事务隔离级别。但即使加了 --skip-lock-tables,遇到视图、触发器或存储过程时仍会触发 SHOW VIEW 和 TRIGGER 权限检查。实测中,只授 SELECT 会导致如下错误:
mysqldump: Got error: 1142: SELECT,LOCK TABLES command denied to user 'dumpuser'@'localhost' for table 'users'mysqldump: Couldn't execute 'SHOW CREATE VIEW `v_active_users`': SHOW VIEW command denied to user 'dumpuser'@'localhost' (errno: 1142)
创建最小权限专用账号的完整命令
执行以下语句(替换 dumpuser、your_password 和 mydb):
CREATE USER 'dumpuser'@'localhost' IDENTIFIED BY 'your_password'; GRANT SELECT, LOCK TABLES, SHOW VIEW, TRIGGER ON `mydb`.* TO 'dumpuser'@'localhost'; FLUSH PRIVILEGES;
关键点:
- 用
`mydb`.*显式限定库名,避免误授全局权限;不推荐*.* - 如果要导出多个库,逐个授权:
GRANT ... ON `db1`.* TO ...、GRANT ... ON `db2`.* TO ... - 若需导出存储过程/函数,额外加
EXECUTE权限;但多数纯数据导出场景不需要 - 远程导出时,把
'localhost'换成实际 IP 或'%',并确认bind-address和防火墙允许连接
验证账号是否可用
别跳过这步——很多问题出在权限没生效或客户端连接方式不匹配:
- 先用账号登录测试:
mysql -u dumpuser -p -D mydb -e "SELECT 1",确保能连且有库级访问 - 运行最小化导出命令验证:
mysqldump -u dumpuser -p --no-create-info mydb users > /tmp/test.sql - 如果报
Access denied; you need (at least one of) the PROCESS privilege(s),说明你用了--all-databases或--master-data,这些需要额外PROCESS权限,普通单库导出无需
容易被忽略的字符集与路径陷阱
账号权限正确 ≠ 导出一定成功:
- 中文乱码?加
--default-character-set=utf8mb4,且确保该账号连接时默认字符集是 utf8mb4(可通过mysql -u dumpuser -p -e "STATUS;"查看Current client character set) - 导出到远程服务器管道失败?不是权限问题,而是
mysqldump输出流和mysql输入流的字符编码不一致,建议先导出本地文件再 scp,或统一加--set-gtid-purged=OFF避免 GTID 兼容性干扰 - 导出大表卡住?确认没意外启用
--lock-all-tables(它需要super权限),改用--single-transaction+ InnoDB 表即可
真正麻烦的从来不是建账号,而是权限粒度和客户端行为之间的隐式耦合——比如 SHOW VIEW 看似无关,却能让整个导出在遇到第一个视图时静默失败。











