导入mysql5.8 dump到mariadb 10.5不能使用已经创建的用户



我在新安装的debian 11.1上安装了一个非常新的mariadb-server-10.5 (1:10.5.15-0+deb11u1)。

在安装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。用户表它只有3个条目为root, mysql和mariadb。因此,我尝试使用以下命令创建用户(这些用户在旧机器上已经存在并使用):

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

,但它导致这个错误:

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

.

用一个简短的脚本检查mysql数据库的所有表,'testuser'出现在3个不同的表中,但作为用户只在db表中出现两次,像这样:

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

.

我认为这会导致create user失败。

如何在不丢失db表中的信息的情况下修复此问题?

谢谢。

一般情况下,当您切换到最新的MySQL或MariaDB版本时,或者从较旧的主要版本导入备份后,您需要运行mysql_upgrade

当从MySQL或从MariaDB 10.3或更早版本导入时,对于MariaDB 10.4及更高版本尤其如此,因为内部特权表在10.4中发生了重大变化。

mysql.user表在10.4中被mysql.global_priv表取代,允许更细粒度的认证控制,例如支持单个用户的多个认证插件。

所以现在mysql.user只是一个VIEW,以向后兼容的方式呈现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/