Amazon EC2, mysql прерывает запуск из-за сбоя InnoDB: mmap (x байтов); ошибка 12

95

Я создал микро - сервер экземпляра на EC2 основе того , что я прочитал здесь

Сервер mysql часто выходит из строя, и в третий раз сервер 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
pmoubed
источник
У меня такая же проблема на моем микро-экземпляре EC2. Попробовали установить innodb_buffer_pool_size = 128M и посмотрим, как это пойдет.
swxxii
Вам может потребоваться добавить пространство подкачки, если вы используете микро-экземпляр: prowebdev.us/2012/05/amazon-ec2-linux-micro-swap-space.html
pmoubed
1
На микро-экземплярах EC2 по умолчанию НЕТ пространства подкачки, и его необходимо настраивать вручную. В противном случае вы можете увидеть множество сбоев MySQL из-за нехватки памяти.
pmoubed

Ответы:

163

Я столкнулся с той же проблемой, когда попытался запустить wordpress на своем микро-экземпляре без RDS.

Добавление страницы подкачки решило проблему для меня.

Вы можете выполнить следующие шаги, чтобы настроить пространство подкачки.

Если это по-прежнему не работает, рассмотрите возможность использования службы RDS.

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

Я скопировал содержание блога для записи. Кредит принадлежит автору блога pmoubed :

Пространство подкачки микроинстансов Amazon EC2 - Linux

У меня есть экземпляр Amazon EC2 Linux Micro. Поскольку экземпляры Micro имеют только 613 МБ памяти, MySQL то и дело дает сбой. После долгих поисков MySQL, Micro Instance и Memory Managment я обнаружил, что для экземпляра Micro нет места под SWAP по умолчанию. Поэтому, если вы хотите избежать сбоя, вам может потребоваться настроить пространство подкачки для вашего микро-экземпляра. На самом деле с точки зрения производительности лучше включить свопинг.

Шаги ниже показывают, как создать место подкачки для вашего экземпляра Micro. Я предполагаю, что у вас есть учетная запись AWS с запущенным экземпляром Micro.

  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 необходим, если вы хотите автоматически включать файл подкачки после каждой перезагрузки.

Некоторые полезные команды, связанные с пространством подкачки:

$ 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
К вашему сведению, это сработало для меня на капле Digital Ocean (512 МБ). Не то чтобы это должно кого-то удивлять, но если кто-то не уверен, он, вероятно, будет работать на любом сервере с такими же проблемами.
jfacemyer 09
Спасибо за спаситель! Также был запущен микро-экземпляр с Ubuntu Server.
ECC-Dan
4
Для пользователей Digital Ocean я следовал этому руководству, и он отлично
Крис Рэй,
Большое спасибо. Выдергиваю волосы последние 24 часа, играю со всеми видами буферов / кешей / размеров запросов ... Вы спасаете жизнь!
pranshus
24

У меня тоже была эта проблема на микро-экземпляре Amazon EC2. Я попытался уменьшить использование памяти inno_db, добавив в/etc/my.cnf

innodb_buffer_pool_size = 64 млн

Это не сработало, я попытался снизить его до 16 МБ, но все равно не работало. Затем я понял, что у экземпляра практически нулевая свободная память. Итак, я попытался перезапустить apache

sudo system httpd перезапуск
перезапуск системы sudo mysqld

И все работало нормально. Возможно, другое решение - настроить apache, чтобы как-то не съедать столько памяти.

Wfbarksdale
источник
2
MySQL все еще может давать сбой, поэтому вам может потребоваться добавить пространство подкачки в свой микро-экземпляр.
pmoubed
Спасибо, в этом есть смысл. Я думаю, что могу также попытаться ограничить количество потоков, которые может порождать apache.
wfbarksdale
Работает отлично. У меня тоже есть эта проблема, и перезапуск httpd решил проблему.
Лайонел Чан
1
Отличный улов, здесь такая же лодка. Я настроил свой apache на использование меньшего количества оперативной памяти, а также создал файл подкачки размером 512 м, но установил для vm.swappiness значение 10, чтобы его можно было использовать только в крайнем случае.
newz2000 05
Перезапуск nginx и php-fpm также освободил достаточно памяти для запуска mysql! Благодарность!
msEmmaMays
4

Похоже , что вы запрашиваете 128M памяти для innodb_buffer_pool_size в файле my.cfg вы показываете в пост, но MySQL считает , что вы просите 512M памяти:

Инициализация буферного пула, размер = 512.0M

Несколькими строками ниже сообщение об ошибке сообщает, что MySQL не запускается, потому что он не может зарезервировать достаточно (512 МБ) памяти для буферного пула InnoDB:

Неустранимая ошибка: невозможно выделить память для буферного пула

Это вызывает три вопроса:

  1. Сколько памяти у вашего экземпляра? Должно ли быть достаточно памяти для размещения 512 МБ, которую 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.

Я просто создал том 2 ГБ через веб-консоль, подключил его к своему экземпляру, выполнил «mkswap / dev / [something]», отредактировал / etc / fstab, и сбой остановился.

Эти экземпляры НЕ устанавливаются, как установка ОС на основе носителя, к которой привыкло большинство из нас - она ​​полностью очищена, без пакетов, без надлежащей файловой системы и таких вещей, как AppArmor, которые вызывают всевозможные проблемы, если вы об этом не знаете. и / или не знаете, как его настроить.

Джоэл
источник
1

Проблема в том, что серверу не хватает памяти для выделения под процесс MySQL. Есть несколько решений этой проблемы.

(1) Увеличьте физическую оперативную память. Добавление 1 ГБ дополнительной оперативной памяти решит проблему. (2) Выделите место для подкачки. Экземпляр Digital Ocean VPS по умолчанию не настроен на использование пространства подкачки. Выделив 512 МБ пространства подкачки, мы смогли решить эту проблему. Чтобы добавить пространство подкачки на свой сервер, выполните следующие действия:

## 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, скажем, 1 ГБ ОЗУ или меньше. Если MySQL отключается, это может быть проблема с конфигурацией вашего сервера (Apache | nginx) или конфигурацией MySQL. Атаки DOS могут вызвать повышенный всплеск использования системных ресурсов (см. Изображение). Конечным результатом является то, что процесс MySQL завершается ядром. Для долгосрочного решения следует обратить внимание на оптимизацию конфигураций Apache или MySQL.

Всплеск системных ресурсов, вызывающий всплеск ОЗУ (незадолго до 18:00), и всплеск системных ресурсов, вызывающий только всплеск ЦП Полночь 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/

Как оптимизировать производительность MySQL с помощью MySQLTuner:

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 .

Вы также можете создать пространство подкачки, чтобы добавить на сервер больше доступных ресурсов ОЗУ, например:

sudo dd if=/dev/zero of=/swapfile count=2096 bs=1MiB
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
swapon --show
swapon --summary
free -h
jonnyjandles
источник
0

Используйте любое из следующих решений:

  1. Увеличьте физическую оперативную память. Добавление 1 ГБ дополнительной оперативной памяти решит проблему.

  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
cloud_geek
источник