MySQL 作為多用戶、多線程的 SQL 服務器,安全運行的前提是合理的賬號密碼管理與精細的權限控制。本文系統總結六種修改密碼方法,並深入講解基於 GRANT 與直接操作 mysql.user 表的訪問限制設置技巧。
前提: 除 root 或擁有 SUPER/UPDATE mysql.user 權限的用戶外,普通用戶無法自行修改密碼,需管理員協助。
最直觀,直接編輯 mysql.user 表。插入用 INSERT、修改用 UPDATE、刪除用 DELETE,**務必使用 PASSWORD() 函數加密**,操作後執行 FLUSH PRIVILEGES。
mysqladmin -u root -p'oldpass' password 'newpass'
需輸入舊密碼,若 mysqladmin 無法連接服務器則失效,且無法將密碼置空。
INSERT INTO mysql.user (Host, User, Password) VALUES ('%', 'system', PASSWORD('manager'));
FLUSH PRIVILEGES;
REPLACE INTO mysql.user (Host, User, Password) VALUES ('%', 'system', PASSWORD('manager'));
FLUSH PRIVILEGES;
SET PASSWORD FOR 'system'@'%' = PASSWORD('manager');
無需 FLUSH PRIVILEGES,語義清晰,官方推薦。
GRANT USAGE ON *.* TO 'system'@'%' IDENTIFIED BY 'manager';
無需 PASSWORD() 函數,亦無需 FLUSH PRIVILEGES,最便捷。
核心提示: PASSWORD() 為單向加密函數,MySQL 內部自動驗證,切勿嘗試反解。
-- 創建超級用戶
GRANT ALL PRIVILEGES ON *.* TO 'system'@'localhost' IDENTIFIED BY 'manager' WITH GRANT OPTION;
-- 創建業務只讀賬號
GRANT SELECT ON `mydb`.* TO 'readonly'@'192.168.1.%' IDENTIFIED BY 'readonly123';
優點:語法標準、支持通配符主機、即時生效、可撤銷(REVOKE)。
MySQL 3.22.34 版本 user 表有 14 個權限字段(Select_priv 至 File_priv),需按順序填寫 Y/N:
INSERT INTO mysql.user VALUES
('localhost','system',PASSWORD('manager'), 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
FLUSH PRIVILEGES;
缺點: 版本升級字段可能變更、易寫錯順序、需手動刷新、不支持表級/列級權限。
| 權限 | 列名 | 說明 | 作用範圍 |
|---|---|---|---|
| SELECT | Select_priv | 查詢數據 | 表 |
| INSERT | Insert_priv | 插入數據 | 表 |
| UPDATE | Update_priv | 更新數據 | 表 |
| DELETE | Delete_priv | 刪除數據 | 表 |
| CREATE | Create_priv | 創建庫/表/索引 | 庫/表/索引 |
| DROP | Drop_priv | 刪除庫/表 | 庫/表 |
| RELOAD | Reload_priv | 執行 FLUSH 命令 | 服務器管理 |
| SHUTDOWN | Shutdown_priv | 關閉服務器 | 服務器管理 |
| PROCESS | Process_priv | 查看進程/慢查詢 | 服務器管理 |
| FILE | File_priv | 讀寫服務器文件(高危) | 文件系統 |
GRANT/REVOKE 管理權限,避免直接操作系統表。'%' 通配符。FILE、SHUTDOWN、PROCESS、SUPER 權限。SELECT User, Host FROM mysql.user WHERE Password='' OR Password IS NULL; 排查空密碼賬號。