Відновлення MySQL із бінарних логів, Tarlyun blog

Відновлення MySQL із бінарних логів.

Так сталося, що один геніальний програміст на одному продакшн-сервері виконав запит:

DROP DATABASE databasename

Звичайно, жодна розсудлива людина на таке не здатна, але ось вроджена криворукість і куряча сліпота призвела до того, що він переплутав кнопки в PhpMyAdmin і на автоматі підтвердив запит. У результаті база зникла. Крики. Паніки. Подання про позбавлення премії тощо. Добре, що цей програміст має такий знайомий, як я.

Отримавши логіни та паролі, я приступив до дослідження сервера.

База використовувалася для високонавантаженого форуму з великою відвідуваністю, і відновити потрібно було все, аж до останнього посту.

Насамперед, я виявив, що дамп робився дуже давно. Майже 2 місяці тому. На мою велику радість були включені бінарні логи. Докладніше про бінарні логи можна почитати тут, для читача цієї статті я лише зазначу кілька фактів:

  • Бінарні логи уповільнюють систему
  • Бінарні логи з'їдають місце
  • Бінарні логи рятують ваші нерви

Для ведення будь-яких ліг і бекапів потрібно місце. Ведення логів з'їдає системні ресурси. Це очевидно. У деяких випадках RAID масиву може виявитися мало. Для більшої надійності варто увімкнути бінарні логи.

Найзручніше — отримати SQL запити на відновлення БД і записати їх у файл. Це робиться за допомогою утиліти mysqlbinlog, її формат:

  • -d, -database - список БД, які потрібно відновити.
  • —start-datetime та —stop-datetime — час початку та закінчення періоду, за який вам потрібен лог запитів.
  • -t - ключ потрібен для продовження операції після закінченняпоточного лог файлу.

Підсумкова команда виглядає так:

mysqlbinlog -s -d databasename --start-datetime="2011-03-01 00:00:00" --stop-datetime="2011-04-19 18:00:00" -t mysql-bin.000038 > ; repair.sql

Щоб відновити таблиціMySQL з цього файлу скористаємося командою: