MySQL 使用者與權限管理是資料庫運維的基石。本文系統整理從建立使用者、資料庫授權、權限精細控制、刪除使用者、修改密碼到常用查詢指令的完整操作手冊,適用 MySQL 5.7+ 版本,並針對舊版 mysql.user 直接插入的風險提出現代化最佳實踐。
舊文檔常見做法:INSERT INTO mysql.user ... 直接寫入系統表。
現代風險:MySQL 5.7+ mysql.user 表結構頻繁變更 (新增 authentication_string, plugin 等欄位),直插易導致「使用者建立成功但無法登入」或權限異常。
黃金法則:**永遠使用 CREATE USER、GRANT、ALTER USER 等 SQL 標準指令**,讓伺服器自動維護系統表與權限快取。
-- 登入 root
mysql -u root -p
-- 建立使用者,指定認證插件 (推薦 caching_sha2_password)
CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'StrongP@ssw0rd!';
-- 或允許本機連線
CREATE USER 'local_user'@'localhost' IDENTIFIED BY 'LocalP@ss!';
關鍵點:
- 'user'@'host' 格式精確控制來源 (IP、網段、%、localhost)。
- MySQL 8.0 預設 caching_sha2_password,舊驅動需指定 mysql_native_password 或升級驅動。
-- 建立資料庫 (指定字元集)
CREATE DATABASE app_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 授予該資料庫所有權限
GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'192.168.1.%';
-- 精細授權範例 (僅讀、寫入)
GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'readonly_user'@'%';
-- 立即生效
FLUSH PRIVILEGES;
權限層級說明:
GLOBAL (*.*) > DATABASE (db.*) > TABLE (db.table) > COLUMN > ROUTINE/PROXY。
遵循最小權限原則:業務帳號僅授予所需資料庫的必要操作權限。
-- 修改當前使用者密碼 (MySQL 5.7+)
ALTER USER USER() IDENTIFIED BY 'NewStr0ngP@ss!';
-- 管理員修改指定使用者密碼
ALTER USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'NewStr0ngP@ss!';
-- 修改主機/重命名使用者 (MySQL 8.0+)
RENAME USER 'old_user'@'%' TO 'new_user'@'10.0.0.%';
-- 鎖定/解鎖帳號
ALTER USER 'app_user'@'%' ACCOUNT LOCK;
ALTER USER 'app_user'@'%' ACCOUNT UNLOCK;
-- 刪除使用者 (自動撤銷權限)
DROP USER 'app_user'@'192.168.1.%';
-- 刪除資料庫 (謹慎操作)
DROP DATABASE app_db;
| 指令 | 用途 |
|---|---|
SHOW DATABASES; | 列出所有資料庫 |
USE db_name; | 切換預設資料庫 |
SHOW TABLES; | 列出當前資料庫所有表 |
DESC table_name; | 顯示表結構 (同 SHOW COLUMNS) |
SHOW GRANTS FOR 'user'@'host'; | 檢視使用者實際權限 |
SELECT User, Host, plugin FROM mysql.user; | 查看所有使用者與認證插件 |
FLUSH PRIVILEGES; 或重新連線。bind-address (my.cnf)、防火牆 3306 埠、使用者 Host 欄位是否允許該 IP。validate_password 插件,需符合長度、大小寫、數字、特殊字元要求,或調整 validate_password.policy。caching_sha2_password 錯誤,執行:ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'password';。掌握這套標準化流程,配合自動化腳本 (Ansible/Shell/Python),即可構建安全、可追蹤、易維護的 MySQL 存取控制體系。