Как мне вернуть некоторые удаленные записи?

49

Я по ошибке удалил около 2 000 000 записей из удаленной таблицы SQL Server 2008. Сервер не предоставляет мне доступ к файлам резервных копий на стороне сервера.

Есть ли способ вернуть эти записи?

Ник Чаммас
источник
18
Когда вы в последний раз проверяли свои резервные копии?
Джо
20
Когда в последний раз вы проверяли ВОССТАНОВЛЕНИЕ ваших резервных копий?
Датагод

Ответы:

116

Ваша база данных находится в режиме полного восстановления?

  • Если да, вы делаете резервные копии журнала транзакций?

    • Если да, есть ли у вас утилита резервного копирования, такая как Quest LiteSpeed, Red Gate SQL Backup или Idera SQLSafe?
      • Если да, то эти утилиты могут восстанавливать объекты из файлов резервных копий (включая полные и журналы транзакций), но объяснение того, как их использовать, выходит за рамки того, что я могу сделать здесь. Обратитесь к продавцу за инструкциями.
      • Если нет, восстановите журналы полной резервной копии и транзакций как базу данных с другим именем. (Не перезаписывайте существующую базу данных.) Вы сможете получить самую последнюю копию объекта до того, как произойдет удаление, но вам нужно будет использовать часть stopat команды восстановления, чтобы указать когда прекратить восстановление команд. Вам нужно остановиться до того, как удаление произошло.
    • Если нет, то возьмите копию утилиты чтения журнала, такой как Quest LiteSpeed ​​или Apex SQL Log. Эти утилиты могут подключаться к серверу базы данных, проверять файл журнала и помогать отменять транзакции. Я не уверен, что демо-версии будут работать, но платные определенно будут.
  • Если нет (не в режиме полного восстановления), восстановите последнюю полную резервную копию как базу данных с другим именем. (Не перезаписывайте базу данных, которую вы уже получили.) Оттуда вы сможете восстановить все записи, которые были в сети во время резервного копирования, но с тех пор вы потеряете все изменения.

Брент Озар
источник
4
Хороший ответ, я добавлю, что если у вас есть аудит или отслеживание изменений, как правило, легче всего получить данные из этих таблиц, когда затронута только одна таблица. И, конечно, если вы ответили «нет» на некоторые или все вышеперечисленное, после того, как вы восстановите записи настолько, насколько это возможно, исправьте процесс резервного копирования и, возможно, у кого есть доступ к рабочим данным.
HLGEM
Если вы находитесь в простом режиме, строки могут все еще физически присутствовать на некоторых страницах. Возможно, некоторые из них могут быть восстановлены (при очень высоких затратах времени и / или денег).
USR
FYI. ApexSQL Recover, кроме ограничения по времени, ознакомительная версия восстанавливает только 1 из каждых 10 строк от общего числа строк, доступных для восстановления ( apexsql.com/faqs/faqs_recover.aspx )
Sameer
30

SQL Server ведет журналы для каждой удаленной записи. Вы можете запросить эти журналы с помощью функции fn_dblogSQL Server.

SELECT [RowLog Contents 0] 
FROM   sys.fn_dblog(NULL, NULL) 
WHERE  
       AllocUnitName = 'dbo.TableName'        
   AND Context IN ( 'LCX_MARK_AS_GHOST', 'LCX_HEAP' )        
   AND Operation in ( 'LOP_DELETE_ROWS' )   
;

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

Статья ниже поможет вам восстановить удаленные записи способом, описанным выше:

http://raresql.com/2011/10/22/how-to-recover-deleted-data-from-sql-sever/

user1059637
источник
3
Это довольно круто. При каких условиях этот подход работает (или не работает)?
Ник Чаммас
3
@NickChammas - он может восстановить только то, что находится в активном журнале, поэтому для простой модели восстановления контрольной точки не должно быть. Кроме того, в настоящее время похоже, что он не работает правильно в базах данных с изоляцией моментальных снимков, но это должно быть легко исправить. @user1059637- Как вы относитесь к людям, добавляющим функциональность в ваш код?
Мартин Смит
@MartinSmith, теперь он отлично работает и с изоляцией моментальных снимков.
user1059637
22

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

Если вы сможете более подробно описать, что именно вы думаете, что сделали, и почему вы чувствуете, что не можете получить записи обратно, и можете описать организацию вашей базы данных, то мы можем помочь вам немного больше.

Несколько общих советов: если вы думаете, что удалили 2 миллиона записей, вы, вероятно, сейчас немного взволнованы. Таким образом, вы должны сделать пятиминутный перерыв, успокоиться и вернуться к проблеме. Кроме того, вы должны немедленно сообщить своему боссу, если это разумно (не будите кого-то в 2 часа ночи, чтобы сказать ему), и что вы работаете над решением. Лучше признать, что случилось, чем отчаянно пытаться выздороветь и потенциально усугубить ситуацию и скрыть детали. Знание того, что ваш начальник может помочь, поможет вам решить проблему. Как я уже сказал, просто несколько общих советов.

Jcolebrand
источник
10
хорошая идея с 5-минутным перерывом. Всегда работает. Помогает сосредоточиться. :-) Там было сделано это.
Джон aka hot2use