MYSQL 没有user表,怎么更新权限?
U-NAS系统自带的MYSQL。
用mysql连接上,执行show tables,是能看到user表的。
但是更新密码,就报错。
ERROR 1356 (HY000): View 'mysql.user' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
解决方案:
1. 检查 mysql.user 是否是视图
首先,检查 mysql.user 是否是视图。你可以使用以下命令:
SHOW FULL TABLES IN mysql WHERE TABLE_TYPE = 'VIEW';
2. 查看视图定义
如果 mysql.user 是视图,可以通过以下命令查看视图的定义:
SHOW CREATE VIEW mysql.user;
3. 检查权限
确保你有足够的权限来更新 mysql.user 表。你可以查看当前用户的权限:
SHOW GRANTS FOR CURRENT_USER();
执行了查看视图之后,
返回如下信息:
MariaDB [mysql]> SHOW CREATE VIEW mysql.user\G;
*************************** 1. row ***************************
View: user
Create View: CREATE ALGORITHM=UNDEFINED DEFINER=mariadb.sys@localhost SQL SECURITY DEFINER VIEW user AS select global_priv.Host AS Host,global_priv.User AS User,if(json_value(global_priv.Priv,'$.plugin') in ('mysql_native_password','mysql_old_password'),ifnull(json_value(global_priv.Priv,'$.authentication_string'),''),'') AS Password,if(json_value(global_priv.Priv,'$.access') & 1,'Y','N') AS Select_priv,if(json_value(global_priv.Priv,'$.access') & 2,'Y','N') AS Insert_priv,if(json_value(global_priv.Priv,'$.access') & .........省略
从视图定义中可以看出,mysql.user 视图基于 global_priv
表并从其中提取数据。因此,要更新 mysql.user 视图中的数据,需要直接更新 global_priv
表。
更新 global_priv 表
根据 mysql.user 视图的定义,authentication_string 存储在 global_priv 表的 Priv 列的 JSON 字段中。你需要使用 JSON 操作来更新它。
USE mysql;
-- 更新密码和插件
UPDATE global_priv
SET Priv = JSON_SET(Priv, '$.authentication_string', '*E9999.......................EEEEE', '$.plugin', 'mysql_native_password')
WHERE User='root' AND Host='localhost';
-- 刷新权限
FLUSH PRIVILEGES;
-- 检查更新是否成功
SELECT User, Host, JSON_UNQUOTE(JSON_EXTRACT(Priv, '$.authentication_string')) AS authentication_string, JSON_UNQUOTE(JSON_EXTRACT(Priv, '$.plugin')) AS plugin
FROM global_priv
WHERE User='root' AND Host='localhost';