web-dev-qa-db-ja.com

Amazon EC2、InnoDB:mmap(xバイト)が失敗したため、mysqlが開始を中止しました。 errno 12

読んだ内容に基づいてEC2にmicroインスタンスサーバーをセットアップしました here

mysqlサーバーは頻繁に失敗し、mysqlサーバーが3回目には失われます。ログには

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
89
PMoubed

RDSを使用せずにマイクロインスタンスでwordpressを実行しようとすると、同じ問題が発生しました。

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

これに従って、スワップページをセットアップできます。

http://www.prowebdev.us/2012/05/Amazon-ec2-linux-micro-swap-space.html

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

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

ブログへのリンクが失敗する場合があります。レコード用に以下のコンテンツをコピーしました。クレジットはブログの著者に送られます Pedram Moubed

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

Amazon EC2 Linux Microインスタンスがあります。 Microインスタンスのメモリは613MBしかないため、MySQLは時々クラッシュしました。 MySQL、Micro Instance、およびMemory Managmentを長時間検索した結果、Microインスタンス用のデフォルトのSWAPスペースがないことがわかりました。そのため、クラッシュを回避したい場合は、マイクロインスタンス用のスワップスペースをセットアップする必要があります。実際には、スワップを有効にするとパフォーマンスが向上します。

以下の手順は、Microインスタンスのスワップスペースを作成する方法を示しています。 Microインスタンスが実行されている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/
160
Bohr

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

 innodb_buffer_pool_size = 64M 

それはうまくいきませんでした。16Mに落としましたが、それでもうまくいきませんでした。その後、インスタンスの空きメモリが基本的にゼロであることに気付きました。だからApacheを再起動してみた

 Sudoシステムhttpdの再起動
 Sudoシステムmysqldの再起動

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

23
wfbarksdale

投稿で表示する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

4
Eric J.

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

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

これらのインスタンスは、私たちのほとんどが慣れているメディアベースのOSインストールのようにはインストールされません-パッケージ、適切なファイルシステム、およびAppArmorのようなものでむき出しになっています。および/またはそれを設定する方法がわからない。

2
Joel

簡単な回答:

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

詳細な回答:

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

System resources spike causing RAM spike (just before 6pm) and system resources spike causing only a CPU spike Midnight on Tue 18

これらのトピックの他に、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メモリ使用量の構成:

https://serverfault.com/questions/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の次の出力を見てください。サービスがloadedおよびactiveであることが上部に表示されます。

[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がloadedで、サービスがactiveではない場合、cronは何もしません。したがって、次のようなより詳細なコマンドを使用する必要があります。

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

この場合、サービスがloadedであるが、DOS攻撃がmysqlサービスを離れることができる状態のようなinactiveである場合、コマンドは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
jonnyjandles

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

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

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

config

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
0
cloud_geek

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

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

## 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
0
Ranjeet Ranjan