データベーステーブルを別のサーバーに移動しようとしています。複雑なのは、現在テーブルを実行しているマシンにスペースがほとんどまたはまったく残っていないことです。だから私はネット上で機能することができる解決策を探しています。
srcマシンからデータベースをmysqldumpして、destでmysqlにパイプしてみました。しかし、私のデータベースには48mの行があり、auto_commitをオフにしてtrx_commitcmdを2にした場合でも; 私はいくつかの犬の遅い時間を取得しています。
mysqldump -uuser -ppass --opt dbname dbtable | mysql -h remove.server -uuser -pass dbname
次に、一度に100万行をmysqldumpしようとしました。それらをdestマシンにscpし、mysql <file.sqlを実行しますが、これは徐々に遅くなるように見えました。7番目のファイル(7,000,000)行に到達しました。次の100万回のインポートには240分かかりました。
私は少し読んでみましたが、mysqlは、CSV LOADINFILEスタイルのインポートを使用すると挿入よりも約20倍高速であることを示唆しています。だから今私は立ち往生しています。
標準のSQL構文を使用してCSVとしてエクスポートする方法を理解できます。
SELECT *
INTO OUTFILE '/tmp/tmpfile'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
ESCAPED BY '\\'
LINES TERMINATED BY '\n'
FROM table;
しかし、これは明らかに機能しません。これは、すでに不足しているディスク容量をすぐに食いつぶしてしまうためです。そこで、mysqldumpがcsvをstdoutにダンプできるようにするスイッチを探していました。私が読んだことから、それは可能ではないようです。私が考えることができる唯一の方法は、FIFOを作成し、そこにダンプするようにmysqlを指定することです。次に、FIFOを同時に読み取り、それを宛先サーバーに送信するスクリプトを記述します。ただし、他のサーバーと同期する方法の構文についてはよくわかりません。それは私の次の問題に私をもたらします。
mysqlにCSVをファイルではなくstdoutにダンプさせることができると仮定します。次に、その出力をdestサーバーにパイプするにはどうすればよいですか?容量が多いので、destサーバーで1つのcsvファイルを取得できれば幸いです。ファイルからmysqlimportを使用できるからです。
それは私の次のポイントに私をもたらします...私はこれを行うことができるようになりたいです:
mysqldump -uuser -ppass --opt dbname --tab /dev/stdout dbtable | mysqlimport -h remove.server -uuser -pass dbname
しかし、mysqlimportはそれにパイプすることをサポートしていないようです。ファイルを渡す必要があります。
これを入力しているときに考えただけです。
上記のFIFO方式を使用することは可能でしょうか。次に、mysqlimportをFIFOから読み取り、destサーバーに挿入しますか?唯一の問題は、mysqlがdestサーバーへのインポートよりも速くダンプできることだと思います。その後、srcサーバーがいっぱいになります。
mysql CSVダンプを実行してstdoutに送信し、それをネット経由でdestサーバーに転送する方法に少し迷っています(できれば同時にインポートしますが、destにファイルとしてダンプするだけでよかったです)。
どんな助けでも大歓迎です!
乾杯、ベン
更新:私はinnodbテーブルを使用しています。また、10分を超える期間はsrcボックスをシャットダウンできません。
更新: 私は現在、sshfsを使用してdestのdirをsrcにマウントし、mysqlにcsvをそのフォルダーにダンプさせています-完全に機能しているようです。次に、mysqlimportを使用して宛先のデータベースにロードするだけです。
更新:これで、データをdestボックスに取り込むことができました。インポートは、INSERTSを使用した場合と同じくらい遅いです。12時間で900万行がインポートされました。ここに何かがありません。何か案は?
更新:興味のある人のために...これも機能しません: http: //forums.mysql.com/read.php?22,154964