AWS RDS(MySQL 5.6.35)db.m3.medium
を使用していますが、過去2週間にテーブルの構造を変更しようとするとランダムなエラーが発生しました。
#1041 - Out of memory; check if mysqld or some other process uses all available memory; if not, you may have to use 'ulimit' to allow mysqld to use more memory or you can add more swap space
メモリがはるかに少ない非常に小さなインスタンスでさえ、このエラーに遭遇したことはありません。このインスタンスでは暗号化isが有効になっているため、負荷が少し増える可能性があることに注意してください。
コンソールでメモリ統計を確認すると、100%近く使用されているようには見えません。インスタンスがスワップしているようにも見えません。再起動後、テーブルを適切に変更できます。このテーブルは非常に小さいです... 10列未満、オーバーヘッドはほとんどなく、行数は多くありません(<100)。奇妙なことに、RDSのデフォルトのバッファーサイズ(インスタンスのメモリ割り当ての3/4)は変更していません。これだけでなく、バッファテーブルをチェックした後も、すべてが問題ないように見えました。
ここで何か不足していますか?
更新:それは再び起こりました。 RDSサーバーを再起動すると、発生している問題が軽減されます。これは、インシデント発生時のバッファ統計のスクリーンショットです(これは、問題を修正する再起動前です)...
アップデート9/1/2017:RDSインスタンスをm4.large
...にアップグレードした後、しばらくの間問題を軽減したと思っていましたが、しばらくの間はそうでした。ただし、今夜の前にいくつかの移行を実行している間...間違いなく、エラー#1041-メモリ不足です。私はすぐにCloudWatchレポートに異常がないかどうかを確認しました。解放可能なメモリは非常に高く、あまり変動していません。さらに、再起動により問題が修正されました。私はそれが再び起こるのをまだ見ていませんが、いくつかのトランザクションの数週間後には再び起こると確信しています。 データベースが破損している可能性がありますか?データベースの読み取りや書き込みに問題が発生したことはなく、すべてのアプリケーションがこのサーバーでデータベースを問題なく使用しています。 phpMyAdmin内からALTER TABLE
の変更を開始できないだけです...
私はあなたがここに一人でいるとは思わない。 AWSは5.7.11から5.7.17に私をプッシュしましたが、データベースに何らかの種類のメモリプレッシャーがあると、テーブルの変更コマンドを実行できません。
https://forums.aws.Amazon.com/thread.jspa?threadID=251866 をご覧ください
この時点で、MySQL 5.6 <5.6.37および5.7 <5.7.19に問題がある可能性があります。
残念ながら、AWS RDSには5.6.35または5.7> 5.7.17を超える5.6イメージはありません。
5.7.17を使用する前は、5.7.11をしばらくの間問題なく使用していました。データベースをダンプ/復元できる場合は、それが最適なオプションとなる可能性があります。そうでない場合は、より大きなインスタンスを試すことができます。
これはdb.m3.mediumなので、2つの問題、おそらく3つの問題が発生します。
RDSはRAM for innodb_buffer_pool_size の75%を使用しているため、OSには960Mしかありません。ヘッドルームはあまりありません。
複数のDB接続を開いたり閉じたりすると、OSが利用可能なDB接続と競合する可能性がありますRAM(私の以前の投稿を参照してください: DB接続の開閉にはどれくらいのコストがかかりますか? )
テーブルと列が多いとメモリが消費されることをご存知ですか?
Apr 22, 2014
: 非アクティブなMySQLデータベースはメモリを消費しますか?Apr 21, 2014
: 新しいテーブルの追加-メモリ使用量が増加しますSHOW OPEN TABLES;
を実行)を実行した後、開いているファイルテーブルがたくさんありますか?おそらく、FLUSH TABLES;
を実行するだけで、ALTER TABLE
コマンドを実行する直前に、以前にアクセスしたテーブルへの開いているすべてのファイルハンドルが閉じられます。
あなたが投稿したインシデント発生時のバッファ統計を見ました。
32 MBのデータしかない場合、世界でどのように372 MBをフラッシュする必要があるでしょうか。
innodb_file_format Barracuda を使用していないことを願っています。これには、InnoDBバッファープール内のページを圧縮解除する必要があります。より大きなバッファプールが必要になります。私はこれについて前に書いた:
Mar 02, 2012
: innodb_file_format BarracudaJul 22, 2013
: MySQL 5.5の高CPU使用率db.m3.mediumのみ1 vCPU。つまり、InnoDB、暗号化、OSはすべて1つのvCPUで実行されています。痛い!!!
バッファー統計によると、InnoDBバッファープール用に2664 MBがあります
次のいずれかまたは両方を実行してください。