ускорить перезапуск MySQL

Thank you for reading this post, don't forget to subscribe!

С ростом пере­за­пуск MySQL может пре­вра­тить­ся в очень непри­ят­ный про­цесс. Вам нуж­но поме­нять все­го одну настрой­ку, а вы жде­те 10…20 минут, пока БД перезапустится.

На ско­рость выклю­че­ния и вклю­че­ния MySQL боль­шое вли­я­ние ока­зы­ва­ет дви­жок InnoDB. А имен­но два его компонента:

  • Redo лог файлы.
  • Раз­мер буфе­ра движка.

С ростом базы дан­ных эти настрой­ки обыч­но уве­ли­чи­ва­ют для повы­ше­ния про­из­во­ди­тель­но­сти. Но вме­сте с этим уве­ли­чи­ва­ет­ся и вре­мя пере­за­пус­ка сервера.

Ускорение выключения

Если вы обно­ви­те какую-то стро­ку в какой-то таб­ли­це, Mysql сде­ла­ет следующее:

  1. Обно­вит эти дан­ные в буфе­ре (толь­ко в опе­ра­тив­ной памяти).
  2. Поме­тит эту область памя­ти (стра­ни­цу), как "гряз­ную".
  3. Доба­вит запись об изме­не­нии в redo лог файл (на слу­чай, если сер­вер сло­ма­ет­ся и нуж­но будет вос­ста­нав­ли­вать данные).

Так обес­пе­чи­ва­ет­ся про­из­во­ди­тель­ность, ведь базе дан­ных не при­хо­дит­ся выпол­нять доро­гие опе­ра­ции random-запи­си на диск сра­зу. Поз­же, когда буфер будет пере­пол­нен, Mysql нач­нет "сбра­сы­вать гряз­ные" стра­ни­цы на диск — запи­сы­вать изме­не­ния из буфе­ра в фай­лы таб­лиц на диске.

# Коли­че­ство гряз­ных стра­ниц в буфере

Как видим, коли­че­ство гряз­ных стра­ниц состав­ля­ет око­ло 10% все­го буфе­ра. И если раз­мер неболь­шой — это может быть несколь­ко десят­ков мега­байт. В .io, в неко­то­рых кон­фи­гу­ра­ци­ях мы исполь­зу­ем раз­ме­ры буфе­ра в 48Гб. Это озна­ча­ет, что раз­мер гряз­ных стра­ниц соста­вит при­бли­зи­тель­но 5Гб.

Перед выклю­че­ни­ем Mysql обя­за­тель­но сбро­сит все гряз­ные стра­ни­цы на диск. Отсю­да и очень дол­гое вре­мя выключения.

В Mysql 5.7 есть настрой­ка innodb_max_dirty_pages_pct, кото­рая поз­во­ля­ет регу­ли­ро­вать коли­че­ство гряз­ных стра­ниц в памя­ти. Mysql будет чаще сбра­сы­вать гряз­ные стра­ни­цы во вре­мя рабо­ты, если уста­но­вить зна­че­ние поменьше:

# Уста­но­вим лимит гряз­ных стра­ниц в 1%

Сра­зу после обнов­ле­ния этой настрой­ки мы уви­дим, что коли­че­ство гряз­ных стра­ниц посте­пен­но уменьшится:

# Зна­че­ние будет посте­пен­но умень­шать­ся до пре­де­ла в 1%

Теперь вре­мя выклю­че­ния Mysql зна­чи­тель­но снизится.

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

Сра­зу после запус­ка Mysql может очень мед­лен­но рабо­тать от несколь­ких минут до несколь­ких часов. И это при стан­дарт­ной нагруз­ке. Это про­ис­хо­дит пото­му, что какое-то вре­мя ухо­дит на разо­грев буфе­ра. В тече­ние это­го вре­ме­ни буфер не напол­нен, и Mysql чита­ет мно­же­ство дан­ных напря­мую с диска.

Начи­ная с вер­сии 5.7 Mysql поз­во­ля­ет настро­ить вклю­чить две опции:

# Вклю­ча­ет­ся в my.cnf

Этот пара­метр сбра­сы­ва­ет содер­жи­мое буфе­ра на диск перед выклю­че­ни­ем. Так, во вре­мя вклю­че­ния, Mysql смо­жет быст­ро загру­зить этот же буфер обрат­но в память. Опе­ра­ция эта очень эффек­тив­на, т.к. сам буфер не копи­ру­ет­ся, а сохра­ня­ют­ся толь­ко адре­са стра­ниц на диске.

# Тоже вклю­ча­ет­ся в my.cnf

Этот пара­метр загру­жа­ет содер­жи­мое буфе­ра с дис­ка сра­зу после вклю­че­ния. Эта опе­ра­ция не бло­ки­ру­ет запуск сер­ве­ра, а выпол­ня­ет­ся на фоне. Поэто­му она никак не замед­лит ско­рость запус­ка. А вот ско­рость воз­вра­та к нор­маль­ной рабо­те уве­ли­чит­ся в несколь­ко раз.

Что­бы уско­рить вре­мя выклю­че­ния Mysql, сокра­ти­те коли­че­ство гряз­ных стра­ниц в памяти:

Для уско­ре­ния запус­ка вклю­чай­те опции быст­ро­го сбро­са и вос­ста­нов­ле­ния буфера:

Эти настрой­ки пред­на­зна­че­ны для баз дан­ных, исполь­зу­ю­щих дви­жок InnoDB и 5.7+ вер­сию Mysql.