Linux

無法將 MySQL 權限授予 Debian 系統維護使用者

  • March 3, 2015

我有一個專用的 Debian 7 伺服器,執行多個網站,使用 MySQL 作為數據庫伺服器。當我嘗試安裝最新更新時,由於伺服器無法停止,MySQL 無法更新。

我在這個問題中發現了有類似症狀的人:https ://superuser.com/questions/268053/debian-cant-stop-mysql-permissions

上述問題的答案建議授予對所有數據庫的完全權限 to '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

我在 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

根據您的評論,我只能建議一件事:參考我的文章Any known questions 從 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 文章Cannot GRANTprivilege as rootmysql.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;

試試看 !!!

引用自:https://serverfault.com/questions/672753