2008-09-17 4 views
3

私はRHEL 5システムを持っています。私はちょうどMySQLサーバー専用の新しいハードドライブを持っています。私がマンページに明示的にこれを試してはいけないことに気が付いたとしても、私は "mysqldump --host otherhost -A | mysql"を使い始めました(mysqldumpはファイルに入っていません。mysqldump | mysqlが '開いているファイルが多すぎます'というエラーが発生します。どうして?

このプロセスは、非常に多くのファイルが(その時点のmysqldに関連する信号を取得し、死ぬとrespawns)開いていることを訴えて、ランダムな間隔で失敗します。

私はsysctlのとのulimitでそれを増額しようとしたが、問題が解消されません。それについて私は何をしますか?デフォルトで

答えて

6

のmysqldumpは、すべての関連するテーブルごとのテーブルロックを実行します。 mysqlサーバプロセスのファイル記述子の量を超えることができるテーブルがたくさんある場合。 --skip-lock-tablesを試すか、ロックが必須の場合は--lock-all-tablesを指定してください。
http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html

--lock-all-tables, -x

Lock all tables across all databases. This is achieved by acquiring a global read lock for the duration of the whole dump. This option automatically turns off --single-transaction and --lock-tables.

3

のmysqldumpはより大きなデータベース(123)のためにそのエラーyeldに報告されています。 MySQL Bugsからの説明と回避策:これは本当にバグではありません[2007年2月3日22:00]セルゲイGolubchik

デフォルトでは、mysqldumpには--lock-tablesが有効になっています。つまり、ダンプを開始する前にすべてのテーブルをダンプすることを意味します。そして、LOCK TABLES t1、t2、...を実際に大きな数字のために実行すると、LOCKはすべての テーブルを開く必要があるため、必然的にすべてのファイル記述子が使い果たされます。

回避方法:--skip・ロック・テーブルは、このような完全にロックを無効にします。代わりに、 --lock-all-tablesは、すべてのデータベースのすべての テーブルを(オー​​プンしないで)ロックするFLASHHABLES WITH READ LOCKを使用するようにmysqldumpを行います。この場合、mysqldumpは自動的に --lock-tablesを無効にします。これは、--lock-all-tablesが使用されていると意味がないためです。

を編集してください。下記のコメントのDaveさんの回避策を確認してください。

+0

また、ファイルハンドルの実行の問題と、すべてのテーブルのロックを回避するinnodbテーブルtry --single-transactionを使用している場合 –

0

データベースが大きい場合は、いくつか問題があります。

  1. データをダンプするには、テーブルをロックする必要があります。

  2. のmysqldumpは非常に非常に長い時間がかかりますし、あなたのテーブルには、この期間中にロックにする必要があります。新しいサーバーにデータをインポートする

  3. も長い時間がかかります。

#1、#2は、私が実際にデータベースを停止し、他のサーバーにファイルをコピーするためにrsyncをを使用することをお勧めします起こっている間、あなたのデータベースは、本質的に使用不可能になるだろうされているので。 mysqldumpを使用するよりも高速で、インデックスを生成するIOとCPUが追加されていないため、インポートよりもはるかに高速です。

Linuxの本番環境では、多くの人がMysqlデータをLVMパーティションに配置しています。その後、データベースを停止し、LVMのスナップショットを作成し、データベースを起動し、停止したデータベースの状態を残りの時間にコピーします。

関連する問題