Amazon EC2, mysql прерывает запуск, потому что InnoDB: mmap (x bytes) не удалось; errno 12

Я установил сервер экземпляров micro на 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 `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

Ответ 1

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

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

Вы можете следить за этим, чтобы настроить страницу свопинга:

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

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

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

Ссылка на блог иногда терпит неудачу. Я скопировал содержание ниже для записи. Кредит принадлежит автору блога Pedram Moubed:

Amazon EC2 Micro Instance Swap Space - Linux

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

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

  • Выполнить dd if=/dev/zero of=/swapfile bs=1M count=1024
  • Выполнить mkswap /swapfile
  • Запустить swapon /swapfile
  • Добавьте эту строку /swapfile swap swap defaults 0 0 в /etc/fstab

Шаг 4 необходим, если вы хотите автоматически включить файл подкачки после каждой перезагрузки.

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

$ swapon -s   
$ free -k

$ swapoff -a
$ swapon  -a

Литература:

Ответ 2

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

innodb_buffer_pool_size = 64M

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

sudo system httpd restart
sudo system mysqld restart

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

Ответ 3

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

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

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

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

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

  • Сколько памяти на вашем экземпляре? Должно ли быть достаточно памяти для размещения 512M InnoDB пытается захватить буферный пул, а также все остальное, что выделяет MySQL, плюс ваши приложения, а также операционная система?
  • Почему InnoDB пытается взять больше, чем вы думаете?
  • Почему MySQL перезагружается?

Вы можете ответить 1.

Что касается 2., есть несколько разных мест, где могут быть установлены файлы параметров MySQL. Впоследствии найденные файлы переопределяют параметры, указанные в ранее найденных файлах. См.

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

Проблема 3. может возникнуть из-за отсутствия памяти, которая возникает когда-то после запуска. Вы должны увидеть указание на это еще раз в журналах, если это так.

Наконец, но несколько несвязанный, используете ли вы экземпляры, поддерживаемые EBS? Это обычно рекомендуется для серверов баз данных (фактически, для любого экземпляра, запрещающего особые обстоятельства). Подробнее об этом см.

fooobar.com/questions/15809/...

Ответ 4

Для меня эта проблема была исправлена ​​путем добавления объема подкачки к моему экземпляру EC2. Мои службы просто поглощали всю память на коробке и рушились. Не то, к чему я привык, будучи администратором RedHat/CentOS в течение многих лет - Anaconda делает много работы, которой нет в свободном экземпляре Ubuntu EC2.

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

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

Ответ 5

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

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

  • Выделите пространство 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

Ответ 6

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

(1) Увеличьте физическую память. Добавление 1 ГБ дополнительной ОЗУ решит проблему. (2) Выделить пространство SWAP. Экземпляр 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 

Ответ 7

Я нашел ответ на этот вопрос и работал на меня: https://www.digitalocean.com/community/questions/mysql-server-keeps-stopping-unexpectedly?answer=26016

вам нужно сделать оба innodb_buffer_pool_size для чего-то разумного, например, 32M на my.conf в /etc/mysql/my.cnf, и вам также может понадобиться изменить /etc/apache2/mods-enabled/mpm_prefork.conf чтобы уменьшить количество соединений запущено apache;

<IfModule mpm_prefork_module>
    StartServers     3
    MinSpareServers  3
    MaxSpareServers  5
    MaxRequestWorkers 25
    MaxConnectionsPerChild  0
</IfModule>

Ответ 8

ЛЕГКИЙ ОТВЕТ:

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

ПОДРОБНЫЙ ОТВЕТ:

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

https://serverfault.com/info/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. Вверху видно, что сервис загружен и активен.

[[email protected] ~]# 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