欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > MySQL 8.X 仅迁移非系统数据库账号和权限信息

MySQL 8.X 仅迁移非系统数据库账号和权限信息

2025/4/3 6:28:35 来源:https://blog.csdn.net/gmaaa123/article/details/146717486  浏览:    关键词:MySQL 8.X 仅迁移非系统数据库账号和权限信息

 

一、需求说明

需要将A数据库里面非系统的数据库账号和权限迁移到另外一台B数据库上,同时不能影响B数据库现有的用户和权限。

二、处理思路

我们不能盲目的将A数据库整个mysql数据库导出到B数据库进行覆盖。

我们需要做下面2个步骤:
将A数据库上非系统数据库账号的信息,导出成insert语句,在B数据库上执行
将A数据库上非系统数据库账号相关的权限,导出成grant语句,在B数据库上执行

二、具体操作

1.生成用户创建语句

导出mysql.user表,排除系统内置账号,添加条件,不需要删除drop和create创建表的语句,

我们只需要插入、

# 导出mysql user表  (排除系统账号)mysqldump -uroot -p --where=" user NOT IN ('root','mysql.infoschema','mysql.session','mysql.sys') " mysql user --no-create-info > /file/mysql_user_create.sql

 这里生成的mysql_user_create.sql文件,就是账号创建的SQL语句。

2.生成用户权限授权的语句

a.先获取mysql库中用户的列表信息 (排除系统账号)

# 获取mysql库中用户账号名称列表 输出到txt文件 (排除系统账号)mysql -B -N -uroot -p -e "SELECT CONCAT('\'', user,'\'@\'', host, '\'') FROM user WHERE user NOT IN ('root','mysql.infoschema','mysql.session','mysql.sys')" mysql > /file/mysql_users.txt

b.获取用户权限信息

根据每行的账号名称,查询账号对应的授权信息,输出到文件

# 根据每一行的账号名称,查询账号对应的授权信息while read line; do mysql -B -N -uroot -p -e "SHOW GRANTS FOR $line"; done < /file/mysql_users.txt > /file/mysql_user_prv.sql

c.每行结尾添加逗号作为结束符

# 每行结尾添加逗号作为结束符sed -i 's/$/;/' /tmp/mysql_all_users.sql

d.在最后一行增加 "flush privileges;" 来刷新权限

# 在最后一行增加 "flush privileges;" 来刷新权限echo "flush privileges;" >> /file/mysql_user_prv.sql

 这里生成的mysql_user_prv.sql文件,就是账号授权的SQL语句。

3.在B数据库上导入用户及权限

将上面处理过的sql脚本文件mysql_user_create.sql、mysql_user_prv.sql在目标mysql实例上执行

# 导入用户mysql -u root -p < mysql_user_create.sql# 导入用户权限mysql -u root -p < mysql_user_prv.sql

三、完整脚本

export_mysql_user_prv.sh

#!/bin/bash
# Export Mysql users and prv# mysql username
export username=root
# mysql password
export password=123456Abmkdir -p /file/# 导出mysql user表  (排除系统账号)mysqldump -u${username} -p${password} --where=" user NOT IN ('root','mysql.infoschema','mysql.session','mysql.sys') " mysql user --no-create-info > /file/mysql_user_create.sql# 获取mysql库中用户的列表信息 (排除系统账号)getuserlist.shmysql -B -N -u${username} -p${password} -e "SELECT CONCAT('\'', user,'\'@\'', host, '\'') FROM user WHERE user NOT IN ('root','mysql.infoschema','mysql.session','mysql.sys')" mysql > /file/mysql_users.txt# 获取用户权限信息while read line; do mysql -B -N -u${username} -p${password} -e "SHOW GRANTS FOR $line"; done < /file/mysql_users.txt > /file/mysql_user_prv.sql# 每行结尾添加逗号作为结束符sed -i 's/$/;/' /file/mysql_user_prv.sql# 在最后一行增加 "flush privileges;" 来刷新权限echo "flush privileges;" >> /file/mysql_user_prv.sql


 

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词