2012-03-01 4 views
4

MySQLデータベース(db1)を別のデータベース(db2)にコピーする必要があることがあります。私は、このコマンドは簡潔かつ効果的であることが分かっ:mysqldumpをmysqlにパイプする

mysqldump --opt db1 | mysql db2 

それは罰金働いていたが、今では、次のエラーで破る:頭に浮かぶ

ERROR 1064 (42000) at line 1586: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'mysqldump: Couldn't execute 'SHOW TRIGGERS LIKE 'some_table_name'': MySQL server ' at line 1

まず最初は、データベースが大きすぎるということです(圧縮されていないSQLダンプは> 1G、現時点では1090526011バイトです。 mysqldump > fileを実行してからmysql < fileを実行すると、エラーは発生しません。エラーメッセージ(some_table_name)に記載されているテーブルは大きくないか、特別ではありません。

第二のアイデアは、エラーメッセージが切り捨てられる可能性があることを印象から来て、それはその上

"...MySQL server has gone away"

クイック研究は、それが(MySQLおよび/またはシステムのために)開いているファイルの最大数であることも可能だと言うと言うこと到達した。だから--skip-lock-tablemysqldumpに追加し、open-files-limitを上げようとしましたが、運と同じエラーはありません。

明白な解決策はダンプしてからインポートすることです(正常に動作します)が、パイピングはより良くなり、私にはよりきれいになります(私が間違っているかどうかを教えてください)この問題。私はコマンド配管に影響するいくつかの限界にぶつかったのですか?

私は、Linux上でMySQL 5.1.60を実行しているサーバーをホストしていて、Linux上の私の開発マシンであるMySQL 5.1.58を実行しています。後者は少し異なるエラーを与える:

mysqldump: Error 2013: Lost connection to MySQL server during query when dumping table other_table_name at row: 7197


UPDATE:問題は、パイプずに、別々のダンプおよびインポートを行うことによって解決されます。私の質問には本当に答えられないと感じていますが、ssmusokeの提案が最も受け入れられています。

答えて

2

問題は、サーバーの負荷が高すぎて、同時にダンピングとロードの両方を行うことができないことがあります。これは、拡張挿入、ファイルをダンプしてインポートする際に外来キーを無効にする機能などの最適化を失うことも意味します。

mysqldumpを使用してバックアップを生成し、mysqlを使用してロードすることをお勧めします。こうすることで、サーバーの負荷が軽減され、いつもと同じように動作します。 mysqldumpとloadコマンドを実行する必要がないように、bashスクリプトに自動化することもできます。

+0

私は負荷が接続が低下するほど高いとは思わない。たとえそれがあっても、同じ場所(同じテーブル)でいつも失敗するのは奇妙ですね。とにかく、このプロセスはスクリプト化されましたが、失敗に終わったときには、それを取り出して手で分析しなければなりませんでした。それにもかかわらず、私はそれがこのように失敗する理由を知りたい。提案ありがとう。 – parserr

2

stderrストリームとstdoutをmysqldumpからリダイレクトする必要がありますか?エラーメッセージがダンプ出力とインターリーブされている可能性があります。試してみてください

mysqldump --opt db1 | mysql db2

+0

私は実際にはしませんが、残っているのはテストでしたあなたが誤って案内してごめんなさい、私は質問を編集します。 – parserr

2

stderrをstdoutにリダイレクトしているため、エラーがSQLとして解釈されるという問題があります。 2> &を削除します。その後、実際のエラーが表示されます。

+0

実際、そのリダイレクトは残っている、私はそれなしでテストしていた、申し訳ありません。いずれにしても、ダンプをファイルにリダイレクトすると、エラーなしで行なわれるため、パイプで正しく処理する必要があります。 – parserr

+0

私は、2つのデータベースが同じサーバー上にあると仮定しています。ソースデータベースでは、mysqldumpはテーブルをロックして、通常より多くのリソースを消費するクエリを生成します。接続先データベースでは、各SQL文が実行されます。インデックスは更新され、作成されたログなどはリソースの大部分を使います。一方、sqlスクリプトには、挿入された各行に対して外部キー制約がチェックされていないような最適化がいくつか含まれており、バッチ処理された拡張挿入 –

3

「MySQLサーバーがなくなった」という現象は、最大パケットエラーの症状です。 http://dev.mysql.com/doc/refman/5.0/en/gone-away.html

のmax_allowed_pa​​cketのために、より大きな値を指定してコマンドを変更します。

mysqldump --opt db1 | mysql --max_allowed_packet=32M db2 

デフォルトは1Mです。 正しい値を得るには試行錯誤が必要です。 http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_max_allowed_packet

0

バックアップがMySQLのタイムアウト制限を超えている可能性があります。

あなたは、次のSQL文を使用していることを行うことができますMySQLを再起動することなく、これらの設定を変更する場合は、変数は、my.cnfの

net_read_timeout = 120 net_write_timeout = 900

に変更することができます。

set global net_read_timeout = 120; set global net_write_timeout = 900;

^スーパー特権が必要な場合があります

関連する問題