Доброго времени суток, читатели хабра.
Не так давно на работе произошел инцидент, который попортил мне нервы и привел к длительным дискуссиям.
Итог: при обновлении записи в базе данных mysql я забыл указать условиеwhere и в результате все записи в таблице изменились.
Как этого можно было избежать:
- Всегда внимательно перечитывайте запрос на рабочем сервере перед запуском (может сохранится.
но.
может не сохраниться)
- По окончании запросов на обновление всегда ставьте лимит 1, если не требуется обратное (Поможет, но это дело привычки, к тому же исправленную строку все равно придется потом искать).
- Используйте специальную утилиту типа phpmyadmin (возможно, самая рациональная, но не всегда доступная)
- Всегда сбрасывайте.
(А это, по идее, обязательно даже при соблюдении остальных пунктов).
Здесь начинается основная часть моей статьи.
Итак, что мы имеем:
- Рабочая база данных с неверными данными
- Дамп правильной базы, без данных за определенный период (прошедший с момента создания дампа)
- Время, в течение которого они продолжают работать с базой данных, создавая тем самым ошибки и добавляя данные, которых нет в дампе.
и ее id используются в других базах данных, и она использует. И вот, наблюдая за этой ситуацией, я начинаю потихоньку впадать в истерику, потому что времени нет, да и решение займет много времени, чтобы все сделать правильно и в итоге я могу потерять часть новых данных (это был стол с заказами) Но в конце концов я взял себя в руки, подумал немного и нашел решение, которое может помочь в таких ситуациях.
Итог: Вместо перезаполнения таблицы мы обновим ее значения, используя старые данные из дампа.
Конкретно:
- Делаем копию дампа
- Отредактируйте копию дампа, удалите данные по всем таблицам, кроме той, которая вам нужна.
- Замените все вхождения старого имени таблицы новым (например, temp_old table_name).
- Загрузка исправленной копии дампа
- Выполняем запрос: обновить имя_старой_таблицы t1 присоединиться к новому_имени_таблицы t2 в (t1.id=t2.id) установить t1.incorrect имя_поля_данных=t2.имя этого_поля во второй таблице;
- Удаляем новую таблицу с измененным именем.
Результат:
Ключи не были сломаны, старые данные были восстановлены, новые данные, если и были повреждены, все равно имели хоть какую-то информацию, работа не прерывалась, все было сделано достаточно быстро.Надеюсь, эта история поможет кому-то в похожей ситуации.
Теги: #MySQL #дамп #БД #восстановление #внешние ключи #Разработка сайтов #MySQL