針對MySQL 3.22.11前不支援GRANT的版本,本文詳細說明如何手動INSERT授權表達到同等效果,並深度剖析匿名用戶導致本地連線失敗的經典案例與修復方案。
GRANT自動加密密碼,手動INSERT**必須**使用PASSWORD()函數。FLUSH PRIVILEGES或mysqladmin reload重載生效。user表,資料庫級存db表,表/欄級存tables_priv/columns_priv。tables_priv.Table_priv與columns_priv.Column_priv為SET型別,值以逗號分隔(如'Select,Insert')。INSERT INTO user VALUES ('localhost','anyname',PASSWORD('passwd'),
'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
注意:早期版本權限欄位少於14個,需用SHOW COLUMNS FROM user確認後調整。
INSERT INTO user (Host, User, Password, Reload_priv)
VALUES ('localhost','flush',PASSWORD('flushpass'),'Y');
其餘權限欄位自動預設'N'。
-- user表建立連線帳號
INSERT INTO user (Host, User, Password) VALUES ('localhost','boris',PASSWORD('ruby'));
-- db表授予資料庫權限
INSERT INTO db VALUES ('localhost','sample_db','boris',
'Y','Y','Y','Y','Y','Y','N','Y','Y','Y');
倒數第二欄'N'為Grant_priv,若需WITH GRANT OPTION改為'Y'。
GRANT ALL ON samp_db.* TO fred@%.snake.net IDENTIFIED BY 'cocoa'; % mysql -u fred -pcocoa samp_db ERROR 1045: Access denied for user: 'fred@localhost'
mysql_install_db建立初始user表含兩匿名記錄:(localhost,'')、(pit.snake.net,'')。fred@%.snake.net後,伺服器啟動時按Host排序(具體值優於萬用字元),再按User排序(非空優於空)。(localhost,root)、(localhost,'')、(pit.snake.net,root)、(pit.snake.net,'')、(%.snake.net,fred)。fred從localhost連線,**優先匹配(localhost,'')匿名記錄**,該記錄密碼為空,導致密碼不符拒絕連線。DELETE FROM user WHERE User=''; -- 同步清理db、tables_priv、columns_priv中匿名記錄 DELETE FROM db WHERE User=''; DELETE FROM tables_priv WHERE User=''; DELETE FROM columns_priv WHERE User='';
root密碼:mysqladmin -u root password 'yourpass'(3.22+)或手動UPDATE user SET Password=PASSWORD('yourpass') WHERE User='root'。mysqladmin -u root status驗證,若仍免密登入則mysqladmin -u root reload重載。理解授權表結構、排序規則與手動操作細節,是排查疑難權限問題、應對舊版本環境的核心能力。