Відновлення 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 з цього файлу скористаємося командою: