別の名前でmysqlデータベースを復元する


回答:


58

データベースを作成または選択しないように、mysqldumpでダンプを作成できます。

例:データベースdb1をダンプし、データベースdb2にロードしています

これにより、CREATE DATABASEとUSEコマンドがダンプに入れられます

mysqldump -u... -p... --routines --triggers --databases db1 > /root/db1.sql

これ、CREATE DATABASEおよびUSEコマンドをダンプに入れませんこれはあなたが望むものです

mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql

次の4つの方法のいずれかで、別のデータベース(db2など)にロードできます。

オプション1

$ mysqldump -u... -p... --routines --triggers db1 | mysql -u... -p... -A -Ddb2

オプション2

$ mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql
$ mysql -u... -p... -A -Ddb2 < /root/db1.sql

オプション3

$ mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql
$ mysql -u... -p... -A -Ddb2
mysql> source /root/db1.sql

オプション4

$ mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql
$ mysql -u... -p... -A
mysql> use db2
mysql> source /root/db1.sql

試してみる !!!


他の誰かがこれに苦労し-Ddb2た場合、その前にハイフンを付けてはいけません。少なくとも、含めるとMySQL構文エラーが発生しました。
gwg

これはうまくいかないようです。私のダンプにはCREATEまたはUSEデータベースがありませんが、それでもALTER DATABASE ... CHARACTER SET ...インポートが壊れています。編集:Oracleは基本的にバグを無視しています。
mpen

5

私はダンプ、編集、挿入の大ファンです。ただし、テキストファイル(ダンプファイル)を開いて変更する必要はありません(これは、数百万行の長さがある場合に特に便利です)。データベースをダンプする場合MYDATABASE

mysqldump MYDATABASE > mydump.sql

次に、sedを使用して、古いデータベース名をこのような新しいデータベース名に置き換えます

sed -i 's/MYDATABASE/MYNEWDATABASE/g' mydump.sql

次に、新しいデータベースを作成して再度インポートするだけで、新しいデータベースMYNEWDATABASEにすべてのテーブルが作成されます。

mysqladmin create MYNEWDATABASE

mysql MYNEWDATABASE < mydump.sql

編集:コメントセクションのいい人が指摘したように、これによって上記のデータの一部が変更された場合、これを回避する具体的な方法は危険です。

1)このように、変更する前に、ダンプでこれをGrepします。

cat mydump.sql | grep "MYDATABASE"

そして

2)次のように `を追加してより安全にすることができます:

sed -i 's/`MYDATABASE`/`MYNEWDATABASE`/g' mydump.sql

誰か他に具体的な提案があれば、さらに4年以内に回答を編集できます。


質問は、既存のDB内の1つのテーブルをコピーするだけではなく、全体のデータベースを別の名前で復元することだったと思います。
マイケルグリーン14

3
sedの部分が必要です
スティーブブゾナス

10
このコマンドは悪い考えであり、できれば私は反対票を投じます。文字列の置換を行う場合は、少なくともCREATE TABLEとUSEの行を一致させて、他のデータを置換しないようにします。
bksunday

1
sedコマンド(sed -i 's/MYDATABASE/MYNEWDATABASE/g' mydump.sql)を実行する前にcat mydump.sql | grep "MYDATABASE"、データベース名のみが変更されていることを確認するためにMYDATABASEのすべての出現をチェックします。他のデータは変更されません。
ラファフターシン

1
sed -i 's/`MYDATABASE`/`MYNEWDATABASE`/g' mydump.sql #より安全な蒸気編集。データベースダンプにはUSEまたはCREATE DATABASEステートメントは含まれていませんが、データベース名はSQLコメント、ビュー、およびトリガーに含まれています(MySQL 5.7)。これはコメント内のデータベース名を置き換えませんが、結果のデータベースには影響しません。これは私にとってはうまくいきました。
ジョナサン

3

私はこれを一昔前にやったことがあります。

すべてのデータをエクスポートするとき、ファイルの先頭にデータベース名を設定するオプションがあります。「データベースxを使用」などです。

そのため、この宣言を変更できます。


3

ファイルは、あなたが手に持っているものであり、あなたがシェル/コンソールから、それを操作している場合は、私が使用するsedで始まる行に文字列置換を行うにはCREATE DABATASECREATE TABLEUSEおよびoptionnally --(mysqldumpをコメント)

「データベースの作成」、「テーブルの作成」、「使用」、および「mysqldump」のコメントに一致する行のデータベース名を置き換える

dbfile="yoursqldumpfile.sql";
dbname="current_db_name";
dbnewname="new_db_name";
dbnewfile="/tmp/$dbnewname.sql";
cat $dbfile | sed "/^CREATE DATABASE/ s=$dbname=$dbnewname=" | sed "/^CREATE TABLE/ s=$dbname=$dbnewname=" | sed "/^USE / s=$dbname=$dbnewname=" | sed "/^-- / s=$dbname=$dbnewname=" > $dbnewfile


もちろん、ここでの回答の多くが言及しているように、mysqldumpバックアップにCREATE DATABASEとUSE行が含まれていなければ簡単です。オプション意味--all-databases--databasesまたはその短いバージョン-Aまたは-B使用されませんでした。


MySQL 5.7では、mysqldumpは、またはの--no-create-db有無にかかわらず、トリガーとビューにデータベース名を含めます。--database--databases
ジョナサン

2

次の2つのルールを使用してダンプを行う場合:

  1. --databases、などのオプションを使用せず--database、単にこれらのオプションなしでデータベース名をコマンドの最後に置くだけです。
  2. オプションを含める --no-create-db

以下を実行すると、mysqldumpはデータベースを参照せずにSQLを作成し、インポート中にmysqlコマンドの最後に新しいデータベース名を使用できます!

mysqldump  --no-create-db old_db_name --single-transaction --compress --order-by-primary --host old_db_host -u old_db_user -pOld_db_password | mysql --host new_host -u new_user -pnewpassword new_db_name

MySQL 5.7では、mysqldumpは、またはの--no-create-db有無にかかわらず、トリガーとビューにデータベース名を含めます。--database--databases
ジョナサン

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.