生产环境严禁将密码写入命令行或配置文件,应优先使用加密的 .mylogin.cnf 登录路径;环境变量(如 MYSQL_USER/MYSQL_PASSWORD)次之,但 MYSQL_PWD 优先级高且不加密,需慎用。

直接把密码写在命令行或配置文件里,mysql -u root -p123456 这种用法在生产环境等同于把钥匙挂在门把手上——连“掩耳盗铃”都算不上。环境变量不是万能保险箱,但它是目前最轻量、最通用、且被 MySQL 官方客户端原生支持的凭据隔离手段。
为什么不能把密码写在命令行里
进程参数对同一台机器上的所有用户可见:ps aux | grep mysql 就能直接看到明文密码;Shell 历史记录(~/.bash_history)也会留存;如果用脚本调用,还可能被日志系统捕获。MySQL 客户端从 5.6 起就明确警告:使用 -p 后接密码的方式已被弃用。
MySQL 客户端如何读取环境变量
MySQL 命令行客户端(mysql)会自动检查以下两个环境变量:
-
MYSQL_PWD:直接存密码字符串(不推荐,因进程环境仍可被读取) -
MYSQL_USER和MYSQL_PASSWORD:配合使用,比MYSQL_PWD稍安全(但仍非加密)
只要设置了 MYSQL_USER 和 MYSQL_PASSWORD,运行 mysql -h localhost -P 3306 就能自动登录,无需任何 -u 或 -p 参数。
更安全的替代方案:使用 .mylogin.cnf
真正推荐的做法是用 MySQL 自带的加密登录文件:
- 运行
mysql_config_editor set --login-path=local --user=root --password - 输入密码后,它会生成加密文件
~/.mylogin.cnf(Windows 下是%USERPROFILE%\mylogin.cnf) - 之后用
mysql --login-path=local即可无感连接 - 该文件权限被严格限制(Linux/macOS 下自动设为
600),且内容 AES 加密
注意:mysql_config_editor 本身不读取环境变量,但它生成的凭据可被所有 MySQL 客户端工具(包括 mysqldump、mysqladmin)复用。
环境变量 + 登录路径组合使用的实际建议
开发或 CI 场景中,常需动态切换环境。这时可以:
- 用环境变量控制登录路径名:
export MYSQL_LOGIN_PATH=staging,然后脚本里调用mysql --login-path="$MYSQL_LOGIN_PATH" - 避免在 Shell 启动文件(如
~/.zshrc)中硬编码MYSQL_PASSWORD,改用按需加载:比如在进入项目目录后,由.env文件通过set -a; source .env; set +a注入临时变量 - 永远不要在 Git 仓库里提交含凭据的文件,哪怕它叫
.env.example—— 实际.env应该被.gitignore严格排除
最易被忽略的一点:MYSQL_PWD 的优先级高于 .mylogin.cnf。如果两者共存,前者会覆盖后者,且不加密。所以要么彻底不用 MYSQL_PWD,要么确保它只在调试时临时设置、用完即 unset。


















