根本原因

根本原因

我有一台专用的 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) 篇帖子快速解释了根本原因

根本原因

  • 中有 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;

试一试 !!!

相关内容