用戶建立與授權兩大方式
方式一:GRANT 單條完成(推薦)
-- 建立用戶並授權(全庫全表所有權限)
GRANT ALL PRIVILEGES ON *.* TO 'test'@'localhost' IDENTIFIED BY '111111' WITH GRANT OPTION;
-- 指定庫授權
GRANT ALL PRIVILEGES ON `hzd`.* TO 'test'@'localhost' IDENTIFIED BY '111111';
-- 僅特定權限
GRANT SELECT, INSERT ON *.* TO 'test'@'%' IDENTIFIED BY '111111';
-- 僅特定表特定操作
GRANT UPDATE, DELETE ON `scut`.`student` TO 'test'@'%' IDENTIFIED BY '123';
方式二:INSERT 直操作 mysql.user 表(不推薦,易漏欄位)
INSERT INTO mysql.user (Host, User, Password)
VALUES ('localhost', 'test', PASSWORD('111111'));
FLUSH PRIVILEGES;
⚠️ MySQL 5.7+ 嚴格模式下需填寫所有 NOT NULL 無預設值欄位(如 ssl_cipher),否則報錯 Field 'ssl_cipher' doesn't have a default value。解決:修改 sql_mode 移除 STRICT_TRANS_TABLES 或改用 GRANT。
密碼修改
-- 5.7.6+ 推薦
ALTER USER 'test'@'localhost' IDENTIFIED BY 'newpass';
-- 兼容舊版
SET PASSWORD FOR 'test'@'localhost' = PASSWORD('newpass');
-- 直改 user 表(需 FLUSH PRIVILEGES)
UPDATE mysql.user SET authentication_string=PASSWORD('newpass') WHERE User='test' AND Host='localhost';
FLUSH PRIVILEGES;
用戶刪除
DROP USER 'test'@'localhost';
DROP USER 'test'@'%';
權限查看
-- 查看指定用戶權限
SHOW GRANTS FOR 'test'@'localhost';
-- 查看庫級授權用戶
SELECT User, Host FROM mysql.db WHERE Db='your_db';
權限體系完整表
| 分類 | 權限 | 說明 | 作用層級 |
| 數據操作 | SELECT | 查詢 | 表/欄位 |
| INSERT | 新增 | 表/欄位 |
| UPDATE | 修改 | 表/欄位 |
| DELETE | 刪除 | 表/欄位 |
| CREATE | 建表/庫 | 庫/表 |
| DROP | 刪表/庫 | 庫/表 |
| INDEX | 索引管理 | 表 |
| ALTER | 修改結構 | 表 |
| 管理權限 | FILE | 服務器文件讀寫 | GLOBAL |
| PROCESS | 查看/殺死線程 | GLOBAL |
| RELOAD | 刷新權限/日誌 | GLOBAL |
| SHUTDOWN | 關閉服務 | GLOBAL |
| 特殊權限 | ALL PRIVILEGES | 除 GRANT OPTION 外所有權限 | GLOBAL |
| USAGE | 僅允許登錄,無實際權限 | GLOBAL |
| 授權傳遞 | GRANT OPTION | 允許將自己的權限授予他人 | GLOBAL/DB/TABLE |
最佳實踐原則
- 最小權限:業務帳號僅授予必要庫/表的 SELECT/INSERT/UPDATE/DELETE
- 主機限制:優先
'user'@'10.0.0.%' 限制來源 IP,避免 %
- 無 GRANT OPTION:業務帳號嚴禁授予
- 強密碼策略:隨機生成 16+ 位、含特殊字符、定期輪換
- 權限審計:定期
SHOW GRANTS 掃描異常授權
常見報錯對照
| 錯誤碼 | 原因 | 解決 |
| 1364 | 嚴格模式下缺少預設值欄位 | 用 GRANT 或調整 sql_mode |
| 1045 | 密碼錯誤/主機不匹配 | 核對 Host、密碼、flush privileges |
| 1396 | 用戶已存在 | DROP USER 後重建 |