将mysql5.8转储导入mariadb 10.5不允许我使用已创建的用户

hgqdbh6s  于 2022-11-08  发布在  Mysql
关注(0)|答案(1)|浏览(181)

我在一个新安装的debian 11.1上安装了mariadb-server-10.5(1:10.5.15-0+ deb 11 u1)。
在安装了mysql-server(5.5.9999+default)和debian 9.6的旧机器上,我创建了一个如下的转储:

mysqldump -u root -pSOMEPW --all-databases > all_databases.dump

我在新服务器上加载了这个转储文件:

source /path/to/all_databases.dump

。源花了一段时间,没有导致任何错误,但它在结束时发出一次哔哔声(没有可见的错误或警告消息)。
检查mysql.user表,它只有root、mysql和mariadb.sys的3个条目,所以我尝试使用以下命令创建用户(在旧机器上已存在并使用):

create user 'testuser'@'localhost' identified by 'pw';

但它会导致以下错误:

ERROR 1396 (HY000): Operation CREATE USER failed for 'testuser'@'localhost'


通过一个简短的脚本检查mysql数据库的所有表,'testuser'出现在3个不同的表中,但作为一个用户只出现在数据库表中两次,如下所示:

| Host      | Db            | User          | Select_priv
| localhost | somedb        | testuser      | Y
| localhost | somedbp2      | testuser      | Y


我认为这可能会导致创建用户失败。
如何在不丢失数据库表中的信息的情况下解决此问题?

  • 谢谢-谢谢
jqjz2hbq

jqjz2hbq1#

通常,每当您切换到较新的MySQL或MariaDB版本时,或者在导入从较旧的主要版本获取的备份后,都需要运行mysql_upgrade
当从MySQL或从MariaDB 10.3或更早版本导入时,对于MariaDB 10.4及更高版本尤其如此,因为内部权限表在10.4中发生了实质性变化。
mysql.user表在10.4中被mysql.global_priv所取代,允许更细粒度的认证控制,例如支持单个用户的多个认证插件。
因此,现在mysql.user只是一个视图,它以向后兼容的方式显示来自mysql.global_priv的信息。用户名和主机名等简单信息仍然可以通过该视图直接修改,因为它是一个可更新的视图,但这不适用于更复杂的列。
而且像CREATE USER这样的命令现在直接在mysql.global_priv表上操作,您得到的错误是由于导入的转储中不存在该表。
好消息是:mysql_upgrade将负责必要的转换,之后CREATE USER应该可以再次工作。
另请参阅:https://mariadb.com/kb/en/mysql_upgrade/
另请参阅:https://mariadb.com/kb/en/mysqlglobal_priv-table/

相关问题