6

MySQL サーバー専用の新しいハード ドライブを備えた RHEL 5 システムを使用しています。開始するために、「mysqldump --host otherhost -A | mysql」を使用しましたが、マンページではこれを試すことを明示的に推奨していないことに気付きました (ファイルへの mysqldump は禁止されています。500G のデータベースについて話している)。

このプロセスはランダムな間隔で失敗し、開かれているファイルが多すぎると不平を言います (その時点で mysqld は関連するシグナルを取得し、停止して再生成します)。

sysctl と ulimit でアップしようとしましたが、問題は解決しません。私はそれについて何をしますか?

4

4 に答える 4

10

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

--lock-all-tables、-x

すべてのデータベースのすべてのテーブルをロックします。これは、ダンプ全体の期間中、グローバル読み取りロックを取得することによって実現されます。このオプションは、-single-transactionと--lock-tablesを自動的にオフにします。

于 2008-09-17T13:45:56.127 に答える
4

mysqldumpは、大規模なデータベース(1、2、3)でそのエラーを無視することが報告さますMySQLのバグからの説明と回避策:

[2007年2月3日22:00]SergeiGolubchikこれは実際にはバグではありません。

mysqldumpではデフォルトで--lock-tablesが有効になっています。これは、ダンプを開始する前に、ダンプされるすべてのテーブルをロックしようとすることを意味します。そして、本当に多数のテーブルに対してLOCK TABLES t1、t2、...を実行すると、LOCKはすべてのテーブルを開く必要があるため、必然的にすべての使用可能なファイル記述子を使い果たします。

回避策:-skip-lock-tablesは、このようなロックを完全に無効にします。または、-lock-all-tablesを使用すると、mysqldumpはFLUSH TABLES WITH READ LOCKを使用して、すべてのデータベースのすべてのテーブルを(開かずに)ロックします。この場合、-lock-all-tablesが使用されていると意味がないため、mysqldumpは自動的に--lock-tablesを無効にします。

編集:以下のコメントで、InnoDBに対するDaveの回避策を確認してください。

于 2008-09-17T13:46:11.587 に答える
0

データベースがそれほど大きい場合、いくつかの問題があります。

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

  2. mysqldump には非常に長い時間がかかり、その間テーブルをロックする必要があります。

  3. 新しいサーバーへのデータのインポートにも時間がかかります。

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

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

于 2008-09-17T21:05:51.857 に答える