我在新安装的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/