最安全做法是禁用命令行明文密码,改用交互输入或加密配置文件。须设 ~/.my.cnf 权限为 600,或使用 mysql_config_editor 创建加密的 ~/.mylogin.cnf;备份账号仅授 select、lock tables、show view 等最小权限,禁用 file/process/super,并限制登录 ip。

备份账号密码不能出现在命令行里
直接写 mysqldump -u backup_user -p'123456' db 是最危险的做法——密码会留在 ps aux 输出、shell 历史、系统日志里,任何能登录服务器的人都可能看到。MySQL 官方文档明确标注这是高危行为。
- 改用交互式输入:
mysqldump -u backup_user -p db > backup.sql,执行后手动输密码 - 或用
~/.my.cnf配置文件,但必须设权限:chmod 600 ~/.my.cnf -
~/.my.cnf内容示例(注意 [client] 段):[client] user = backup_user password = your_strong_password
- 注意:Python 的
pymysql、Go 的go-sql-driver/mysql默认不读~/.my.cnf,得显式传参或用连接串
用 login-path 替代明文配置文件
mysql_config_editor 生成的 login-path 更安全,因为密钥被 GPG 加密存储在 ~/.mylogin.cnf 中,且该文件默认权限是 600。
- 创建 login-path:
mysql_config_editor set --login-path=backup --user=backup_user --password(执行后交互输密码) - 使用时:
mysqldump --login-path=backup db > backup.sql - 验证是否生效:
mysql --login-path=backup -e "SELECT 1" - 别把
~/.mylogin.cnf复制到其他机器——它绑定当前用户和主机,跨机无效
容器或自动化脚本中怎么传密码
环境变量看似方便,但容易因空格、shell 展开、.env 文件误提交导致泄露。必须加校验和剥离逻辑。
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
- Python 示例(避免裸调
os.getenv):import os def get_env(key): val = os.getenv(key) if not val: raise RuntimeError(f"Missing {key}") return val.strip() <p>DB_USER = get_env("DB_USER") DB_PASS = get_env("DB_PASS")</p> - Docker 启动时用
-e DB_PASS=xxx,**不要**用--env-file加载含密码的文件 - Kubernetes 中必须用
Secret挂载为环境变量,而非 volume;否则容器内cat /mnt/secret/password就能读到 - 本地开发用
direnv或python-dotenv,但.env必须进.gitignore,且禁止 commit
备份账号本身要最小权限
给备份用的 MySQL 账号,权限越小越好。root 或 super 权限一旦泄露,等于交出整库控制权。
- 只授必要权限:
GRANT SELECT, LOCK TABLES, SHOW VIEW ON *.* TO 'backup_user'@'localhost'; - 禁用
FILE权限:防止攻击者用SELECT ... INTO OUTFILE写 webshell - 禁用
PROCESS和SUPER:避免通过SHOW PROCESSLIST窃取其他连接密码 - 限制来源 IP:
'backup_user'@'192.168.10.5'比'backup_user'@'%'安全得多 - 定期轮换密码,尤其在人员变动或怀疑泄露后
真实场景里,~/.my.cnf 权限没设对、.env 被误提交、backup_user 拥有 FILE 权限——这三件事加起来,比加密算法选 AES 还重要。










