Bagaimana saya mendapatkan kembali beberapa catatan yang dihapus?

49

Saya keliru menghapus sekitar 2.000.000 catatan dari tabel SQL Server 2008 jauh. Server tidak memberi saya akses ke file cadangan di sisi server.

Apakah ada cara untuk mendapatkan kembali catatan-catatan ini?

Nick Chammas
sumber
18
Kapan terakhir kali Anda menguji cadangan Anda?
Joe
20
Kapan terakhir kali Anda menguji KEMBALIKAN cadangan Anda?
datagod

Jawaban:

116

Apakah basis data Anda dalam mode pemulihan penuh?

  • Jika ya, apakah Anda melakukan pencadangan log transaksi?

    • Jika ya, apakah Anda memiliki utilitas cadangan seperti Quest LiteSpeed, Red Gate SQL Backup, atau Idera SQLSafe?
      • Jika ya, utilitas tersebut dapat membatalkan penghapusan objek dari file cadangan (termasuk log lengkap dan transaksi) - tetapi menjelaskan cara menggunakan itu di luar ruang lingkup yang dapat saya lakukan di sini. Hubungi vendor untuk instruksi.
      • Jika tidak, kembalikan log cadangan dan transaksi penuh sebagai database dengan nama yang berbeda. (Jangan menimpa database yang ada.) Anda akan bisa mendapatkan salinan objek yang up-to-the-second sebelum penghapusan terjadi, tetapi Anda harus menggunakan bagian stopat dari perintah restore untuk menentukan kapan harus berhenti mengembalikan perintah. Anda harus berhenti sebelum penghapusan terjadi.
    • Jika tidak, ambil salinan utilitas pembaca log seperti Quest LiteSpeed ​​atau Apex SQL Log. Utilitas ini dapat terhubung ke server database, memeriksa file log, dan membantu Anda membatalkan transaksi. Saya tidak yakin apakah versi demo akan berfungsi, tetapi yang berbayar pasti akan berhasil.
  • Jika tidak (tidak dalam mode pemulihan penuh), pulihkan cadangan lengkap terakhir sebagai database dengan nama yang berbeda. (Jangan menimpa basis data yang sudah Anda miliki.) Dari sana, Anda dapat mengembalikan catatan apa pun yang daring pada saat cadangan, tetapi sejak saat itu Anda akan kehilangan semua perubahan.

Brent Ozar
sumber
4
Jawaban yang bagus, saya akan menambahkan bahwa jika Anda memiliki audit atau perubahan pelacakan, biasanya paling mudah untuk mendapatkan kembali data dari tabel tersebut ketika hanya satu tabel yang terpengaruh. Dan tentu saja, jika jawaban Anda adalah tidak untuk sebagian atau semua hal di atas, setelah Anda mengembalikan catatan sebanyak mungkin, maka perbaiki proses pencadangan Anda dan mungkin yang memiliki akses ke data produksi.
HLGEM
Jika Anda berada dalam mode sederhana, baris mungkin masih ada secara fisik di beberapa halaman. Mungkin beberapa dari mereka dapat dipulihkan (pada waktu dan / atau biaya uang yang sangat tinggi).
usr
FYI. Pemulihan ApexSQL selain pembatasan waktu, versi evaluasi hanya pulih 1 dari setiap 10 baris dari total baris yang tersedia untuk pemulihan ( apexsql.com/faqs/faqs_recover.aspx )
Sameer
30

SQL Server menyimpan log untuk setiap catatan yang dihapus. Anda dapat meminta log ini melalui fungsi 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' )   
;

Tetapi log ini dalam format Hex dan Anda perlu mengubah format Hex ini menjadi data aktual Anda.

Artikel di bawah ini akan membantu Anda memulihkan catatan yang dihapus dengan cara yang ditentukan di atas:

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

pengguna1059637
sumber
3
Ini keren sekali. Dalam kondisi apa pendekatan ini bekerja (atau tidak berfungsi)?
Nick Chammas
3
@NickChammas - Ini hanya dapat memulihkan apa yang ada di log aktif sehingga untuk model pemulihan sederhana pos pemeriksaan tidak boleh terjadi. Juga saat ini sepertinya tidak berfungsi dengan benar dalam database dengan isolasi snapshot tetapi itu harus menjadi perbaikan yang mudah. @user1059637- Bagaimana sikap Anda terhadap orang yang menambahkan fungsionalitas ke kode Anda?
Martin Smith
@ MartinSmith, Sekarang bekerja dengan baik dengan isolasi snapshot juga.
user1059637
22

Sayangnya, kami tidak akan dapat membantu Anda tanpa banyak informasi. Tetapi dari pertanyaan Anda, saya melihat bahwa Anda telah menghapus apa yang tampaknya 2 juta catatan dari basis data Anda. Kemungkinan besar Anda tidak dapat memulihkan informasi ini, kecuali jika Anda memiliki pendataan penuh pada database Anda dan Anda membeli beberapa alat yang sangat spesifik.

Jika Anda dapat menjelaskan secara lebih terperinci apa saja yang Anda pikir telah Anda lakukan, dan mengapa Anda merasa tidak bisa mendapatkan catatan kembali, dan dapat menggambarkan organisasi basis data Anda, maka kami mungkin dapat membantu Anda sedikit lebih banyak.

Beberapa saran umum: jika Anda pikir Anda telah menghapus 2 juta catatan, Anda mungkin sedikit ketakutan sekarang. Jadi, Anda harus istirahat lima menit, tenang, dan tinjau kembali masalahnya. Juga, Anda harus segera memberi tahu atasan Anda jika itu masuk akal (jangan bangunkan seseorang pada pukul 2 pagi untuk memberi tahu mereka) dan bahwa Anda sedang mencari solusi. Lebih baik mengakui apa yang terjadi daripada dengan panik mencoba untuk pulih dan berpotensi memperburuk keadaan dan menyembunyikan detailnya. Mengetahui bahwa atasan Anda dapat membantu dalam beberapa hal, membantu Anda memperbaiki masalahnya. Seperti yang saya katakan, hanya beberapa saran umum.

jcolebrand
sumber
10
ide bagus dengan istirahat 5 menit. Selalu berhasil. Membantu fokus. :-) Telah ada yang melakukannya.
John aka hot2use