MySQL でユーザー権限をコピーするにはどうすればいいですか?

MySQL でユーザー権限をコピーするにはどうすればいいですか?

多くのデータベースとユーザーを含む MySQL インストールがあり、それらを新しい MySQL インストールに移行する必要があります。phpMyAdmin を使用してデータベース/テーブルをエクスポートしてからインポートすることはできますが、ユーザーと権限を移動する方法がわかりません。これを簡単に行うにはどうすればよいですか?

答え1

このようなスクリプトは、mysql cli クライアントを使用して、ユーザー アカウントを再作成するために必要な一連の grant ステートメントを出力します。このコマンドは、データベースの資格情報が .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 データベースのスキーマは時々更新されます。

これにより、不要なデータを削除したい場合に、再作成するアカウントを選択することもできます。


最近、名前にスペースが含まれているユーザーに対してこれを使用しましたが、readIFS ではデフォルトでスペース文字が区切り文字として含まれているため、混乱が生じました。私の新しい改良されたコマンドは、システムの奇妙なユーザー名に対してより適切に機能するようです。

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

関連情報