我在一个新安装的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
。
我认为这可能会导致创建用户失败。
如何在不丢失数据库表中的信息的情况下解决此问题?
- 谢谢-谢谢
1条答案
按热度按时间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/