mysql备份必须用最小权限专用账号,禁用root;核心权限为select、lock tables(myisam必需,--single-transaction下仍为fallback机制),辅以show view、trigger、event(按需)、replication client(启用--master-data时);主机应优先限定为'localhost'走socket连接,密码须通过600权限的配置文件传递并启用tls加密。

直接用 root 账号跑 mysqldump 是最常见也最危险的做法——一旦备份脚本泄露、日志落盘或被进程窥探,整个数据库就等于裸奔。必须用最小权限专用账号,且 host、密码、连接方式三者都得卡死。
为什么不能写 'backup'@'127.0.0.1'?
MySQL 把 'localhost' 和 '127.0.0.1' 当成两个完全独立的 host:前者走 Unix socket 连接(更快、不走网络、无法远程),后者走 TCP/IP(哪怕本机连,也要走网络栈)。你 grant 了 'backup'@'127.0.0.1',但实际执行 mysqldump -h localhost 或没指定 -h 时,默认走 socket,权限根本不会匹配。
- 永远优先用
'backup'@'localhost'——本地备份足够,且更安全 - 真要远程拉取(比如云 DBS 服务),才改用
'backup'@'%',并立刻配合防火墙只放行特定源 IP -
FLUSH PRIVILEGES不需要手动执行;GRANT语句本身在 MySQL 5.7+ 就已自动刷新权限缓存
GRANT 里哪些权限缺一不可?
少一个,mysqldump 就可能中途报错退出,尤其在混合引擎(InnoDB + MyISAM)或启用 --master-data 时。
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
-
SELECT:读所有表数据,基础中的基础 -
LOCK TABLES:保证一致性快照;即使加了--single-transaction,它仍是 fallback 机制(MyISAM 表必须靠它) -
RELOAD:用于触发FLUSH TABLES WITH READ LOCK,禁用--single-transaction时关键 -
PROCESS:mysqldump用它检查当前线程状态,判断能否安全加锁 -
SHOW VIEW:不加就导不出视图定义,备份文件里只剩空壳CREATE VIEW -
TRIGGER和EVENT:库中含触发器或事件调度器时必须显式授予,否则备份里没有对应语句 -
REPLICATION CLIENT只在你要用--master-data记录 binlog 位点时才需要,不是默认必需项
密码和连接方式怎么防泄露?
权限再小,密码明文一露,就是白送入口。生产环境这三件事不能省:
- 密码至少 12 位,含大小写字母 + 数字 + 符号,例如
ccr_test123456! - 绝对禁止在命令行里写
-p123456——会被ps aux直接看见;改用~/.my.cnf配置文件,并立即执行chmod 600 ~/.my.cnf - 强制启用
require_secure_transport=ON,确保该账号只能走 TLS 连接(mysqldump命令需加--ssl-mode=REQUIRED)
真正难的不是敲几行 CREATE USER 和 GRANT,而是让这个账号在所有备份路径里——定时任务、Shell 脚本、Ansible Playbook、甚至运维平台调用的 API——全都严格遵循 socket 连接、TLS 加密、密码隔离这三道防线。漏掉任意一环,最小权限就形同虚设。










