最稳妥的官方方案是 mysql_config_editor,它将加密凭证存入 ~/.mylogin.cnf,客户端自动识别但必须显式指定 --login-path;文件权限须为 600,不可用明文密码或 ~/.my.cnf 替代。

用 mysql_config_editor 存凭证,而不是写进脚本里
明文密码出现在备份或部署脚本中,会直接暴露在 ps aux、shell history、日志甚至终端标题栏里。最稳妥的官方方案是 mysql_config_editor,它把加密后的凭证存进 ~/.mylogin.cnf,MySQL 客户端和 mysqldump 都能自动识别。
关键点:
- 必须显式指定
--login-path,比如mysql_config_editor set --login-path=deploy --host=10.0.1.5 --user=app_deploy;不加这个参数,后续调用就找不到配置 - 执行时不能跟明文密码:命令末尾不要写
-ppassword,它会交互式提示输入,避免密码进命令行历史 -
~/.mylogin.cnf权限必须是600(chmod 600 ~/.mylogin.cnf),否则 MySQL 客户端会拒绝读取 - 普通用户配在
$HOME/.mylogin.cnf,root 用户在/root/.mylogin.cnf,脚本里别硬写路径
在 mysqldump 或 mysql 命令中显式传 --login-path
很多人以为配完 mysql_config_editor 就万事大吉,结果 mysqldump -u app_deploy -p 还是报 Warning: Using a password on the command line interface can be insecure. —— 因为没告诉工具用哪个登录路径。
正确写法示例:
mysqldump --login-path=deploy --databases myapp --single-transaction --routines --triggers > /backup/myapp_$(date +%F).sql
注意:
- 不能混用:比如
--login-path=deploy设的是app_deploy@10.0.1.5,但 SQL 里SELECT USER();返回root@localhost,说明 host 或 user 填错了 - 调试时用
mysql_config_editor print --login-path=deploy确认字段是否完整(host、user、port、socket) - 容器环境要确保挂载卷权限一致,
~/.mylogin.cnf不能放在 NFS 共享目录下
CI/CD 脚本里别依赖 .env 或命令行参数传密码
用 export MYSQL_PWD=xxx 或 --password=xxx 启动 mysql,在 CI 日志里等于公开密钥。更糟的是,有些 runner 会把环境变量值打到控制台。
MySQL 数据库管理技能,能够通过自然语言查询和管理数据库,支持 SELECT/INSERT/UPDATE/DELETE、表管理、备份恢复等操作。当用户提及 MySQL、数据库查询、建表或数据备份时使用此技能。
可行做法:
- 在 CI job 开头用
mysql_config_editor set动态生成--login-path=ci,密码从 secrets 注入(如 GitHub Actions 的${{ secrets.MYSQL_PASSWORD }}) - 确保该步骤只在当前 job 的 shell session 中生效,且不落盘——
mysql_config_editor写入的是二进制加密文件,但它的安全性完全依赖文件权限 - 如果 CI runner 是无状态容器,每次都要重设
--login-path,不能指望复用宿主机的.mylogin.cnf
为什么不用 ~/.my.cnf?它和 mysql_config_editor 有啥区别
~/.my.cnf 是纯文本,哪怕权限设成 600,内容仍是明文,一旦机器被入侵,所有密码立刻裸奔。而 mysql_config_editor 使用 MySQL 自研加密(非标准 AES),虽然算法未公开,但至少不直接暴露明文。
实际限制:
-
~/.my.cnf只能有一个[client]段,无法区分多环境(dev/prod/backup);--login-path支持任意多个别名 -
~/.my.cnf会被所有 MySQL 工具默认读取,容易误匹配;--login-path必须显式指定,行为可控 - 某些高安全要求场景(如金融类 CI)明确禁用任何明文凭证文件,
mysql_config_editor是唯一合规选项
真正容易被忽略的是:mysql_config_editor 生成的加密文件不是“一劳永逸”,密码轮换后必须重新 set,且旧 --login-path 不会自动失效。自动化脚本里得把“更新凭证”作为独立步骤,而不是假设配置永远有效。










