今天我意识到我无法在我的 Plesk 服务器上添加或删除属于任何客户的任何数据库。
我一直收到这个错误:
错误:无法删除部分选定的数据库。指定为定义者 ('root'@'localhost') 的用户不存在
所以我找到并运行了这个修复程序:
# plesk db
# CREATE USER 'root'@'localhost' IDENTIFIED BY 'typepasswordhere';
现在,当尝试添加或删除数据库时,我收到一个新错误:
错误:连接数据库服务器失败:视图“mysql.user”引用了无效的表、列或函数,或者视图的定义者/调用者缺乏使用它们的权限
(我不确定是否相关,但我几天前更新了 MariaDB。我很确定在更新之后我创建了一个新的数据库)。
CentOS Linux 7.7.1908(核心) Plesk Onyx 版本 17.8.11 更新 #80 mysql 10.4.11-1.el7.centos 10.4.11-MariaDB MariaDB 服务器
答案1
有点晚了,但对其他人可能有用。
有报告称 MariaDB 存在错误,导致 Plesk 所需的安全安装无法正常工作。
从 10.4 开始,如果数据库没有 root@localhost 并且脚本在另一个超级用户下执行,mysql_secure_installation 就会在执行开始时卡住。
这导致无法将定义者从“root”切换到另一个用户(Plesk 要求的管理员)
https://jira.mariadb.org/browse/MDEV-22486
您没有 root 用户,因为初始 Plesk 安装已将其重命名为管理员用户
因此,由于安装或更新期间安全安装失败,定义者未从 root 更改为 admin,因此 Plesk 无法连接到数据库
任何操作都会失败并出现此错误:
[root@hostname ~]# plesk db
...
MariaDB [psa]> SELECT User FROM mysql.user;
ERROR 1449 (HY000): The user specified as a definer ('root'@'localhost') does not exist
解决方案是创建一个 root@localhost 用户:
MariaDB [psa]> CREATE USER root@localhost IDENTIFIED VIA unix_socket USING 'invalid';
Query OK, 0 rows affected (0.015 sec)
为了不收到此错误:
错误:连接数据库服务器失败:视图“mysql.user”引用了无效的表、列或函数,或者视图的定义者/调用者缺乏使用它们的权限
授予权限:
MariaDB [psa]> GRANT SELECT ON *.* TO root@localhost IDENTIFIED VIA unix_socket; Query OK, 0 rows affected (0.533 sec)simply grant privileges for the new user:
从此,数据库操作将在 Plesk 中运行。但最好删除具有完全数据库访问权限的不必要用户(有利于安全),您需要将 DEFINER 改回管理员(我在文件中手动完成了此操作,但您可以通过 MySQL 中的 ALTER VIEW 执行此操作):
[root@localhost]# grep root /var/lib/mysql/mysql/*.frm
user.frm:definer_user=root
>>>
[root@localhost]# grep root /var/lib/mysql/mysql/*.frm
user.frm:definer_user=admin
刷新表以应用更改:
MariaDB [psa]> FLUSH TABLES;
Query OK, 0 rows affected (0.003 sec)
之后确保定义者被改变:
MariaDB [psa]> SHOW CREATE VIEW mysql.user;
...
| user | CREATE ALGORITHM=UNDEFINED DEFINER=`admin`@`localhost`
并删除根数据库用户:
MariaDB [psa]> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'root'@'localhost';
Query OK, 0 rows affected (0.114 sec)
MariaDB [psa]> DROP USER 'root'@'localhost';
Query OK, 0 rows affected (0.025 sec)
检查 Plesk DB 操作并确保它们全部正常运行。