17 апреля 2012

Ускорение перезапуска MySQL

Столкнулись с долгим временем перезапуска MySQL сервера. Приходится ждать минут 10 а то и более. Хорошего тут вообще ничего, поскольку в это время приложения недоступно.
Как выяснилось, для InnoDB движка MySQL перед перезагрузкой сбрасывает буфер изменений на диск, что занимает значительное время.
Можно и принудительно завершить работу базы даже в момент синхронизации буферов через kill -9. При этом данные не потеряются, поскольку будут восстановлены из бинарного лога при следующем запуске сервера. Но все же существует способ значительно ускорить перезагрузку MySQL сервера.
mysql> set global innodb_max_dirty_pages_pct = 0;
Данной командой мы сообщаем серверу, что необходимо свести к минимуму кол-во не синхронизированных страниц буффера.
После этого нужно ждать и мониторить значение этой переменной, например в консоли:
$ mysqladmin ext -i 2 | grep dirty
В идеале, нужно дождаться нуля.
Следует заметить, что чем больше у вас размер буфера (innodb_buffer_pool_size), тем больше будет "грязных" страниц.