web-dev-qa-db-ja.com

mysql致命的エラー:バッファプールにメモリを割り当てることができません

MySQLからこのエラーログがあります。ウェブサイトはしばらく動作しますが、数時間後にMySQLが完全にシャットダウンします。

140919 10:48:27 [Warning] Using unique option prefix myisam-recover instead of myisam-recover-options is deprecated and will be removed in a future release. Please use the full name instead.
140919 10:48:27 [Note] Plugin 'FEDERATED' is disabled.
140919 10:48:27 InnoDB: The InnoDB memory heap is disabled
140919 10:48:27 InnoDB: Mutexes and rw_locks use GCC atomic builtins
140919 10:48:27 InnoDB: Compressed tables use zlib 1.2.3.4
140919 10:48:28 InnoDB: Initializing buffer pool, size = 128.0M
InnoDB: mmap(137363456 bytes) failed; errno 12
140919 10:48:28 InnoDB: Completed initialization of buffer pool
140919 10:48:28 InnoDB: Fatal error: cannot allocate memory for the buffer pool
140919 10:48:28 [ERROR] Plugin 'InnoDB' init function returned error.
140919 10:48:28 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
140919 10:48:28 [ERROR] Unknown/unsupported storage engine: InnoDB
140919 10:48:28 [ERROR] Aborting

140919 10:48:28 [Note] /usr/sbin/mysqld: Shutdown complete

140919 10:48:28 [Warning] Using unique option prefix myisam-recover instead of myisam-recover-options is deprecated and will be removed in a future release. Please use the full name instead.
140919 10:48:28 [Note] Plugin 'FEDERATED' is disabled.
140919 10:48:28 InnoDB: The InnoDB memory heap is disabled
140919 10:48:28 InnoDB: Mutexes and rw_locks use GCC atomic builtins
140919 10:48:28 InnoDB: Compressed tables use zlib 1.2.3.4
140919 10:48:28 InnoDB: Initializing buffer pool, size = 128.0M
InnoDB: mmap(137363456 bytes) failed; errno 12
140919 10:48:28 InnoDB: Completed initialization of buffer pool
140919 10:48:28 InnoDB: Fatal error: cannot allocate memory for the buffer pool
140919 10:48:28 [ERROR] Plugin 'InnoDB' init function returned error.
140919 10:48:28 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
140919 10:48:28 [ERROR] Unknown/unsupported storage engine: InnoDB
140919 10:48:28 [ERROR] Aborting

140919 10:48:28 [Note] /usr/sbin/mysqld: Shutdown complete
34
Hakim

TLDR;

Mysqlはメモリ不足のため再起動できません。適切なスワップファイルが設定されていることを確認してください。

助けなかった?それがあなたの問題でない場合、研究を続けるためのより質の高い質問は次のとおりです。

バックグラウンド

EC2でセットアップした最初のシステムでまさにこの問題が発生し、「データベース接続の確立エラー」が発生するwordpressサイトがダウンすることが特徴でした。

ログには、OPが投稿したのと同じエラーが示されました。私のエラーの読み取り(タイムスタンプは削除されました):

  • メモリ不足エラー:InnoDB: Fatal error: cannot allocate memory for the buffer pool
  • InnoDBは十分なメモリなしで起動できません[ERROR] Plugin 'InnoDB' init function returned error. [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed. [ERROR] Unknown/unsupported storage engine: InnoDB [ERROR] Aborting
  • mysqldがシャットダウンしています。このコンテキストでは、本当に再起動に失敗しています。 [Note] /usr/sbin/mysqld: Shutdown complete

/var/log/syslogをチェックしてmysqlを検索すると、次の結果が得られます。

Out of memory: Kill process 15452 (mysqld) score 93 or sacrifice child
Killed process 15452 (mysqld) total-vm:888672kB, anon-rss:56252kB, file-rss:0kB
init: mysql main process (15452) killed by KILL signal
init: mysql main process ended, respawning
type=1400 audit(1443812767.391:30): apparmor="STATUS" operation="profile_replace" name="/usr/sbin/mysqld" pid=21984 comm="apparmor_parser"
init: mysql main process (21996) terminated with status 1
init: mysql main process ended, respawning
init: mysql post-start process (21997) terminated with status 1
<repeated>

注:cronによってログがローテーションされる前にエラーが発生した場合、アーカイブされたログをgunzipして検索する必要がある場合があります。

解決

私の場合、根本的な問題は、スワップファイルの設定を怠ったことです。

free -mを実行して、設定されているかどうかを確認できます。

total used free shared buffers cached Mem: 604340 587364 16976 0 29260 72280 -/+ buffers/cache: 485824 118516 Swap: 0 0 0

上記の例では、Swap:0はスワップファイルがないことを示します。

設定のチュートリアル:

より大きなものが必ずしも良いとは限らないことに注意してください!buntuガイド から:

「戻り値の減少」とは、RAMサイズの2倍よりも多くのスワップスペースが必要な場合は、RAMをさらに追加することを意味します。ハードディスクドライブ(HDD)アクセスはRAMアクセスよりも約10³遅いため、1秒かかるものが突然15分以上かかります!さらに、高速ソリッドステートドライブ(SSD)で1分以上...


ここの他の回答について...

The InnoDB memory heap is disabled

これは実際にはエラーではなく、InnoDBが独自のシステムではなくシステムの内部メモリアロケーターを使用していることを示しています。デフォルトはyes/1で、実稼働環境で受け入れられます。

ドキュメントによると、このコマンドは非推奨であり、5.6以降のMySQLバージョンでは削除されます(MariaDBを想定しています)。

http://dev.mysql.com/doc/refman/5.6/en/innodb-performance-use_sys_malloc.html

おかげで: ルーベン・シェードのコメント

[Note] Plugin 'FEDERATED' is disabled.

FEDERATEDが無効になっているというメッセージはエラーではありません。これは、FEDERATEDエンジンがmysqlサーバーに対してオンになっていないことを意味します。デフォルトでは使用されません。必要ない場合は、このメッセージを気にしないでください。

参照: https://stackoverflow.com/a/16470822/2586761

56
ptim

解決策はより多くのスペースではありません、問題はApache Webサーバーがmysqlではなく、実際にinnodb-buffer-pool-sizeを減らす必要があることです

このバッファーはmysqlプロセスが最初から使用するため、Apacheがさらにリソースを必要とする場合、カーネルはサービスからRAMをクリアします。これはサーバーをクラッシュさせる代わりにmysqlを停止することを意味します。

また、ngnxまたはhttplightに変更したくない場合は、CRONを追加してdbステータスを確認し、再起動します。

3
nodws

この回答が議論に追加されていることがわかりました: https://www.digitalocean.com/community/questions/mysql-server-keeps-stopping-unexpectedly?answer=26021

つまり、innodb_buffer_pool_sizeを64Mなどの適切な値に設定することに加えて、/ etc/Apache2/mods-enabled/mpm_prefork.confを変更して、Apacheによって開始される接続の数を減らす必要があります。

<IfModule mpm_prefork_module>
    StartServers     3
    MinSpareServers  3
    MaxSpareServers  5
    MaxRequestWorkers 25
    MaxConnectionsPerChild   1024
</IfModule>
2
Joe T