私はmysqldumpを使用してデータベースをエクスポート/インポートする方法を知っています。それは問題ありませんが、新しいサーバーに特権を取得するにはどうすればよいですか。
追加のポイントとして、新しいデータベースにいくつかの既存のデータベースがすでにあります。既存のデータベースのカップルを削除せずに古いサーバーの権限をインポートするにはどうすればよいですか。
古いサーバー:5.0.67-community
新しいサーバー:5.0.51a-24 + lenny1
編集:私は古いサーバーからdb 'mysql'のダンプを持っているので、新しいサーバーの 'mysql' dbとマージする適切な方法を知りたいです。
私はphpMyAdminを使用してストレート 'インポート'を試みましたが、重複(既に手動で移行したもの)に関するエラーが発生しました。
誰かが2つの「mysql」データベースをマージするエレガントな方法を手に入れましたか?
Mysql dbをいじらないでください。そこでは、usersテーブル以外にもたくさんのことが行われています。あなたの最善の策は、「 SHOW GRANTS FOR」コマンドです。私の.bashrcには、多くのCLIメンテナンスエイリアスと関数があります(実際、自分の.bashrcで調達した.bash_aliases)。この機能:
mygrants()
{
mysql -B -N $@ -e "SELECT DISTINCT CONCAT(
'SHOW GRANTS FOR \'', user, '\'@\'', Host, '\';'
) AS query FROM mysql.user" | \
mysql $@ | \
sed 's/\(GRANT .*\)/\1;/;s/^\(Grants for .*\)/## \1 ##/;/##/{x;p;x;}'
}
最初のmysqlコマンドはSQLを使用して、2番目のmysqlコマンドにパイプされる有効なSQLを生成します。次に、sedを介して出力がパイプ処理され、きれいなコメントが追加されます。
コマンドの$ @を使用すると、次のように呼び出すことができます。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で変更されます。
MySQLインスタンスからSQL許可を抽出する方法は2つあります
方法#1
Percona Toolkitの pt-show-grants を使用できます
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
試してみる !!!
リチャード・ブロノスキーの答えは私にとって非常に役に立ちました。どうもありがとう!!!
これは私にとって便利な小さなバリエーションです。これは、ユーザーの転送に役立ちます。 phpmyadminを実行する2つのUbuntuインストール間。 root、phpmyadmin、debian-sys-maint以外のすべてのユーザーの特権をダンプするだけです。次にコードは
mygrants()
{
mysql -B -N $@ -e "SELECT DISTINCT CONCAT(
'SHOW GRANTS FOR ''', user, '''@''', Host, ''';'
) AS query FROM mysql.user WHERE user NOT IN ('root','phpmyadmin','debian-sys-maint')" | \
mysql $@ | \
sed 's/\(GRANT .*\)/\1;/;s/^\(Grants for .*\)/## \1 ##/;/##/{x;p;x;}'
}
または、percona-toolkit(以前のmaatkit)を利用して、その目的でpt-show-grants
(またはmk-show-grants
)を使用します。面倒なスクリプトやストアドプロシージャは必要ありません。
'mysql'データベースをmysqldumpして、新しいデータベースにインポートできます。 flush_privilegesまたは再起動が必要になるため、必ず既存のmysq dbを最初にバックアップしてください。
既存の特権が削除されないようにするには、特権テーブル(db、columns_priv、Host、funcなど)の行を置き換えるのではなく、必ず追加してください。
PHPスクリプトですか?)
このスクリプトのソースを表示すると、リストされているすべての特権が得られます。
//connect
mysql_select_db("mysql", mysql_connect("localhost","root",""));
//create grants select statements
$rs = mysql_query("SELECT DISTINCT CONCAT('SHOW GRANTS FOR ''', user, '''@''', Host, ''';') AS query FROM user");
//iterate through grants
while ($row=mysql_fetch_array($rs)) {
//run grant query
$rs2 = mysql_query($row['query']);
//iterate through results
while($row2 = mysql_fetch_array($rs2)){
//print results
echo $row2[0] . ";\n\n";
}
}
ストアドプロシージャとしても実行できます。
CREATE PROCEDURE spShowGrants()
READS SQL DATA
COMMENT 'Show GRANT statements for users'
BEGIN
DECLARE v VARCHAR(64) CHARACTER SET utf8;
DECLARE c CURSOR FOR
SELECT DISTINCT CONCAT(
'SHOW GRANTS FOR ', user, '@', Host, ';'
) AS query FROM mysql.user;
DECLARE EXIT HANDLER FOR NOT FOUND BEGIN END;
OPEN c;
WHILE TRUE DO
FETCH c INTO v;
SET @v = v;
PREPARE stmt FROM @v;
EXECUTE stmt;
END WHILE;
CLOSE c;
END
そしてそれを呼び出す
$ mysql -p -e "CALL spShowGrants" mysql
次に、出力をRichards sedコマンドにパイプして、特権のバックアップを取得します。
@Richard Bronoskyの答えは正しいようですが、あるサーバーから別のサーバーに一連のデータベースを移行しようとした後でこの質問に遭遇し、解決策ははるかに簡単でした。
server1$ mysqldump -u root -p --all-databases > dbdump.sql
server2$ mysql -u root -p < dbdump.sql
この時点で、root
としてログインした場合、すべてのデータが表示されました。mysql.user
テーブルには期待どおりのものがすべて含まれていましたが、他のユーザーとしてログインできず、 GRANT
ステートメントを再発行する必要があると想定して、この質問を見つけました。
ただし、mysql.*
テーブルの更新された権限を有効にするには、mysqlサーバーを再起動するだけでよいことがわかります。
server2$ Sudo restart mysql
うまくいけば、他の誰かが簡単なタスクであるべきことを達成するのに役立ちます!
次のコードでシェルスクリプトファイルを作成します:
echo "SELECT DISTINCT CONCAT (\"show grants for '\", user, \"'@'\", Host, \"';\") AS query FROM mysql.user; " > script.sql
echo "*** You will be asked to enter the root password twice ******"
mysql -u root -p < script.sql > output.sql ;
cat output.sql | grep show > output1.sql ; rm output.sql -f ;
mysql -u root -p < output1.sql > output.sql ;
clear
echo "-----Exported Grants-----"
cat output.sql ; rm output.sql output1.sql -f
echo "-------------------------"
rm script.sql -f
****次に、シェルで次のように実行します。ルートパスワードを2回入力するように求められ、その後、GRANTS SQLが画面に表示されます。****
ワンライナーは素晴らしいpt-show-grants
:
mysql --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',Host,''';') FROM mysql.user WHERE user<>''" | mysql --skip-column-names -A | sed 's/$/;/g'
UNIXツールのみに基づいており、追加のソフトウェアは必要ありません。
Bashシェル内から実行します。機能している.my.cnf
どこにあなたのパスワードmysql root
ユーザーを読み取ることができます。