-u 指定PASSWORD()(MySQL 專用,不可逆)≠ Unix crypt()/ENCRYPT()shell> mysql -h host -u user -p'pass' # -p 後無空格直接跟密碼(不安全,僅測試用)
shell> mysql --host=host --user=user --password=pass
預設值:host=localhost、user=OS登入名、無密碼
最佳實踐:~/.my.cnf [client] 區段存密碼(權限 600),或交互式輸入。
| 層級 | 作用範圍 | 儲存表 | 典型權限 |
|---|---|---|---|
| 全域 | 所有資料庫 | mysql.user | RELOAD, SHUTDOWN, PROCESS, FILE, SUPER |
| 資料庫 | 單庫所有表 | mysql.db, mysql.host | SELECT, INSERT, UPDATE, DELETE, CREATE, DROP |
| 資料表 | 單表所有欄 | mysql.tables_priv | SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER |
| 欄位 | 單表單欄 | mysql.columns_priv | SELECT, INSERT, UPDATE, REFERENCES |
原則:mysql.user 僅授超級管理員,業務帳號務必在資料庫/表層級授權。
GRANT OPTION:允許將自己擁有的權限轉授他人FILE:LOAD DATA INFILE/SELECT ... INTO OUTFILE 讀寫伺服器檔案,**極度危險**,僅限 DBAPROCESS:SHOW PROCESSLIST 看見所有查詢文本(含敏感資料)SUPER:KILL 連線、修改全域變數、控制複寫GRANT priv_type [(col_list)] ON db.tbl TO 'user'@'host' IDENTIFIED BY 'pass' [WITH GRANT OPTION];
REVOKE priv_type ON db.tbl FROM 'user'@'host';
GRANT/REVOKE/SET PASSWORD → **即時生效**(記憶體同步)INSERT/UPDATE/DELETE mysql.* → **需 FLUSH PRIVILEGES 或 mysqladmin flush-privileges**# 安裝後初始狀態
root@localhost:超級用戶,空密碼(極度危險)
匿名用戶@localhost:可操作 test/test_% 資料庫
# 設定 root 密碼三種方式
# 1. UPDATE + FLUSH
UPDATE mysql.user SET Password=PASSWORD('newpass') WHERE User='root';
FLUSH PRIVILEGES;
# 2. SET PASSWORD (3.22+)
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass');
# 3. mysqladmin (最簡單)
mysqladmin -u root password 'newpass'
-- 超級管理員(生產慎用)
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'10.0.%' IDENTIFIED BY 'strongpass' WITH GRANT OPTION;
-- 應用讀寫帳號
GRANT SELECT,INSERT,UPDATE,DELETE ON appdb.* TO 'appuser'@'10.0.%' IDENTIFIED BY 'apppass';
-- 唯讀報表帳號
GRANT SELECT ON appdb.* TO 'readonly'@'10.0.%' IDENTIFIED BY 'ropass';
-- 僅建立帳號,後續再授權
GRANT USAGE ON *.* TO 'future'@'10.0.%' IDENTIFIED BY 'pass';
授權表按 Host 特異性降序、User 升序**排序。'%' 最寬鬆,'localhost' 較具體。匿名用戶 ''@'localhost' 優先級高於具名用戶 'user'@'%',導致本地連線意外落入匿名帳號 → **刪除匿名用戶**或顯式授權 'user'@'localhost'。