mysql_config_editor 更安全:密码加密存于 ~/.mylogin.cnf(权限600),避免明文暴露;需配合最小权限账号、正确文件归属及环境路径,且仅官方客户端支持。

用 mysql_config_editor 存密码比写在脚本里安全得多
明文把 -p 或 --password 直接塞进备份命令,ps 能看到、history 会留痕、日志可能落盘——这根本不是“隐藏”,是裸奔。而 mysql_config_editor 把加密后的凭据存进用户家目录下的 ~/.mylogin.cnf(权限自动设为 600),MySQL 客户端工具(如 mysqldump)能自动读取它,且进程列表里完全不暴露密码。
实操建议:
- 运行
mysql_config_editor set --login-path=backup --user=backup_user --password --host=localhost,执行后会交互式输入密码(不会回显,也不会进 history) -
--login-path是自定义别名,比如叫prod或staging,后续所有操作都靠它区分环境 - 生成的
~/.mylogin.cnf是二进制格式,别手动编辑,出错就用mysql_config_editor remove --login-path=backup清掉重来 - 确认是否生效:运行
mysqldump --login-path=backup database_name | head -n5,能连上就说明配置成功
备份脚本里直接用 --login-path 替代 -u/-p
原来写 mysqldump -u backup_user -p'xxx' ... 的地方,现在全换成 mysqldump --login-path=backup ...。注意:它不接受等号写法(--login-path=backup 可以,但 --login-path backup 也行,空格和等号都支持)。
常见错误现象:
- 报错
mysqldump: Got error: 1045: Access denied for user...→ 检查mysql_config_editor print --login-path=backup看输出的 host/user 是否匹配目标实例(比如 localhost 和 127.0.0.1 在 MySQL 权限体系里是不同账号) - 脚本在 cron 里跑失败,但手动执行正常 → cron 默认没有加载用户 shell 的环境变量,
~可能解析成 root 用户目录;务必用绝对路径写--login-path,或确保 cron 里指定HOME=/home/youruser - 误把
--login-path当成全局开关:它只对当前命令生效,不能“一次设置,全系统生效”
mysql_config_editor 不解决所有问题,得配合权限最小化
它只是让密码不裸露,不代表账号本身够安全。如果 backup_user 拥有 DELETE 或 DROP 权限,被恶意调用 mysqldump 以外的命令(比如 mysql --login-path=backup -e "DROP DATABASE...")照样出事。
所以必须限制账号权限:
- 只授
SELECT、LOCK TABLES、SHOW VIEW(如果导视图)、TRIGGER(如果导触发器) - 明确限定
GRANT ... ON database_name.*,别用ON *.* - 如果用
--single-transaction,还需REPLICATION CLIENT(用于获取 binlog 位置,非必需但推荐) - 验证权限:用该账号登录后执行
SHOW GRANTS FOR CURRENT_USER;
别忽略 .mylogin.cnf 文件本身的权限和归属
这个文件一旦被其他用户读到,加密就白搭——因为 MySQL 官方没公开解密算法,但社区已有逆向工具能解出明文密码(尤其旧版本加密强度弱)。所以不能只依赖加密,更要靠文件系统权限兜底。
关键检查点:
- 运行
ls -l ~/.mylogin.cnf,必须是-rw-------且 owner 是运行备份脚本的用户 - 如果脚本由
root执行,但mysql_config_editor是普通用户运行的,那~/.mylogin.cnf归属不对,root读不到;要么统一用同一用户操作,要么把文件 chown 过去(不推荐) - 某些容器环境里
~指向 /root,而备份脚本跑在非 root 用户下,这时mysql_config_editor写的文件根本不在它的搜索路径里——mysqldump默认只查$HOME/.mylogin.cnf,没别的备选路径
最常被忽略的一点:mysql_config_editor 生成的凭据只对 MySQL 官方客户端有效,perl DBI、Python mysql-connector 这类第三方驱动完全不认它,该加密还得自己上 keyring 或环境变量隔离。










