mysqldump | MySQLは、「オープンファイルが多すぎる」エラーを生み出します。なぜ?

StackOverflow https://stackoverflow.com/questions/83242

  •  01-07-2019
  •  | 
  •  

質問

私の 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 の回避策を確認してください。

データベースがこれほど大きい場合は、いくつかの問題が発生します。

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

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

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top