踩坑紀錄
問題描述
在進行 MariaDB 10.3 升級到 10.11 的用戶遷移時,發現無法直接使用 mysqldump mysql user 的方式匯出用戶,因為 MariaDB 10.4 以後權限系統架構改變。
版本差異
| 版本 | 用戶資料表 | 說明 |
|---|---|---|
| MariaDB 10.3 及以前 | mysql.user | 傳統表結構 |
| MariaDB 10.4 及以後 | mysql.global_priv | JSON 格式儲存權限 |
錯誤示範
# ❌ 這在 10.11 會失敗,因為 mysql.user 表已不存在
mysqldump -u root -p mysql user > users.sql
解決方案
推薦方法:使用 pt-show-grants
pt-show-grants 是 Percona Toolkit 的工具,可以產生跨版本相容的 GRANT 語句。
Ubuntu 安裝 Percona Toolkit
# 方法一:直接 apt 安裝
sudo apt update
sudo apt install percona-toolkit -y
# 方法二:從 Percona 官方源安裝(較新版本)
wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb
sudo dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb
sudo apt update
sudo apt install percona-toolkit -y
驗證安裝
pt-show-grants --version
匯出用戶權限
# 在 MariaDB 10.3 主機執行
pt-show-grants -u root -p > grants.sql
# 指定遠端主機
pt-show-grants -h 192.168.1.100 -u root -p > grants.sql
匯入到 10.11
# 匯入權限
mariadb -u root -p < grants.sql
# 重載權限(重要!)
mariadb -u root -p -e "FLUSH PRIVILEGES;"
驗證遷移結果
-- 在 10.11 檢查用戶是否匯入成功
SELECT user, host FROM mysql.global_priv
WHERE user NOT IN ('root', 'mariadb.sys', 'PUBLIC', '');
-- 檢查特定用戶權限
SHOW GRANTS FOR 'appuser'@'%';
其他方法(備用)
方法二:手動產生 GRANT 語句
適用於無法安裝 pt-show-grants 的環境。
在 10.3 執行:
#!/bin/bash
OUTPUT="grants_manual.sql"
mysql -u root -p -N -e "
SELECT DISTINCT CONCAT('SHOW GRANTS FOR ''', user, '''@''', host, ''';')
FROM mysql.user
WHERE user NOT IN ('root', 'mysql.sys', '') AND user != ''" | while read cmd; do
mysql -u root -p -N -e "$cmd" 2>/dev/null | sed 's/$/;/'
done > ${OUTPUT}
方法三:含密碼 Hash 的完整匯出
如果需要保留密碼(不用重設):
#!/bin/bash
# 匯出 CREATE USER(含密碼 hash)
mysql -u root -p -N -e "
SELECT CONCAT(
'CREATE USER IF NOT EXISTS ''', user, '''@''', host,
''' IDENTIFIED BY PASSWORD ''', IFNULL(password, ''), ''';'
)
FROM mysql.user
WHERE user NOT IN ('root', 'mysql.sys', 'mariadb.sys', '')
AND user != ''" > create_users.sql
# 再用 pt-show-grants 匯出權限
pt-show-grants >> create_users.sql
注意事項
- 不要遷移系統用戶:root、mysql.sys、mariadb.sys 等系統用戶不需要遷移
- 密碼相容性:10.3 和 10.11 的密碼 hash 格式相容,可直接使用
- 認證外掛:如使用 unix_socket 或 PAM 認證,需確認 10.11 有對應外掛
- 新權限:10.11 有新增權限如
BINLOG ADMIN,舊版沒有不影響遷移 - 務必 FLUSH PRIVILEGES:匯入後一定要執行,否則權限不會生效
快速參考
# 完整遷移流程(一行指令)
# 在 10.3 主機
pt-show-grants -u root -p > grants.sql
# 複製到 10.11 主機後
mariadb -u root -p < grants.sql && mariadb -u root -p -e "FLUSH PRIVILEGES;"