資料庫上線後,最基礎也最頻繁的操作就是連線驗證、密碼輪換、帳號權限管理。本文提供標準化操作指令與最佳實務,適合 DBA 手冊收錄。
mysql -h <主機> -u <使用者> -p[密碼] [<資料庫>] # 參數說明: # -h: 主機名或 IP,本機可省略 # -u: 使用者名稱 # -p: 後接密碼 (不安全) 或空白提示輸入 (安全) # 資料庫: 連線後預設 USE 的資料庫
| 場景 | 指令 |
|---|---|
| 本機 root 互動式輸入密碼 | mysql -u root -p |
| 遠端連線指定資料庫 | mysql -h 192.168.1.100 -u app_user -p business_db |
| 使用 Socket 連線 (繞過 TCP) | mysql -u root -p -S /var/run/mysqld/mysql.sock |
| 執行單條 SQL 後退出 | mysql -u root -p -e "SELECT VERSION();" |
| 批次執行 SQL 檔案 | mysql -u root -p db_name < script.sql |
| 垂直顯示結果 (適合寬表) | mysql -u root -p -e "SHOW ENGINE INNODB STATUS\G" |
QUIT / EXIT / \q / Ctrl+D
# 修改當前使用者密碼 (需知舊密碼) mysqladmin -u root -p'old_pass' password 'new_pass' # 修改指定使用者密碼 (需 SUPER 權限) mysqladmin -u root -p'root_pass' password 'new_pass' -u target_user
-- 8.0+ 推薦語法
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass123!';
-- 或支援密碼驗證插件
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'NewStrongPass123!';
-- 5.7 相容語法
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('NewStrongPass123!');
-- 或
UPDATE mysql.user SET authentication_string = PASSWORD('NewStrongPass123!') WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;
password_expire_interval 自動強制password_history-- 1. 建立使用者 (預設 caching_sha2_password) CREATE USER 'app_user'@'%' IDENTIFIED BY 'StrongPass123!'; CREATE USER 'readonly'@'192.168.1.%' IDENTIFIED BY 'ReadOnlyPass456!'; -- 2. 授予權限 (按最小權限原則) -- 應用帳號:核心業務 CRUD GRANT SELECT, INSERT, UPDATE, DELETE ON business_db.* TO 'app_user'@'%'; -- 唯讀帳號:報表、備份 GRANT SELECT ON business_db.* TO 'readonly'@'192.168.1.%'; -- 開發帳號:含 DDL (建表、索引) GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, DROP, INDEX ON dev_db.* TO 'dev_user'@'%'; -- 管理帳號:特定管理操作 GRANT PROCESS, REPLICATION CLIENT, SHOW DATABASES ON *.* TO 'monitor'@'10.0.0.%'; -- 3. 生效 FLUSH PRIVILEGES;
| 層級 | 語法範例 | 適用對象 |
|---|---|---|
| 全域 | GRANT SELECT ON *.* TO 'u'@'h' | 所有資料庫、所有表 |
| 資料庫 | GRANT SELECT ON db.* TO 'u'@'h' | 指定資料庫所有表 |
| 資料表 | GRANT SELECT ON db.tbl TO 'u'@'h' | 指定表 |
| 欄位 | GRANT SELECT (col1,col2) ON db.tbl TO 'u'@'h' | 指定欄位 |
-- 查看使用者權限 SHOW GRANTS FOR 'app_user'@'%'; -- 撤銷特定權限 REVOKE DELETE ON business_db.* FROM 'app_user'@'%'; -- 撤銷所有權限 REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'app_user'@'%'; -- 刪除使用者 DROP USER 'app_user'@'%';
systemctl stop mysqldmysqld_safe --skip-grant-tables --skip-networking &mysql -u rootFLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass123!';
systemctl restart mysqld「連線驗證、密碼輪換、最小權限」三件事做好,資料庫安全基線即立住。建議將上述指令封裝為 Ansible Playbook 或 Shell 腳本,納入例行維運自動化。