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


12

多くのデータベースとユーザーを含むMySQLインストールがあり、新しいMySQLインストールに移行する必要があります。phpMyAdminを使用してデータベース/テーブルをエクスポートしてからインポートできますが、ユーザーとアクセス許可を移動するための情報がありません。どうすれば簡単にできますか?

回答:


17

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

3

これにより、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

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

試してみる !!!


2

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


特にmysql.userテーブル
Coops

2
両方のMySQLインスタンスが同じメインバージョンを実行していることを確認する必要があります。そうでない場合、ターゲットMySQLサーバーにバンドルされているアップグレードスクリプトを実行する必要があります。
マックスウェル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.