web-dev-qa-db-ja.com

2つのMySQLデータベース間でデータを転送するにはどうすればよいですか?

「MySQL Migration Toolkit」のようなツールを使用せずに、コードを使用してそれを実行したいと思います。私が知っている最も簡単な方法は、DB1への接続を(MySQLコネクタを使用して)開き、そのデータを読み取ることです。 DB2への接続を開き、データを書き込みます。より良い/最も簡単な方法はありますか?

22
Morano88

最初に、あなたがdata /ディレクトリを単にコピーする立場にないことを想定します。これは、既存のスナップショット/バックアップ/復元を使用している場合はおそらく十分です(そして、バックアップ/復元手順を格安にテストします)。 。

その場合、2つのテーブルの構造が同じであれば、一般的に最も速く、皮肉にも最も簡単なアプローチは、一方の側でSELECT ... INTO OUTFILE ...を使用し、もう一方の側でLOAD DATA INFILE ...を使用することです。

決定的な詳細については、 http://dev.mysql.com/doc/refman/5.1/en/load-data.html および.../select.htmlを参照してください。

簡単なテーブルの場合、次のように機能します。

SELECT * FROM mytable INTO OUTFILE '/tmp/mytable.csv' 
  FIELDS TERMINATED BY ',' 
  OPTIONALLY ENCLOSED BY '"' 
  ESCAPED BY '\\\\' 
  LINES TERMINATED BY '\\n' ;

LOAD DATA INFILE '/tmp/mytable.csv' INTO TABLE mytable 
  FIELDS TERMINATED BY ',' 
  OPTIONALLY ENCLOSED BY '"' 
  ESCAPED BY '\\\\' 
  LINES TERMINATED BY '\\n' ;

また、FIFOを使用して、実際にディスクに書き込むオーバーヘッドを回避したり、何らかの理由でディスクに書き込む必要がある場合は、gzipを介してパイプ処理したりすることもできます。

すなわち。

mkfifo /tmp/myfifo
gzip -c /tmp/myfifo > /tmp/mytable.csv.gz &
... SEL

ECT... INTO OUTFILE '/tmp/myfifo' .....
wait

gunzip -c /tmp/mytable.csv.gz > /tmp/myfifo &
... LOAD DATA INFILE /tmp/myfifo .....
wait

基本的に、テーブルデータをFIFOに転送することができます。圧縮したり、変更したり、ネットワークを介してハートのコンテンツにトンネリングしたりできます。

20
Recurse

FEDERATEDストレージエンジン?束の中で最速のものではありませんが、一時的、偶発的、または少量のデータで実行されます。これは、2つのサーバーについて話していることを前提としています。 1つの同じサーバー上に2つのデータベースがある場合は、次のようになります。

INSERT INTO databasename1.tablename SELECT * FROM databasename2.tablename;
12
Wrikken

mysqldumpおよびmysql(コマンドラインクライアント)を使用できます。これらはコマンドラインツールであり、作成した質問では使用したくないが、それでも(コードから実行した場合でも)使用するのが最も簡単な方法です。 mysqldumpは多くの問題を解決します。

1つのデータベースからselectsを作成し、もう1つのデータベースからinsertを作成することは非常に簡単です。ただし、データベーススキーマ(create tablesなど)、少し複雑になるので、mysqldumpをお勧めします。しかし、多くのPHP-MySQL-adminツールもこれを行うため、それらを使用したり、コードを確認したりできます。

または、MySQLレプリケーションを使用することもできます。

1
Messa

from http://dev.mysql.com/doc/refman/5.0/en/rename-table.html

2つのデータベースが同じファイルシステム上にある限り、RENAME TABLEを使用して、あるデータベースから別のデータベースにテーブルを移動できます。

RENAME TABLE current_db.tbl_name TO other_db.tbl_name;
1
ErichBSchulz

現在のサーバーでバイナリログを有効にしている場合(すべてのbinログがある場合)、2番目のサーバーのレプリケーションを設定できます。

0