错误 1054 (42S22): 'mysql.user' 中的未知列 'plugin'

bre*_*son 6 mysql permissions users errors mysql-5.6

我正在尝试为用户授予对新数据库的权限

mysql> grant all on db_test.* to 'user_test'@'localhost' identified by 'usersexistingpassword';
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

ERROR 1054 (42S22): Unknown column 'plugin' in 'mysql.user'
Run Code Online (Sandbox Code Playgroud)

我正在使用 MySQL 5.6

mysql> select @@version;
+-------------+
| @@version   |
+-------------+
| 5.6.24-72.2 |
+-------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

我确实在 MySQL 上找到了一篇关于在 5.6.x 及更高版本上更新本机密码的文章

6.3.9.3 从 4.1 之前的密码哈希和 mysql_old_password 插件迁移 https://dev.mysql.com/doc/refman/5.7/en/account-upgrades.html

我以 root 身份运行了他们推荐的命令

mysql> UPDATE mysql.user SET plugin = 'mysql_native_password'
    -> WHERE plugin = '' AND (Password = '' OR LENGTH(Password) = 41);
ERROR 1054 (42S22): Unknown column 'plugin' in 'where clause'
Run Code Online (Sandbox Code Playgroud)

Rol*_*DBA 9

您的问题与mysql.user升级到 MySQL 5.6 的方式和方式有关

如果您查看我对Cannot GRANT privileges as root 的回答,我会向您展示mysql.user从 MySQL 4.1 到 MySQL 5.6的描述。

该列pluginmysql.userMySQL 5.5/5.6 中的第 41 列

mysql> SELECT column_name,ordinal_position FROM information_schema.columns
    -> WHERE table_schema='mysql' and table_name='user' and column_name='plugin';
+-------------+------------------+
| column_name | ordinal_position |
+-------------+------------------+
| plugin      |               41 |
+-------------+------------------+
1 row in set (0.04 sec)

mysql> SELECT version();
+-----------+
| version() |
+-----------+
| 5.6.24    |
+-----------+
1 row in set (0.02 sec)

mysql>
Run Code Online (Sandbox Code Playgroud)

该列不会出现在 MySQL 5.1、5.0 或 4.x 中。这告诉我的是,不知何故 MySQL 已升级到 5.6,但仍然具有mysql.user5.1 或更旧的版本。

如果你跑了SELECT COUNT(1) column_count FROM information_schema.columns WHERE table_schema='mysql' AND table_name='user';,你得到了 39,我有办法给你。

请参阅我的帖子MySQL 服务在尝试向用户授予权限后停止,了解如何手动mysql.user从 5.1 直接修复到 5.6。