Як мені отримати кілька видалених записів?


49

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

Чи є спосіб повернути ці записи?


18
Коли ви востаннє тестували свої резервні копії?
Джо

20
Коли ви останній раз тестували ЗАЛИШЕННЯ своїх резервних копій?
datagod

Відповіді:


116

Чи перебуває ваша база даних в повному режимі відновлення?

  • Якщо так, ви робите резервні копії журналу транзакцій?

    • Якщо так, чи є у вас утиліта для резервного копіювання, як Quest LiteSpeed, Red Gate SQL Backup або Idera SQLSafe?
      • Якщо так, ці утиліти можуть видалити об'єкти з файлів резервної копії (включаючи цілі і журнали транзакцій), але пояснення, як їх використовувати, виходить за рамки того, що я тут можу зробити. Зверніться до продавця, щоб отримати інструкції.
      • Якщо ні, відновіть усі журнали резервного копіювання та транзакцій як базу даних з іншим ім’ям. (Не перезаписуйте наявну базу даних.) Ви зможете отримати останню копію об'єкта до того, як видалення відбулося, але для вказівки вам потрібно буде використовувати частину команди stopat для відновлення. коли припинити відновлення команд. Вам потрібно зупинитись до того, як видалення відбулося.
    • Якщо ні, перейдіть на копію утиліти для читання журналів, наприклад Quest LiteSpeed ​​або Apex SQL Log. Ці утиліти можуть підключитися до сервера баз даних, вивчити файл журналу та допомогти скасувати транзакції. Я не впевнений, чи будуть працювати демо-версії, але платні, безумовно, будуть.
  • Якщо ні (не в режимі повного відновлення), відновіть останню повну резервну копію як базу даних з іншим ім'ям. (Не перезаписуйте базу даних, яку ви вже отримали.) Звідти ви зможете відновити всі записи, які були в Інтернеті під час створення резервної копії, але ви втратите всі зміни з тих пір.


4
Чудова відповідь, я додам, що якщо у вас є аудит або відстеження змін, зазвичай, найпростіше повернути дані з тих таблиць, коли це стосується лише однієї таблиці. І звичайно, якщо ваша відповідь була ні на одне, ні на все вищезазначене, після відновлення записів стільки, скільки вони можуть бути, тоді виправте процес резервного копіювання та, можливо, хто має доступ до виробничих даних.
HLGEM

Якщо ви перебуваєте в простому режимі, рядки все ще можуть бути фізично присутніми на деяких сторінках. Можливо, деякі з них можна повернути (за дуже високого часу та / або грошових витрат).
usr

FYI. Відновлення ApexSQL крім обмежень по часу, ознайомча версія відновлює тільки один з кожних 10 рядків загальної кількості рядків , доступних для відновлення ( apexsql.com/faqs/faqs_recover.aspx )
Самір

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/


3
Це досить класно. За яких умов цей підхід працює (чи не працює)?
Нік Чаммас

3
@ NickChammas - Він може відновити лише те, що є в активному журналі, тому для простої моделі відновлення контрольна точка не повинна відбуватися. Також зараз виглядає, що він не працює належним чином у базах даних з ізоляцією знімків, але це має бути легким виправленням. @user1059637- Як ви ставитесь до того, що люди додають функціональність до вашого коду?
Мартін Сміт

@MartinSmith, зараз він ідеально працює і з ізоляцією знімків.
користувач1059637

22

На жаль, ми не зможемо допомогти вам без значно більшої інформації. Але з вашого запитання я бачу, що ви видалили з бази даних 2 мільйони записів. Швидше за все, ви не зможете відновити цю інформацію, якщо тільки у вас не буде повного входу в базу даних і ви не придбаєте дуже специфічні інструменти.

Якщо ви можете більш детально описати, що це, на вашу думку, ви зробили, і чому ви вважаєте, що не можете отримати записи, і можете описати організацію вашої бази даних, то ми можемо допомогти вам трохи більше.

Деякі загальні поради: якщо ви думаєте, що ви видалили 2 мільйони записів, ви, мабуть, зараз трохи злякалися. Тож вам слід зробити п’ятихвилинну перерву, заспокоїтись і переглянути проблему. Крім того, ви повинні сказати своєму начальнику відразу, якщо це розумно (не будіть когось о 2 ранку, щоб сказати їм) і що ви працюєте над рішенням. Краще визнати те, що сталося, ніж несамовито намагатися відновитись і потенційно погіршити справи та приховати деталі. Знання того, що ваш начальник може певним чином допомогти, допоможе вам усунути проблему. Як я вже сказав, лише кілька загальних порад.


10
гарна ідея з 5-хвилинною перервою. Завжди працює. Допомагає зосередитись. :-) Був там зробив те.
Джон aka hot2use
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.