Amazon EC2、InnoDB:mmap(xバイト)が失敗したため、mysqlが異常終了しました。エラー番号12


95

ここで読んだ内容に基づいて、EC2にマイクロインスタンスサーバーをセットアップしました

mysqlサーバーが頻繁に失敗し、3回目のmysqlサーバーがなくなった。ログは示すだけです

120423 09:13:38 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
120423 09:14:27 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
120423  9:14:27 [Note] Plugin 'FEDERATED' is disabled.
120423  9:14:27 InnoDB: The InnoDB memory heap is disabled
120423  9:14:27 InnoDB: Mutexes and rw_locks use GCC atomic builtins
120423  9:14:27 InnoDB: Compressed tables use zlib 1.2.3
120423  9:14:27 InnoDB: Using Linux native AIO
120423  9:14:27 InnoDB: Initializing buffer pool, size = 512.0M
InnoDB: mmap(549453824 bytes) failed; errno 12
120423  9:14:27 InnoDB: Completed initialization of buffer pool
120423  9:14:27 InnoDB: Fatal error: cannot allocate memory for the buffer pool
120423  9:14:27 [ERROR] Plugin 'InnoDB' init function returned error.
120423  9:14:27 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
120423  9:14:27 [ERROR] Unknown/unsupported storage engine: InnoDB
120423  9:14:27 [ERROR] Aborting

本当にfailed; errno 12何ですか?そして、これを修正するために必要なスペースやメモリなどをどのように与えることができますか?

システム全体を再起動してすべてのログを削除し、mysqlサーバーを再起動することで、毎回これを修正します。しかし、設定に問題があることを知っています。

また、私の `my.cnf 'は以下のようになります。

[mysqld]
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under different user or group,
# customize your systemd unit file for mysqld according to the
# instructions in http://fedoraproject.org/wiki/Systemd
# max_allowed_packet=500M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0


innodb_buffer_pool_size         = 512M


[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

EC2マイクロインスタンスにも同じ問題があります。innodb_buffer_pool_size = 128Mを設定してみたところ、どのようになるかがわかります。
swxxii

マイクロインスタンスを使用している場合は、スワップスペースの追加が必要になることがあります。prowebdev.us
2012/05

1
EC2マイクロインスタンスでは、デフォルトでスワップスペースはなく、手動で設定する必要があります。そうしないと、メモリ不足が原因で多くのMySQLがクラッシュする可能性があります。
12

回答:


163

RDSを使用せずにマイクロインスタンスでワードプレスを実行しようとしたときに、同じ問題が発生しました。

スワップページを追加すると問題が解決しました。

以下の手順に従って、スワップ領域を設定できます。

それでも機能しない場合は、RDSサービスの使用を検討してください。

===============================================

記録のためにブログの内容をコピーしました。クレジットはブログ作成者のpmoubedに送られます:

Amazon EC2マイクロインスタンスのスワップスペース-Linux

Amazon EC2 Linux Microインスタンスがあります。Microインスタンスには613MBのメモリしかないため、MySQLは時々クラッシュしました。MySQL、マイクロインスタンス、およびメモリ管理についての長い検索の結果、マイクロインスタンスにはデフォルトのSWAPスペースがないことがわかりました。したがって、クラッシュを回避したい場合は、マイクロインスタンスのスワップスペースを設定する必要がある場合があります。実際には、スワップを有効にした方がパフォーマンスが優れています。

以下の手順は、マイクロインスタンスのスワップスペースを作成する方法を示しています。マイクロインスタンスが実行されているAWSアカウントを持っていると思います。

  1. 走る dd if=/dev/zero of=/swapfile bs=1M count=1024
  2. 走る mkswap /swapfile
  3. 走る swapon /swapfile
  4. この行/swapfile swap swap defaults 0 0を追加/etc/fstab

再起動するたびにスワップファイルを自動的に有効にする場合は、手順4が必要です。

SWAPスペースに関連するいくつかの便利なコマンド:

$ swapon -s   
$ free -k

$ swapoff -a
$ swapon  -a

参照:

  1. http://www.thegeekstuff.com/2010/08/how-to-add-swap-space/
  2. http://cloudstory.in/2012/02/getting-the-best-out-of-amazon-ec2-micro-instances/
  3. http://cloudstory.in/2012/02/adding-swap-space-to-amazon-ec2-linux-micro-instance-to-increase-the-performance/
  4. http://aws.amazon.com/ec2/instance-types/

ありがとう!これは私を助けました!
元に戻す

8
ちなみに、これはデジタルオーシャンドロップレット(512 MB)で機能しました。これは誰かを驚かせるはずではありませんが、確信がない人がいる場合は、同じ問題のあるすべてのサーバーで動作するでしょう。
jfacemyer 2013年

このライフセーバーをありがとう!Ubuntu Serverでマイクロインスタンスも実行していました。
ECC-Dan

4
デジタルオーシャンユーザーのために、私はこのチュートリアルに続く、それが魅力のように働いた:digitalocean.com/community/articles/...
クリス・レイ

どうもありがとう。過去24時間、髪の毛を抜いていて、あらゆる種類のバッファ/キャッシュ/クエリサイズで遊んでいました。あなたは命の恩人です!
プランシュ14

23

Amazon EC2マイクロインスタンスでもこの問題が発生しました。以下を追加してinno_dbのメモリ使用量を減らしてみました/etc/my.cnf

innodb_buffer_pool_size = 64M

それはうまくいきませんでした、私はそれを1600万に落としてみました、そしてそれはまだ動きませんでした。その後、インスタンスには基本的に空きメモリがないことがわかりました。だから私はApacheを再起動してみました

sudoシステムhttpd再起動
sudoシステムmysqld再起動

そして、すべてがうまくいきました。多分別の解決策は、どういうわけかあまり多くのメモリを消費しないようにApacheを設定することです。


2
MySQLは引き続きクラッシュする可能性があるため、マイクロインスタンスにスワップスペースを追加する必要がある場合があります。
2012

ありがとう、それは理にかなっています。私はまた、apacheがスポーンできるスレッドの数を制限しようとするかもしれません。
wfbarksdale 2012

よく働く。私にもこの問題があり、httpdを再起動することで問題は解決しました。
ライオネルチャン

1
素晴らしいキャッチ、同じボートがここに。使用するramを少なくするようにapacheを設定し、512mのスワップファイルも作成しましたが、ピンチでのみ使用されるようにvm.swappinessを10に設定しました。
newz2000

nginxとphp-fpmを再起動すると、mysqlが起動するのに十分なメモリも解放されました!ありがとう!
msEmmaMays 2013年

4

投稿に表示されているmy.cfgファイルのinnodb_buffer_pool_sizeに128Mのメモリを要求しているようですが、MySQLは512Mのメモリを要求していると考えています。

バッファプールの初期化、サイズ= 512.0M

数行下のエラーメッセージは、MySQLがInnoDBバッファプール用に十分な(512M)メモリを予約できないために起動しないことを示しています。

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

それには3つの質問があります。

  1. インスタンスにはどのくらいのメモリがありますか?512M InnoDBがバッファプールを取得しようとするのに十分なメモリと、MySQLが割り当てる他のすべて、さらにアプリケーションとオペレーティングシステムが必要ですか?
  2. なぜInnoDBはあなたが思っている以上のことをしようとしているのですか?
  3. MySQLがどうして再起動するのですか?

答えられます1。

2.については、MySQLオプションファイルを配置できる場所がいくつかあります。後で見つかったファイルは、以前に見つかったファイルで指定されたオプションを上書きします。見る

http://dev.mysql.com/doc/refman/5.5/en/option-files.html

問題3.は、起動後のいつか発生するメモリ不足状態が原因である可能性があります。そうである場合は、ログでさらにそのことを示す表示が表示されるはずです。

最後に、多少関係はありませんが、EBSバックアップインスタンスを使用していますか?これは、データベースサーバー(通常、特別な状況を除くすべてのインスタンス)に強くお勧めします。詳細については、

https://stackoverflow.com/a/3630707/141172


2

私にとって、この問題は、EC2インスタンスにスワップボリュームを追加することで修正されました。私のサービスは単にボックス上のすべてのメモリを消費しており、クラッシュしました。私が何年もRedHat / CentOS管理者であったことには慣れていませんでした。Anacondaは、無料のUbuntu EC2インスタンスではできない多くの作業を行います。

Webコンソールで2Gbボリュームを作成してインスタンスに接続し、「mkswap / dev / [whatever]」を実行して/ etc / fstabを編集すると、クラッシュが停止しました。

これらのインスタンスは、私たちのほとんどが慣れているメディアベースのOSインストールのようにインストールされません-パッケージ、適切なファイルシステム、AppArmorのようなものでストリップされていないため、知らない場合はあらゆる種類の問題が発生しますおよび/またはそれを構成する方法がわかりません。


1

問題は、MySQLプロセスに割り当てるのに十分なメモリがサーバーにないことです。この問題にはいくつかの解決策があります。

(1)物理RAMを増やします。1GBのRAMを追加すると、問題が解決します。(2)SWAPスペースを割り当てます。Digital Ocean VPSインスタンスは、デフォルトではスワップ領域を使用するように構成されていません。512MBのスワップ領域を割り当てることで、この問題を解決することができました。サーバーにスワップ領域を追加するには、次の手順に従ってください。

## As a root user, perform the following:
# dd if=/dev/zero of=/swap.dat bs=1024 count=512M
# mkswap /swap.dat
# swapon /swap.dat
## Edit the /etc/fstab, and the following entry.
/swap.dat      none    swap    sw      0       0 

MySQLバッファープールサイズのサイズを減らす

## Edit /etc/my.cnf, and add the following line under the [mysqld] heading.
[mysqld]
innodb_buffer_pool_size=64M

また、ディスク容量を確認してください。十分なスペースがあることを確認してください。

df-h


1

簡単な答え:

* * * * * systemctl is-active --quiet mysqld || systemctl restart mysqld

詳細な回答:

これは、非常に小さいVPS、たとえば1GB以下のRAMを使用している人にとって特に重要な質問です。MySQLがドロップアウトしている場合は、サーバー構成(Apache | nginx)またはMySQL構成に問題がある可能性があります。DOS攻撃により、システムリソースの使用率が急上昇する可能性があります(画像を参照)。最終的に、MySQLプロセスはカーネルによってシャットダウンされます。長期的な解決策として、ApacheまたはMySQL構成の最適化を検討する必要があります。

システムリソースの急上昇によりRAMスパイク(午後6時直前)が発生し、システムリソースの急上昇によりCPUスパイクのみが発生する

スタックオーバーフローのトピック、MySQLマニュアル、Perconaブログの他にもいくつかの議論があります。

MySQLマニュアル-MySQLでのメモリの使用方法:

https://dev.mysql.com/doc/refman/8.0/en/memory-use.html

Percona-最適なMySQLメモリ使用を構成するためのベストプラクティス:

https://www.percona.com/blog/2016/05/03/best-practices-for-configuring-optimal-mysql-memory-usage/

MySQLTunerを使用してMySQLのパフォーマンスを最適化する方法:

https://www.linode.com/docs/databases/mysql/how-to-optimize-mysql-performance-using-mysqltuner/

Apacheメモリー使用構成:

/server/254436/apache-memory-usage-optimization

パフォーマンスチューニングに関するApacheマニュアル:

https://httpd.apache.org/docs/2.4/misc/perf-tuning.html

Apacheサーバーのチューニング:

https://www.linode.com/docs/web-servers/apache-tips-and-tricks/tuning-your-apache-server/

ただし、元の質問に関しては、はい。MySQLサービスがロードされてアクティブであるかどうかを確認し、ロードされていないアクティブな場合はMySQLを再起動する一時的なソリューションをスクリプト化できます。

使用しているオペレーティングシステムについては言及していません。それはあなたに特定のコマンドを与えるのに役立ちます。CentOS linuxの例を紹介します。
コマンドの次の出力を見てくださいsystemctl status mysql。上部に、サービスがロードされアクティブになっていることがわかります。

[root@centos-mysql-demo ~]# systemctl status mysqld
 mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2019-06-18 18:28:18 UTC; 924ms ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 3350 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS (code=exited, status=0/SUCCESS)
  Process: 3273 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
 Main PID: 3353 (mysqld)
   CGroup: /system.slice/mysqld.service
           └─3353 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid

Jun 18 18:28:11 centos-mysql-demo systemd[1]: Starting MySQL Server...
Jun 18 18:28:18 centos-mysql-demo systemd[1]: Started MySQL Server.

サービスがロードされていない場合、次のようなコマンド:

systemctl status mysqld || systemctl restart mysqld 

プロセスを再起動するトリックを実行します。あなたはそれを cronにすることができます:

* * * * * systemctl status mysqld || systemctl restart mysqld

ただし、mysqlは読み込まれているが、サービスがアクティブでない場合、cronは何もしません。したがって、次のようなより詳細なコマンドを使用する必要があります。

* * * * * systemctl is-active --quiet mysqld || systemctl restart mysqld

この場合、サービスがされた場合にロードされますが、非アクティブなDOS攻撃は、あなたのmysqlのサービス、コマンドがするも、再起動MySQLを残すことができるという状態として。--quietフラグを使用すると、ステータスコードのみを返すコマンドが指定され、画面には何も出力されません。--quietフラグを省略すると、activeまたはのステータス出力が表示されますinactive

次のような使用可能なRAMリソースをサーバーに追加するために、いくつかのスワップスペースを作成することもできます。

sudo dd if=/dev/zero of=/swapfile count=2096 bs=1MiB
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
swapon --show
swapon --summary
free -h

0

次のソリューションのいずれかを使用します。

  1. 物理RAMを増やします。1GBのRAMを追加すると、問題が解決します。

  2. 以下の設定変更を使用してSWAPスペースを割り当てます。

設定

dd if=/dev/zero of=/extraswap bs=1024 count=512M
mkswap  /extraswap 
swapon  /extraswap 
## Edit the /etc/fstab, and the following entry.
/extraswap      none    swap    sw      0       0
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.