Экстренное Восстановление Данных В Таблице Mysql С Минимальной Потерей Времени

Доброго времени суток, читатели хабра.

Не так давно на работе произошел инцидент, который попортил мне нервы и привел к длительным дискуссиям.

Итог: при обновлении записи в базе данных mysql я забыл указать условиеwhere и в результате все записи в таблице изменились.



Как этого можно было избежать:
  1. Всегда внимательно перечитывайте запрос на рабочем сервере перед запуском (может сохранится.

    но.

    может не сохраниться)

  2. По окончании запросов на обновление всегда ставьте лимит 1, если не требуется обратное (Поможет, но это дело привычки, к тому же исправленную строку все равно придется потом искать).

  3. Используйте специальную утилиту типа phpmyadmin (возможно, самая рациональная, но не всегда доступная)
  4. Всегда сбрасывайте.

    (А это, по идее, обязательно даже при соблюдении остальных пунктов).

Теперь, если дамп остался, то мы сохраняемся и можем восстановить таблицу.

Здесь начинается основная часть моей статьи.



Итак, что мы имеем:
  1. Рабочая база данных с неверными данными
  2. Дамп правильной базы, без данных за определенный период (прошедший с момента создания дампа)
  3. Время, в течение которого они продолжают работать с базой данных, создавая тем самым ошибки и добавляя данные, которых нет в дампе.

Все омрачается тем, что база данных содержит внешние ключи, т.е.

и ее id используются в других базах данных, и она использует. И вот, наблюдая за этой ситуацией, я начинаю потихоньку впадать в истерику, потому что времени нет, да и решение займет много времени, чтобы все сделать правильно и в итоге я могу потерять часть новых данных (это был стол с заказами) Но в конце концов я взял себя в руки, подумал немного и нашел решение, которое может помочь в таких ситуациях.



Итог: Вместо перезаполнения таблицы мы обновим ее значения, используя старые данные из дампа.



Конкретно:
  1. Делаем копию дампа
  2. Отредактируйте копию дампа, удалите данные по всем таблицам, кроме той, которая вам нужна.

  3. Замените все вхождения старого имени таблицы новым (например, temp_old table_name).

  4. Загрузка исправленной копии дампа
  5. Выполняем запрос: обновить имя_старой_таблицы t1 присоединиться к новому_имени_таблицы t2 в (t1.id=t2.id) установить t1.incorrect имя_поля_данных=t2.имя этого_поля во второй таблице;
  6. Удаляем новую таблицу с измененным именем.



Результат:
Ключи не были сломаны, старые данные были восстановлены, новые данные, если и были повреждены, все равно имели хоть какую-то информацию, работа не прерывалась, все было сделано достаточно быстро.

Надеюсь, эта история поможет кому-то в похожей ситуации.

Теги: #MySQL #дамп #БД #восстановление #внешние ключи #Разработка сайтов #MySQL

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.