web-dev-qa-db-ja.com

MySQLでユーザー権限をコピーする方法は?

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

12
Nathan Osman

このようなスクリプトは、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")
17
Zoredache

これにより、すべてのユーザーに対して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} -ANe < /tmp/ShowGrants.sql | sed 's/$/;/g' > MySQLUserGrants.sql
rm -f /tmp/ShowGrants.sql

これらのツールをダウンロードして使用して、同じことを行うこともできます。

試してみる !!!

3
RolandoMySQLDBA

mysqlデータベースをバックアップおよび復元することで、このデータを移行できるはずです。

2
pkaeding