| 權限 | 說明 | 典型場景 |
| ALL PRIVILEGES | 所有權限(除 GRANT OPTION) | 管理帳號 |
| SELECT | 查詢 | 唯讀報表帳號 |
| INSERT/UPDATE/DELETE | 增刪改 | 應用帳號 |
| CREATE/DROP/ALTER | 結構變更 | 遷移腳本/管理工具 |
| INDEX | 索引管理 | DBA |
| LOCK TABLES | 鎖表 | 備份工具 |
| CREATE VIEW/SHOW VIEW | 視圖 | 開發/報表 |
| EXECUTE | 執行存儲程序/函式 | 應用帳號 |
| RELOAD/SHUTDOWN/PROCESS | 管理操作 | 監控/備份帳號 |
| REPLICATION SLAVE/CLIENT | 複制相關 | 從庫帳號 |
授權實戰範例
1. 應用讀寫帳號(最常見)
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE
ON myapp.* TO 'app_user'@'%';
2. 唯讀報表帳號
GRANT SELECT ON myapp.* TO 'readonly'@'%';
3. 開發/測試全權限
GRANT ALL PRIVILEGES ON dev_db.* TO 'dev'@'%';
4. 特定表/欄位級權限
GRANT SELECT (id, username, email) ON myapp.users TO 'api_user'@'%';
GRANT UPDATE (status) ON myapp.orders TO 'order_service'@'%';
5. 通配符資料庫(多租戶)
GRANT ALL PRIVILEGES ON `tenant_%`.* TO 'saas_admin'@'%';
資源限制(防止佔用過多連線/查詢)
-- 每小時最大查詢 1000 次、連線 20 次、並發連線 5 個
GRANT USAGE ON *.* TO 'app_user'@'%'
WITH MAX_QUERIES_PER_HOUR 1000
MAX_CONNECTIONS_PER_HOUR 20
MAX_USER_CONNECTIONS 5;
查看限制:SHOW GRANTS FOR 'app_user'@'%';
撤銷權限
REVOKE DELETE ON myapp.* FROM 'app_user'@'%';
REVOKE ALL PRIVILEGES ON *.* FROM 'old_user'@'%';
關鍵生效步驟
FLUSH PRIVILEGES;
-- MySQL 8.0+ 通常自動生效,但執行一下無妨
密碼管理與安全加固
-- 修改密碼
ALTER USER 'myuser'@'%' IDENTIFIED BY 'NewStr0ng!Pass';
-- 密碼過期策略
ALTER USER 'myuser'@'%' PASSWORD EXPIRE INTERVAL 90 DAY;
-- 密碼歷史(防重複使用)
ALTER USER 'myuser'@'%' PASSWORD HISTORY 5;
-- 強制 SSL 連線
ALTER USER 'myuser'@'%' REQUIRE SSL;
常見問題排查
| 現象 | 原因 | 解決 |
| Access denied | Host 不匹配 | 建立對應 Host 的用戶或用 % |
| Plugin caching_sha2_password | 8.0 預設插件舊驅動不支援 | ALTER USER ... IDENTIFIED WITH mysql_native_password BY 'pwd' |
| 權限不生效 | 未 FLUSH PRIVILEGES / 快取 | 執行 FLUSH PRIVILEGES 或重新連線 |
自動化腳本範例
#!/bin/bash
# create_db_user.sh
DB_USER=$1
DB_PASS=$2
DB_NAME=$3
mysql -u root -p"${ROOT_PASS}" <
結語
遵循最小權限原則:應用帳號僅授必要增刪改查,嚴禁 root/ALL PRIVILEGES 直連業務。定期審計 mysql.user、mysql.db、mysql.tables_priv,撤銷無用帳號。
copyright ©
萬盛學電腦網 all rights reserved