資料庫安全的核心原則是「最小權限」。本文介紹 MySQL 8.0 兼容的用戶創建、授權與權限管理最佳實踐,避免直接使用 root 或過度授權帶來的風險。
-- 登錄 root
mysql -u root -p
-- 創建用戶(指定主機限制)
CREATE USER 'sun'@'localhost' IDENTIFIED BY 'sun123456';
-- 或允許特定 IP 範圍
CREATE USER 'sun'@'192.168.1.%' IDENTIFIED BY 'sun123456';
-- 僅授予特定數據庫權限(推薦)
GRANT ALL PRIVILEGES ON `sun`.* TO 'sun'@'localhost';
-- 或授予特定權限
GRANT SELECT, INSERT, UPDATE, DELETE ON `sun`.* TO 'sun'@'localhost';
-- 刷新生效
FLUSH PRIVILEGES;
| 權限分類 | 具體權限 | 適用場景 |
|---|---|---|
| 數據操作 | SELECT, INSERT, UPDATE, DELETE | 應用賬號 |
| 結構變更 | CREATE, DROP, ALTER, INDEX | 開發/遷移賬號 |
| 管理權限 | GRANT OPTION, SUPER, SHUTDOWN, PROCESS, FILE | DBA 專用 |
| 復制相關 | REPLICATION SLAVE, REPLICATION CLIENT | 從庫/監控賬號 |
GRANT ALL PRIVILEGES ON `mydb`.* TO 'app_user'@'10.0.0.%' IDENTIFIED BY 'strong_pass';
FLUSH PRIVILEGES;
GRANT SELECT ON `mydb`.* TO 'readonly'@'%' IDENTIFIED BY 'readonly_pass';
FLUSH PRIVILEGES;
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'10.163.225.87' IDENTIFIED BY '123';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' IDENTIFIED BY '123';
FLUSH PRIVILEGES;
GRANT 不再隱式創建用戶,必須先 CREATE USERcaching_sha2_password,舊版客戶端需指定 mysql_native_passwordCREATE ROLE、GRANT role TO user),便於批量權限管理DROP USER ''@'localhost';DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost','127.0.0.1','::1');DROP DATABASE test;SHOW GRANTS FOR 'user'@'host';ALTER USER 'user'@'host' PASSWORD EXPIRE INTERVAL 90 DAY;舊版升級至 5.7+ 時可能遇到。解決方法:修改 my.cnf 放寬 SQL 模式:
sql_mode=NO_ENGINE_SUBSTITUTION
重啟服務後重試 FLUSH PRIVILEGES。
規範的用戶與權限管理是資料庫安全的第一道防線,建議將授權腳本納入版本控制,實現基礎設施即代碼。