web-dev-qa-db-ja.com

MySQLから権限をエクスポートして、新しいサーバーにインポートするにはどうすればよいですか?

私はmysqldumpを使用してデータベースをエクスポート/インポートする方法を知っています。それは問題ありませんが、新しいサーバーに特権を取得するにはどうすればよいですか。

追加のポイントとして、新しいデータベースにいくつかの既存のデータベースがすでにあります。既存のデータベースのカップルを削除せずに古いサーバーの権限をインポートするにはどうすればよいですか。

古いサーバー:5.0.67-community

新しいサーバー:5.0.51a-24 + lenny1

編集:私は古いサーバーからdb 'mysql'のダンプを持っているので、新しいサーバーの 'my​​sql' dbとマージする適切な方法を知りたいです。

私はphpMyAdminを使用してストレート 'インポート'を試みましたが、重複(既に手動で移行したもの)に関するエラーが発生しました。

誰かが2つの「mysql」データベースをマージするエレガントな方法を手に入れましたか?

90
Gareth

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で変更されます。

171
Bruno Bronosky

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

試してみる !!!

48
RolandoMySQLDBA

リチャード・ブロノスキーの答えは私にとって非常に役に立ちました。どうもありがとう!!!

これは私にとって便利な小さなバリエーションです。これは、ユーザーの転送に役立ちます。 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;}'
}
15
rmldj

または、percona-toolkit(以前のmaatkit)を利用して、その目的でpt-show-grants(またはmk-show-grants)を使用します。面倒なスクリプトやストアドプロシージャは必要ありません。

7
MrkiMile

'mysql'データベースをmysqldumpして、新しいデータベースにインポートできます。 flush_privilegesまたは再起動が必要になるため、必ず既存のmysq dbを最初にバックアップしてください。

既存の特権が削除されないようにするには、特権テーブル(db、columns_priv、Host、funcなど)の行を置き換えるのではなく、必ず追加してください。

5
nedm

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";
    }
}
4
Ibrahim Lawal

ストアドプロシージャとしても実行できます。

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コマンドにパイプして、特権のバックアップを取得します。

4
Lenny

@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

うまくいけば、他の誰かが簡単なタスクであるべきことを達成するのに役立ちます!

3
Tom

次のコードでシェルスクリプトファイルを作成します:

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が画面に表示されます。****

2
Rony

ワンライナーは素晴らしい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ユーザーを読み取ることができます。

0
sjas