mysqldump | MySQLは、「オープンファイルが多すぎる」エラーを生み出します。なぜ?
質問
私の RHEL 5 システムには、MySQL サーバー専用の新しいハード ドライブが搭載されています。まず始めに、「mysqldump --host otherhost -A | mysql」を使用しましたが、マンページではこれを試すことを明示的に推奨していませんでした (ファイルへの mysqldump は禁止です。500G のデータベースについて話しています)。
このプロセスはランダムな間隔で失敗し、開いているファイルが多すぎることを訴えます (この時点で、mysqld は関連シグナルを取得し、終了して再生成されます)。
sysctl と ulimit でアップしてみましたが、問題は解決しません。それについてはどうすればよいでしょうか?
解決
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 を自動的にオフにします。
他のヒント
mysqldump は、大規模なデータベースに対してそのエラーを生成することが報告されています (1, 2, 3)。の説明と回避策 MySQLのバグ:
2007年2月3日22:00] Sergei Golubchikこれは実際にはバグではありません。
MySqldumpはデフォルトで - ロックテーブルが有効になっているため、ダンプを開始する前にすべてのテーブルをダンプするすべてのテーブルをロックしようとします。そして、LOCK TABLES t1、t2、...を実行します。ロックがすべてのテーブルを開く必要があるため、非常に多くのテーブルの場合、利用可能なすべてのファイル記述子を避けて排出します。
回避策:--skip-lock-tables は、そのようなロックを完全に無効にします。あるいは、-lock-all-tablesはmysqldumpを作成して、すべてのデータベースのすべてのテーブルをロックする読み取りロックでフラッシュテーブルを使用します(開くことなく)。この場合、MySqlDumpは、-Lock-All-Tablesが使用されるときに意味をなさないため、-Lock-Tablesを自動的に無効にします。
編集:以下のコメントで Dave による InnoDB の回避策を確認してください。
データベースがこれほど大きい場合は、いくつかの問題が発生します。
データをダンプするにはテーブルをロックする必要があります。
mysqldump には非常に長い時間がかかるため、この間テーブルをロックする必要があります。
新しいサーバーへのデータのインポートにも時間がかかります。
#1 と #2 が発生している間はデータベースが基本的に使用できなくなるため、実際にはデータベースを停止し、rsync を使用してファイルを他のサーバーにコピーすることをお勧めします。インデックスを生成するための IO と CPU が追加されないため、mysqldump を使用するよりも高速で、インポートよりもはるかに高速です。
Linux の実稼働環境では、多くの人が Mysql データを LVM パーティションに配置します。次に、データベースを停止し、LVM スナップショットを作成し、データベースを起動し、好きなときに停止したデータベースの状態をコピーします。