解決策 1:
mysql db をいじらないでください。そこでは、users テーブル以外にも多くのことが行われています。あなたの最善の策は、「SHOW GRANTS FOR」コマンドです。私の .bashrc には、多くの CLI メンテナンス エイリアスと関数があります (実際には、.bashrc で入手した .bash_aliases です)。この機能:
mygrants()
{
mysql -B -N [email protected] -e "SELECT DISTINCT CONCAT(
'SHOW GRANTS FOR \'', user, '\'@\'', host, '\';'
) AS query FROM mysql.user" | \
mysql [email protected] | \
sed 's/\(GRANT .*\)/\1;/;s/^\(Grants for .*\)/## \1 ##/;/##/{x;p;x;}'
}
最初の mysql コマンドは SQL を使用して、2 番目の mysql コマンドにパイプされる有効な SQL を生成します。その後、出力は sed を介してパイプ処理され、きれいなコメントが追加されます。
コマンドの [email protected] により、次のように呼び出すことができます:mygrants --host=prod-db1 --user=admin --password=secret
次のように、完全な UNIX ツール キットを使用できます。
mygrants --host=prod-db1 --user=admin --password=secret | grep rails_admin | mysql --host=staging-db1 --user=admin --password=secret
それがユーザーを動かす正しい方法です。 MySQL ACL は純粋な SQL で変更されています。
解決策 2:
MySQL インスタンスから SQL Grants を抽出するには 2 つの方法があります
方法 #1
pt-show-grants を使用できます Percona ツールキットから
MYSQL_CONN="-uroot -ppassword"
pt-show-grants ${MYSQL_CONN} > MySQLUserGrants.sql
方法 #2
pt-show-grants
をエミュレートできます 以下で
MYSQL_CONN="-uroot -ppassword"
mysql ${MYSQL_CONN} --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql ${MYSQL_CONN} --skip-column-names -A | sed 's/$/;/g' > MySQLUserGrants.sql
いずれの方法でも、MySQL 付与の純粋な SQL ダンプが生成されます。あとは、新しいサーバーでスクリプトを実行するだけです:
mysql -uroot -p -A < MySQLUserGrants.sql
試してみてください!!!
解決策 3:
Richard Bronosky の回答は、私にとって非常に役に立ちました。どうもありがとう!!!
これは私にとって役に立った小さなバリエーションです。ユーザーを転送するのに役立ちます。 phpmyadmin を実行している 2 つの Ubuntu インストール間。 root、phpmyadmin、および debian-sys-maint を除くすべてのユーザーの権限をダンプするだけです。コードは
mygrants()
{
mysql -B -N [email protected] -e "SELECT DISTINCT CONCAT(
'SHOW GRANTS FOR ''', user, '''@''', host, ''';'
) AS query FROM mysql.user WHERE user NOT IN ('root','phpmyadmin','debian-sys-maint')" | \
mysql [email protected] | \
sed 's/\(GRANT .*\)/\1;/;s/^\(Grants for .*\)/## \1 ##/;/##/{x;p;x;}'
}
解決策 4:
または、percona-toolkit (以前の maatkit) を利用して pt-show-grants
を使用します (または mk-show-grants
) その目的のために。面倒なスクリプトやストアド プロシージャは必要ありません。
解決策 5:
「mysql」データベースを mysqldump して、新しいデータベースにインポートできます。 flush_privileges または再起動が必要になるため、最初に既存の mysq db をバックアップすることをお勧めします。
既存の権限を削除しないようにするには、権限テーブル (db、columns_priv、host、func など) の行を置き換えるのではなく、必ず追加してください。