我有 MySQL 5.5 的旧服务器和 MySQL 8 的新服务器。我不知道用户密码,我需要移动大约 30 个用户。
将“mysql”数据库复制到新服务器的正确方法是什么?
我尝试像任何其他常规数据库一样复制 mysql,我知道不推荐这样做,并得到:
[警告] [MY-013360] [服务器] 插件 sha256_password 报告:“sha256_password”已弃用,并将在未来版本中删除。请改用caching_sha2_password' <
如何将 sha256 转换为 sha2?我也尝试过:
显示授予用户“user_name”@“localhost”;
然后取出该行并在新服务器(mysql 8)上运行它:
创建用户 'user_name'@'localhost' 通过密码识别 '*1E0C2C7ED8F8315F6816F...';
当我运行时: select * from user where user='user_name'
我在“authentication_string”列中得到不同的哈希密码:*E5FDC4D51AC7AB43AC9...
任何想法?
小智 5
MySQL 5.5 和 8.0 之间有很多差异。也就是说,您应该能够通过大约三个步骤来完成此操作:
\n1 \xe2\x80\x94 导出授权
\n从数据库服务器的 shell 运行此命令:
\nmysql -u root -p'PASSWORD' --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql -u root -p'PASSWORD' --skip-column-names -A | sed 's/$/;/g' > user_grants.sql\nRun Code Online (Sandbox Code Playgroud)\n这会将所有授权user_grants.sql以易于导入新服务器的格式放入文件中。
2 \xe2\x80\x94 构建创建用户语句
\n从数据库服务器的 shell 运行此命令:
\nmysql -u root -p'password' --skip-column-names -A mysql -e "SELECT CONCAT('CREATE USER \\'', user, '\\'@\\'', host, '\\' IDENTIFIED WITH \\'mysql_native_password\\' AS \\'', password,'\\';') FROM mysql.user WHERE user NOT IN ('mysql.session','mysql.sys','debian-sys-maint','root');" > create_user.sql\nRun Code Online (Sandbox Code Playgroud)\n这会将所有用户帐户create_user.sql以易于导入新服务器的格式放入文件中。
重要提示:此查询适用于 MySQL 5.6 及更低版本。从 5.7 开始,该password字段不再存在于users表中。
3 \xe2\x80\x94 恢复数据
\n将文件复制到新服务器并导入数据:
\nmysql -u root -p mysql < create_user.sql\nmysql -u root -p mysql < user_grants.sql\nRun Code Online (Sandbox Code Playgroud)\n完成此操作后,连接到 MySQL 并刷新权限:
\nmysql -u root -p\n{enter password}\nFLUSH PRIVILEGES;\nquit;\nRun Code Online (Sandbox Code Playgroud)\n完毕。
\n