我有一台专用的 Debian 7 服务器,运行多个网站,以 MySQL 作为数据库服务器。当我尝试安装最新更新时,由于服务器无法停止,MySQL 无法更新。
我在这个问题中找到了有类似症状的人:https://superuser.com/questions/268053/debian-cant-stop-mysql-permissions
上述问题的答案建议授予所有数据库的完全权限'debian-sys-maint'@'localhost'
,但是当我尝试授予权限时,出现访问被拒绝错误。
mysql> GRANT ALL PRIVILEGES ON *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY '...';
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
mysql> GRANT ALL PRIVILEGES ON *.* TO 'debian-sys-maint'@'localhost';
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
另一件奇怪的事情是,我的mysql.user
表中现在有两个 root 用户。这是正常的还是可能与我的问题有关?其中localhost.localdomain
一个甚至没有密码哈希。我运行的每个站点也都有一个用户,但为了清楚起见,我省略了他们。
+-----------------------+------------------+
| Host | User |
+-----------------------+------------------+
| localhost | debian-sys-maint |
| localhost | root |
| localhost.localdomain | root |
+-----------------------+------------------+
编辑:跑步dpkg-reconfigure mysql-server
说的是:
xxx@yyy:~$ sudo dpkg-reconfigure mysql-server
/usr/sbin/dpkg-reconfigure: mysql-server is broken or not fully installed
通过这个错误进行搜索,我找到了论坛帖子这表明可能存在较旧的软件包,从而造成混乱,但在我看来,情况并非如此:
xxx@yyy:~$ sudo dpkg --get-selections | grep mysql
dovecot-mysql install
libdbd-mysql-perl install
libmysqlclient18:amd64 install
mysql-client-5.5 install
mysql-common install
mysql-server install
mysql-server-5.5 install
mysql-server-core-5.5 install
php5-mysql install
答案1
我在 StackExchange 上有三 (3) 篇帖子快速解释了根本原因
Apr 24, 2014
:mysql:恢复管理员用户的所有权限Aug 07, 2013
:MySQL — 错误 1045(28000):用户访问被拒绝:权限问题May 01, 2013
:我可以从数据文件中找到 MySQL 的版本吗?
根本原因
- 中有 37 列
mysql.user
。这对于 MySQL 5.0 来说没问题 - 您正在运行 MySQL 5.5。您应该有 42 列。
建议
你必须运行 MySQL 命令
# mysql_upgrade --upgrade-system-tables
请记住,您正在跨越两个版本的 MySQL。mysql.user
在执行此操作之前,请备份表
更新时间 2015-02-10 10:59 EST
基于你的评论,我只能建议一件事:参考我的帖子从 MySQL 5.1.73 升级到 5.6.21 时存在任何已知问题吗?请参阅“问题 #1:升级路径”部分如何升级两个版本的 MySQL。
更新时间 2015-02-11 12:26 EST
你的情况如下
- 你有一个
mysql.user
兼容 MySQL 5.0 的 - 您必须
mysql.user
升级才能使用 MySQL 5.5
我有一个疯狂的想法:手动添加缺失的 5 列
在我的 DBA StackExchange 帖子中无法以 root 身份授予权限mysql.user
,我显示了来自 MySQL 5.6、5.5、5.1、5.0 和 4.x 的表中的所有列。
根据这些展示,我们将执行以下操作:
- 预先将 mysql.user 备份为 mysql.user_backup
- 构造
mysql.user
与 MySQL 5.5 相同的列,添加五 (5) 个缺失的列。 - 确保各列的顺序相同
- 使用以下命令填写 root 用户缺少的权限
Y
- 部署新权限
修复步骤mysql.user
CREATE TABLE mysql.user_backup LIKE mysql.user;
INSERT INTO mysql.user_backup SELECT * FROM mysql.user;
ALTER TABLE mysql.user
ADD Event_priv enum('N','Y') DEFAULT 'N' AFTER Create_user_priv;
ALTER TABLE mysql.user
ADD Trigger_priv enum('N','Y') DEFAULT 'N' AFTER Event_priv;
ALTER TABLE mysql.user
ADD Create_tablespace_priv enum('N','Y') DEFAULT 'N' AFTER Trigger_priv;
ALTER TABLE mysql.user
ADD plugin CHAR(64) DEFAULT NULL AFTER max_user_connections;
ALTER TABLE mysql.user
ADD authentication_string text DEFAULT 'N' AFTER plugin;
UPDATE mysql.user SET
Event_priv='Y',
Trigger_priv='Y',
Create_tablespace_priv ='Y'
WHERE user='root' and host='localhost';
FLUSH PRIVILEGES;
如果你想恢复它,你可以这样做
RENAME TABLE mysql.user TO mysql.user_old,mysql.user_backup TO mysql.user;
FLUSH PRIVILEGES;