MySQL 升級、遷移、災備演練時,需將源端用戶與權限完整複製到目標端。手工重建極易遺漏,自動化腳本為標準做法。
#!/bin/bash
# exp_grants.sh
# 功能:導出所有用戶的 GRANT 語句至 grants.sql
PWD="your_root_password" # 建議用 .my.cnf 或 mysql_config_editor 避免明文
expgrants() {
mysql -B -uroot -p"${PWD}" -N -e "
SELECT CONCAT(
'SHOW GRANTS FOR ''', user, '''@''', host, ''';'
) AS query FROM mysql.user
" | \
mysql -uroot -p"${PWD}" | \
sed 's/\(GRANT .*\)/\1;/; s/^\(Grants for .*\)/-- \1 /; /--/{x;p;x;}'
}
expgrants > ./grants.sql
mysql:查詢 mysql.user 產生 SHOW GRANTS FOR 'user'@'host'; 列表mysql:執行每條 SHOW GRANTS 獲得原始輸出sed 後處理:
s/\(GRANT .*\)/\1;/:GRANT 行補分號s/^\(Grants for .*\)/-- \1 /:註釋標題行/--/{x;p;x;}:在註釋行前插入空行,提升可讀性
-- Grants for root@127.0.0.1
GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' IDENTIFIED BY PASSWORD '*EB3EA...' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON `mydb`.* TO 'root'@'127.0.0.1' WITH GRANT OPTION;
-- Grants for app_user@192.168.1.%
GRANT SELECT, INSERT, UPDATE, DELETE ON `mydb`.* TO 'app_user'@'192.168.1.%' IDENTIFIED BY PASSWORD '*ABC123...';
mysql -uroot -p < grants.sql
mysql.user 或用 pt-show-grants --separate --revoke 產生可回滾腳本WHERE user <> 'root'caching_sha2_password,5.7 用 mysql_native_password,跨大版本遷移需確認插件相容或重設密碼pt-show-grants (Percona Toolkit) 支援 --revoke、--flush、--only-users 等進階選項三行管道命令搞定權限導出:SELECT CONCAT('SHOW GRANTS...') | mysql | sed。生產遷移建議用 pt-show-grants 並配合 --revoke 產生冪等腳本。核心原則:自動化、可審計、可回滾、跨版本相容。