我有一個包含許多資料庫和使用者的 MySQL 安裝,我需要將其遷移到新的 MySQL 安裝。我可以使用 phpMyAdmin 匯出然後匯入資料庫/表,但我不知道有什麼可以移動使用者和權限。我怎樣才能輕鬆做到這一點?
答案1
像這樣的腳本將使用 mysql cli 用戶端列印一系列您需要用來重新建立使用者帳戶的授予語句。如果您將資料庫憑證儲存在 .my.cnf 中,則此命令效果最佳
#!/bin/bash
# adapted from (http://www.pyrosoft.co.uk/blog/2006/10/18/show-grants-for-all-users-on-mysql/)
(
mysql --batch --skip-column-names -e "SELECT user, host FROM user" mysql
) | while read user host
do
echo "# $user @ $host"
mysql --batch --skip-column-names -e"SHOW GRANTS FOR '$user'@'$host'"
done
如果您從一個版本的 mysql 跳到另一個版本,您可能需要使用它,而不是簡單地轉儲 mysql 資料庫。 mysql 資料庫的模式偶爾會更新。
如果您想消除一些多餘的內容,這也允許您選擇要重新建立的帳戶。
我最近在一個名稱中包含空格的用戶上使用了它,這令人困惑read
,因為 IFS 預設包含空格字元作為分隔符。我的新的和改進的命令似乎在奇怪的用戶名系統上工作得更好。
IFS=$'\t'; while read user host; do
echo "user:$user host:$host"
mysql --batch --skip-column-names -e"SHOW GRANTS FOR '$user'@'$host'"
echo ""
done < <(mysql --batch --skip-column-names -e "SELECT user, host FROM mysql.user")
答案2
這將為SHOW GRANTS;
每個用戶建立一個文件。
然後,回顯每個使用者的內容SHOW GRANTS;
並在每一行中加上一個分號。
MYSQL_CONN="-uroot -prootpassword"
SQLSTMT="SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';')"
SQLSTMT="${SQLSTMT} FROM mysql.user WHERE user<>''"
mysql ${MYSQL_CONN} -ANe"${SQLSTMT}" > /tmp/ShowGrants.sql
mysql ${MYSQL_CONN} -AN < /tmp/ShowGrants.sql | sed 's/$/;/g' > MySQLUserGrants.sql
rm -f /tmp/ShowGrants.sql
您也可以下載並使用這些工具來執行相同的操作:
試一試 !
答案3
我相信您應該能夠透過備份和還原資料庫來遷移這些資料mysql
。