web-dev-qa-db-ja.com

#1041-MySQLのメモリ不足の問題

Amazon RDSを使用していますdb.m1.mediumインスタンス。少なくとも40-50のデータベースと少なくとも10kのテーブルがあります。過去1年間は問題なく動作していましたが、今日は1つのテーブルを変更していました。エラーが発生し始めました。 InnoDB形式を使用しています。

テーブルを作成または変更すると、次のエラーが発生します。

#1041-メモリ不足。 mysqldまたはその他のプロセスが使用可能なメモリをすべて使用しているかどうかを確認します。そうでない場合は、mysqldがより多くのメモリを使用できるように 'ulimit'を使用する必要があるか、スワップを追加できます。

どうすれば解決できますか?

4

問題#1

あなたの主要な問題は少なくとも10000のテーブルを持つことです

ここに私が見る問題があります

RDSインスタンスはすべてInnoDBでした

10000のInnoDBテーブルがある場合、開いているファイルハンドルの数はいくつですか?

  • .frmファイル用の1つのファイルハンドル
  • .ibdファイル用の1つのファイルハンドル

これは、最大20000のオープンファイルハンドルになります。

RDSインスタンスはすべてMyISAMでした

MyISAMテーブルが10000ある場合、開いているファイルハンドルの数はいくつですか。

  • .frmファイル用の1つのファイルハンドル
  • .MYDファイル用の1つのファイルハンドル
  • .MYIファイル用の1つのファイルハンドル

これは、最大30000のオープンファイルハンドルになります。

問題#2

m1.mediumを使用しています。これには3.75 GBのRAMしかありません。

問題#3

保持するメタデータの量が多いため、10000個のテーブルを使用すると、メモリを大量に消費する可能性があります

INFORMATION_SCHEMAのメモリ消費量に関する私の古い投稿を参照してください

問題#4

運用サーバーに、休止状態ではあるがメモリを消費しているオープンDB接続が多すぎる可能性があります(私の投稿を参照してください DB接続のオープンとクローズはどのくらいコストがかかりますか?

分析

問題は、テーブル(2〜3個のファイルハンドルが必要)または変更テーブル(2〜3個のファイルハンドルが必要)を作成しようとしているときに、開いているテーブルが多すぎることです。これは、パーティションテーブルを作成しようとしてファイルハンドルが不足している状況で発生しました。これについては以前の投稿で書きました 大きなデータベーステーブルのパーティション分割に関連する可能性のあるリスクは何ですか? ここで、OS(ベアメタルサーバー)のULIMITを上げて対処しました。あなたはRDSにいるので、ULIMITを変更しても役に立ちません。

提案

単に走る

mysql> FLUSH TABLES;

開いているファイルハンドルを持つすべてのテーブルを閉じます。

特定の開いているテーブルを閉じたい場合は、開いているテーブルを

mysql> SHOW OPEN TABLES FROM <database>;

次に、このように明示的にテーブルを閉じる必要があります

mysql> FLUSH TABLES db1.tb1,db2,tb2,db3.tb3;

FLUSH TABLES;を実行した後、CREATE TABLEまたはALTER TABLEを実行できます。

RAMがはるかに大きい別のサーバーモデルにアップグレードする必要がある場合もあります。

テーブルの数を減らすことはできますが、データをアーカイブして非アクティブなデータベースを削除することができます。これにより、INFORMATION_SCHEMAで消費されるRAMが削減されます。

また、プールされていないすべてのDB接続を閉じる必要があります。

試してみる !!!

5
RolandoMySQLDBA