不能在命令行明文写密码,因密码会暴露在ps aux进程列表中;应使用权限为600的.my.cnf文件或mysql_config_editor加密存储,并务必添加--single-transaction等关键参数确保备份一致性与完整性。

为什么不能在命令行里写明密码
直接用 mysqldump -u root -p123456 db_name > backup.sql 会把密码暴露在进程列表里,任何能执行 ps aux 的人都能看到。生产环境严禁这么做,尤其当有多个运维或监控工具共存时,风险极高。
.my.cnf 配置文件必须设为 600 权限
在用户主目录下创建 .my.cnf,内容如下:
[mysqldump] user = "backup_user" password = "your_strong_password"
然后立刻执行:chmod 600 ~/.my.cnf
否则 MySQL 客户端会拒绝读取该文件,并报错 Warning: World-writable config file '/home/user/.my.cnf' is ignored。这个权限检查是硬性策略,不是可选项。
- 只对当前用户生效,不影响其他用户
- MySQL 5.6+ 默认启用该限制;低于此版本需手动开启
safe-user-create类配置才起效 - 不建议复用 root 账号,应单独建一个只读账号并授予
SELECT,LOCK TABLES,SHOW VIEW,TRIGGER权限
mysql_config_editor 更安全但兼容性差
MySQL 5.6+ 支持用 mysql_config_editor 存储加密凭据:
mysql_config_editor set --login-path=prod-backup --user=backup_user --host=localhost --password
之后导出时用:mysqldump --login-path=prod-backup db_name > backup.sql
- 密码被 AES-128 加密后存在
~/.mylogin.cnf,比明文.my.cnf更安全 - 但该文件无法被非 MySQL 官方客户端(如某些备份脚本、Docker entrypoint)识别
- 部分旧版系统(如 CentOS 7 自带的 MySQL 5.5)不支持此命令,会提示
command not found
备份脚本里别漏掉 --single-transaction
导出前务必加这个参数,尤其是数据库里大量使用 InnoDB 表时:
mysqldump --login-path=prod-backup --single-transaction --routines --events db_name > backup.sql
-
--single-transaction保证一致性快照,避免锁表,但仅对 InnoDB 有效 - MyISAM 表仍会触发全局读锁,如果混用引擎,得配合
FLUSH TABLES WITH READ LOCK手动处理 - 忘记加
--routines就不会导出存储过程,恢复后功能缺失却不容易察觉
真正容易被忽略的是:.my.cnf 或 .mylogin.cnf 文件一旦写错格式(比如多了一个空格、少了一个换行),mysqldump 会静默回退到交互式密码输入——而自动化脚本里没人工值守,就卡死在那里,后续所有步骤全停。务必在上线前用 mysqldump --print-defaults 验证配置是否被正确加载。


















