MySQL завершается неудачно при перезагрузке
У меня проблема с MySQL на моем экземпляре сервера Rackspace Centos 6.4. Проблема похожа на проблему, описанную в этом вопросе Stackru. MySQL в какой-то момент перезапускается автоматически с помощью mysqld_safe, и перезапуск завершается неудачно, потому что InnoDB пытается выделить 128 МБ ОЗУ, что не удается. Выход из mysqld.log
как следует:
140129 18:05:26 mysqld_safe Number of processes running now: 0
140129 18:07:30 InnoDB: Mutexes and rw_locks use GCC atomic builtins
140129 18:07:30 InnoDB: Compressed tables use zlib 1.2.3
140129 18:07:30 InnoDB: Using Linux native AIO
140129 18:07:35 InnoDB: Initializing buffer pool, size = 128.0M
InnoDB: mmap(137363456 bytes) failed; errno 12
140129 18:07:46 InnoDB: Completed initialization of buffer pool
140129 18:07:46 InnoDB: Fatal error: cannot allocate memory for the buffer pool
140129 18:07:47 [ERROR] Plugin 'InnoDB' init function returned error.
140129 18:07:47 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
140129 18:08:07 [ERROR] Unknown/unsupported storage engine: InnoDB
140129 18:08:10 [ERROR] Aborting
140129 18:08:53 [Note] /usr/libexec/mysqld: Shutdown complete
140129 18:18:18 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
Решение, предоставленное в этом другом вопросе, казалось, было одним из "создать файл подкачки". Я проверил свой сервер, и, похоже, там уже есть активный файл подкачки:
# swapon -s
Filename Type Size Used Priority
/dev/xvdc1 partition 499992 34876 -1
и, глядя на этот вывод, это размер, который, как я думал, мне нужен (512 Мб). Для полноты вот содержимое моего /etc/fstab
файл:
/dev/xvda1 / ext3 defaults,noatime,barrier=0 0 0
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/xvdc1 none swap sw 0 0
Так что я что-то упустил или у меня уже есть рабочий файл подкачки объемом около 512 МБ, который достаточно пуст и поэтому должен быть способен обрабатывать запрос на 128 МБ? Должен ли я уменьшить размер буфера InnoDB, скажем, до 64 МБ? Будут ли какие-либо проблемы, связанные с сокращением этого буфера?
(Мой сервер Rackspace является самым маленьким из доступных, который имеет 512 МБ ОЗУ. Всякий раз, когда я делаю top
на сервере, кажется, свободно от 50 до 80 Мб.)
1 ответ
Из выходных данных это выглядит так, как будто у вас есть приблизительно 488 МБ пространства подкачки.
Я не уверен, выделяет ли MySQL пул буферов innodb, исходя из того, сколько памяти + swap свободны. Даже если бы это произошло, вы бы хотели избежать его замены, поскольку он медленнее, чем хранение вещей в оперативной памяти. Я думаю, что это не включает в себя своп.
Ошибка "InnoDB: mmap(137363456 байт) завершилась ошибкой; errno 12" сообщает нам, что вы не можете выделить память.
# perror 12
OS error code 12: Cannot allocate memory
Я бы уменьшил размер буферного пула innodb до 64 МБ; посмотрим, работает ли это. Если этого не произойдет, либо увеличьте размер облачного сервера, либо снова уменьшите размер буферного пула.
Вообще InnoDB любит память. Он старается сохранить как можно больше данных в памяти и уменьшить дисковый ввод-вывод. Уменьшая размер буфера, вы уменьшаете, сколько MySQL может хранить в памяти. MySQL будет чаще обращаться к диску для извлечения данных.
Это число должно отражать размер вашего набора данных. Нет смысла иметь буфер намного больше, чем ваш фактический набор данных.
Вы можете использовать некоторые из запросов здесь, чтобы определить размер. http://www.mysqlperformanceblog.com/2008/03/17/researching-your-mysql-table-sizes/
Если ваш набор данных намного больше, чем объем оперативной памяти, который у вас обычно есть под рукой, вам может потребоваться увеличить размер самого сервера.