Сценарий из жизни: вы выполнили инструкцию UPDATE без указания условия WHERE и теперь все ваши данные перезаписаны на некорректные значения. Каким способом теперь вернуть изменённые данные?
Если вы регулярно делаете резервные копии, то восстановить данные не составит проблемы, достаточно выполнить:
- Либо, восстановление из резервной копии, поверх текущей БД
- Либо, если кроме ваших изменений в БД произошли ещё какие-то операции или вы не можете позволить себе временно перевести БД в режим offline:
- Восстановите БД из резервной копии на тестовый сервер
- Выгрузите с помощью SQL Server Management Studio Export data нужные данные
- Загрузите их в вашу исходную БД
Но даже если у вас нет актуальной резервной копии базы данных, вы всё ещё можете вернуть ваши исходные данные, так как все операции UPDATE попадают в журнал транзакций.
Если после изменений журнал транзакций не был усечён (shrunk или truncated), то вы можете воспользоваться программой ApexSQL Log
ApexSQL Log – это как раз тот инструмент, который с помощью журнала транзакций позволит откатить ваше изменение. А дальше вы уже сможете выполнить ваш сценарий обновления, указав нужный фильтр WHERE.
Чтобы с помощью ApexSQL Log вернуть случайно сделанные изменения::
-
Запустите ApexSQL Log
-
Подключитесь к базе данных
-
На шаге Filter setup в разделе Time range укажите диапазон времени, когда произошло изменение (UPDATE)
-
Укажите Update row на шаге Filter setup в разделе Operations tab
-
Выберите таблицу или таблицы, которые были некорректно изменены (Filter setup -> Tables)
- По возможности, укажите приложение (Applications) из которого произошло изменение и пользователя (Users), который сделал эти изменения
- Нажмите открыть (Open)
-
Чтобы создать скрипт отмены (Undo script):
- Выполните полученный сценарий в вашей БД.
После выполнения сценария все ваши случайно изменённые данные вернутся в исходное состояние.
Теперь, если вы случайно внесли изменения в вашу базу данных, а резервной копии нет в наличии, вы всегда можете воспользоваться приложением ApexSQL Log.
Переводчик: Алексей Князев
November 20, 2015