从EC2的MySQL 5.7迁移至AWS RDS MySQL 5.7时的mysqldump警告问题
针对你在从EC2 MySQL 5.7迁移到RDS MySQL 5.7时遇到的Using a password on the command line interface can be insecure警告,这里有几个可靠的方案,同时能完美适配两个数据库账号密码不同的情况:
方案1:使用MySQL配置文件(推荐)
你可以为mysqldump(导出EC2数据)和mysql(导入RDS数据)分别配置独立的认证信息,彻底避免在命令行暴露密码:
为EC2源数据库配置认证信息
在EC2实例上,创建或编辑~/.my.cnf文件,添加以下内容:[mysqldump] user=EC2_MYSQL_USERNAME password=EC2_MYSQL_PASSWORD立刻设置文件权限为仅当前用户可读,防止密码被其他用户获取:
chmod 600 ~/.my.cnf之后执行mysqldump时,完全不需要在命令行加
-p或--password参数,示例命令:mysqldump --host=EC2_MYSQL_HOST target_database > dump.sql为RDS目标数据库配置独立导入文件
因为RDS的账号密码和EC2不同,你可以创建一个单独的配置文件,比如~/.my.cnf.rds,内容如下:[mysql] user=RDS_MYSQL_USERNAME password=RDS_MYSQL_PASSWORD host=RDS_INSTANCE_ENDPOINT同样设置安全权限:
chmod 600 ~/.my.cnf.rds导入数据时通过
--defaults-extra-file参数指定这个文件:mysql --defaults-extra-file=~/.my.cnf.rds target_database < dump.sql
方案2:使用环境变量(临时会话生效)
MySQL 5.7支持通过环境变量传递密码,不会在命令行历史或进程列表中留下痕迹:
导出EC2数据时:
在执行mysqldump前,先在当前终端会话设置环境变量:export MYSQL_PWD="EC2_MYSQL_PASSWORD"接着直接执行mysqldump命令(无需添加密码参数):
mysqldump -u EC2_MYSQL_USERNAME --host=EC2_MYSQL_HOST target_database > dump.sql注意:这个环境变量只在当前终端会话生效,关闭终端后自动失效,不会留下持久化痕迹。
导入RDS数据时:
重新设置环境变量为RDS的密码即可:export MYSQL_PWD="RDS_MYSQL_PASSWORD" mysql -u RDS_MYSQL_USERNAME --host=RDS_INSTANCE_ENDPOINT target_database < dump.sql
方案3:使用--defaults-extra-file参数(灵活适配临时场景)
如果你不想修改全局配置文件,可以直接在命令行指定仅包含认证信息的临时文件:
创建EC2导出专用的密码文件,比如
ec2_dump.cnf:[mysqldump] user=EC2_MYSQL_USERNAME password=EC2_MYSQL_PASSWORD设置安全权限:
chmod 600 ec2_dump.cnf执行mysqldump时指定该文件:
mysqldump --defaults-extra-file=ec2_dump.cnf --host=EC2_MYSQL_HOST target_database > dump.sql导入RDS时,同理创建
rds_import.cnf:[mysql] user=RDS_MYSQL_USERNAME password=RDS_MYSQL_PASSWORD host=RDS_INSTANCE_ENDPOINT执行导入命令:
mysql --defaults-extra-file=rds_import.cnf target_database < dump.sql
安全提醒
- 所有包含密码的配置文件,一定要设置权限为
600,确保只有你自己能读取。 - 绝对不要将这些密码文件提交到版本控制系统,避免密码泄露。
内容的提问来源于stack exchange,提问作者Luis

