服務啟動與基礎安全
- Windows:
net start mysql / sc start MySQL80
- Linux:
systemctl start mysqld (需 root 或 mysql 權限)
- 全新安裝後必做三件事:
- 刪除匿名用戶:
DELETE FROM mysql.user WHERE User='';
- 設定 root 強密碼:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'StrongPass!23';
- 限制 root 登入來源:
DELETE FROM mysql.user WHERE User='root' AND Host='%';
- 修改後
FLUSH PRIVILEGES; 或重啟服務生效
登入命令變體
mysql -uroot -p # 互動式輸入密碼
mysql -uroot -p'pass' # 直接帶密碼 (注意無空格)
mysql dbname -uroot -p # 直接選擇資料庫
mysql -h 192.168.1.100 -u app -p # 遠程連線
用戶管理兩大核心方式
方式一:GRANT 命令 (推薦、原子化、自動加密)
-- 全庫全權限 (謹慎使用)
GRANT ALL ON mydb.* TO 'admin'@'%' IDENTIFIED BY 'pass' WITH GRANT OPTION;
-- 僅讀
GRANT SELECT ON mydb.* TO 'readonly'@'%' IDENTIFIED BY 'pass';
-- 讀寫 (無 DDL)
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'rw'@'%' IDENTIFIED BY 'pass';
-- 僅特定表
GRANT UPDATE, DELETE ON mydb.logs TO 'cleaner'@'%' IDENTIFIED BY 'pass';
-- 資源限制 (每小時)
GRANT USAGE ON *.* TO 'limited'@'%' IDENTIFIED BY 'pass'
WITH MAX_QUERIES_PER_HOUR 1000
MAX_UPDATES_PER_HOUR 100
MAX_CONNECTIONS_PER_HOUR 50
MAX_USER_CONNECTIONS 5;
方式二:直接操作 mysql.user 表 (不推薦、易出錯)
- 需手動
PASSWORD() 加密
- 需手動設定
ssl_type, plugin, authentication_string 等欄位
- 8.0+ 系統表為資料字典,禁止直接 DML
權限體系詳細解析
| 分類 | 權限 | 說明 |
| 全局管理 | FILE | 伺服器檔案讀寫 (LOAD DATA INFILE, SELECT ... INTO OUTFILE) |
| PROCESS | 查看/殺死其他執行緒 (SHOW PROCESSLIST, KILL) |
| RELOAD | 重載權限表、刷新日誌 (FLUSH PRIVILEGES, FLUSH LOGS) |
| SHUTDOWN | 關閉伺服器 (mysqladmin shutdown) |
| 庫/表/欄 | ALTER | 修改表結構 (增/刪欄位、索引) |
| CREATE | 建立庫/表 |
| DELETE | 刪除記錄 |
| DROP | 刪除表/庫 |
| INDEX | 建立/刪除索引 |
| INSERT | 新增記錄 |
| SELECT | 查詢記錄 |
| UPDATE | 修改記錄 |
| 特殊 | ALL | 該層級所有權限 (相當於 root) |
| USAGE | 僅允許登入,無任何操作權限 |
權限回收與審計
-- 回收特定權限
REVOKE DELETE ON mydb.* FROM 'app'@'%';
-- 回收所有權限 (保留用戶)
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'app'@'%';
-- 刪除用戶
DROP USER 'app'@'%';
-- 審計:查看用戶權限
SHOW GRANTS FOR 'app'@'%';
SELECT * FROM mysql.user WHERE User='app';
實戰經驗總結
- 應用永不使用 root 連線,建立專用帳號,最小權限原則
- 定期審計:
SELECT User, Host FROM mysql.user WHERE User='root' AND Host='%'; 應為空
- 密碼輪換:配合
validate_password 插件強制複雜度
- 連線限制:
MAX_USER_CONNECTIONS 防止單用戶佔滿連線池
- 審計日誌:啟用
audit_log 插件記錄所有 DDL/DML