问题描述
如何迁移自建库用户密码和权限到RDS MySQL/PolarDB MySQL
回答
- 通过以下SQL在原库确认mysql.user表中需要迁移的用户(不含aurora, root, replicator),是否都是用的mysql_native_password认证方式:
select distinct user, plugin from mysql.user;
- 确认目标的库表都创建完成
1、生成创建用户的脚本create_user.sql
mysql -D mysql -h ${src_host} -P ${src_port} -u ${src_admin_user} --password=${src_pass} --skip-column-names -A -e "SELECT CONCAT('CREATE USER \'', user, '\'@\'', host, '\' IDENTIFIED WITH \'mysql_native_password\' AS \'', password,'\';') FROM mysql.user WHERE user NOT IN ('root','aurora','replicator','') and plugin='mysql_native_password';" > create_user.sql
2、生成赋权脚本grant_user.sql
mysql -h ${src_host} -P ${src_port} -u ${src_admin_user} --password=${src_pass} --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user NOT IN ('root','aurora','replicator','')" | mysql -D mysql -h ${src_host} -P ${src_port} -u ${src_admin_user} --password=${src_pass} --skip-column-names -A | sed 's/IDENTIFIED BY PASSWORD.*//g' | sed 's/$/;/g'> grant_user.sql
3、在目标库执行以上脚本,并执行flush privileges
由于目标库可能有冲突的用户,会导致脚步报错。若希望忽略报错,可以加-f参数强制跳过。
mysql -h ${dest_host} -P ${dest_port} -u ${dest_admin_user} --password=${dest_pass} -A < create_user.sql
mysql -h ${dest_host} -P ${dest_port} -u ${dest_admin_user} --password=${dest_pass} -A < grant_user.sql
mysql -h ${dest_host} -P ${dest_port} -u ${dest_admin_user} --password=${dest_pass} -A "flush privileges"
其他MySQL版本或产品适配:
MySQL 5.6以上(不含5.6)版本
需要将生成创建用户的命令中的AS \'', password,'\';'修改为AS \'', authentication_string,'\';'
其他MySQL产品或版本
需要将创建用户和赋权脚本中的user NOT IN ('root','aurora','replicator','') 替换为该产品的默认系统用户(PS:MySQL 5.7新增默认用户mysql.session,mysql.infoschema,mysql.sys,迁移的时候要剔除)