Pemulihan halaman online mencapai batas 1000


13

Saya telah ditugaskan untuk mencoba memulihkan database yang menderita korupsi (karena kegagalan I / O, yang telah diperbaiki sejak itu). Saya tidak terbiasa dengan database atau apa yang ada di dalamnya.

Saya telah diberi cadangan penuh lama (~ 3 minggu) dan serangkaian log transaksi ... namun ada log transaksi yang hilang, jadi saya hanya dapat memulihkan hingga tanggal tertentu. Ada sekitar 2,5 minggu data hilang (dan ada banyak data yang ditambahkan ke database ini secara konstan).

Saya juga telah diberikan salinan dari database korup (yang dapat diakses, tetapi dengan banyak halaman rusak / hilang).

Saya sudah mencoba DBCC CHECKDBperintah khas (masih belum repair_allow_data_loss, itu akan menjadi pilihan terakhir saya jika tidak ada yang berfungsi).

Setelah banyak yang datang dan pergi ke database (db adalah monster kecil 1,5 terabyte dan semua yang saya lakukan lambat dan memakan waktu cukup lama), saya sudah mencoba untuk melakukan pemulihan halaman online dari cadangan baik yang terakhir diketahui untuk halaman yang korup.

Untuk melakukan itu, saya telah melakukan skrip yang menciptakan banyak RESTORE DATABASE <foo> PAGE='pages' FROM DISK='<bar.bak>'perintah dari DBCC CHECKDBoutput (pada dasarnya sebuah regex dan berbeda) ... sejauh ini bagus, ini bekerja sampai pada titik di mana dikatakan saya telah mencapai batas 1000 halaman per file (ada 8 file pada db ini) per perintah restore.

Jadi ia meminta saya untuk "menyelesaikan pengembalian online", tetapi saya bingung bagaimana melakukan itu ... Saya tidak memiliki log ekor atau apa pun yang lebih lengkap daripada cadangan lengkap yang saya mulai, jadi Saya pada dasarnya tidak tahu bagaimana menyelesaikan pemulihan untuk terus mencoba dengan halaman lainnya.

Saya sudah mencoba RESTORE DATABASE <foo> WITH RECOVERYtetapi itu tidak berhasil, ia meminta saya untuk log yang tidak saya miliki.

Adakah yang punya tips bagaimana saya bisa memulihkan apa saja dari sini? Atau cara "menyelesaikan" pengembalian online agar saya dapat terus mencoba memulihkan lebih banyak halaman? Apakah saya akan memiliki masalah yang sama jika saya mencoba pemulihan offline (pada dasarnya menambahkan WITH NORECOVERYsemuanya dan kemudian mencoba mengembalikannya di akhir?)

Mengerjakan basis data dengan tangan pada dasarnya tidak dapat diurungkan ... ada ratusan tabel dengan jutaan baris dan tidak ada arti yang jelas dari semua itu. DB korup akan gagal pada SELECTkueri setelah beberapa juta baris, tetapi saya tidak yakin saya bisa mencari tahu di mana. Saya telah mencoba membangun kembali semua indeks yang tidak berkerumun, tetapi ada halaman yang rusak dengan data baris, sehingga tidak berfungsi juga.

Beberapa kehilangan data dapat diterima, tetapi konsistensi pada DB setidaknya harus berusaha untuk dicapai.

Basis data yang rusak adalah -still- online dan klien sedang mengusahakannya (sehingga terus mendapatkan data baru), jadi setiap proses yang saya lakukan di bangku laboratorium harus dapat direproduksi pada basis data produksi sesudahnya (downtime akan sulit untuk itu).

Ini adalah SQL Server 2014 Enterprise

PS: Saya bukan DBA ... Saya seorang programmer, tetapi klien telah mencoba beberapa layanan pemulihan bencana "ahli" sql dan mereka telah menyerah, jadi saya diminta untuk melihatnya dan melihat apakah saya bisa lakukan apapun.


Pembaruan : setelah banyak tes, pengembalian halaman demi halaman tidak dapat dilakukan, jadi kami membuang idenya. Kami akan melakukan pemulihan manual (secara manual memilih catatan yang hilang dari tabel korup dan memasukkannya ke dalam cadangan baik yang terakhir diketahui), melakukan beberapa alat otomatis untuk itu (sekali lagi, ada ratusan dan ratusan tabel).

Jawaban:


16

Prosedur standar adalah:

  1. Dapatkan ID halaman yang harus dipulihkan.
  2. Mulai pengembalian halaman dengan database lengkap.
  3. Terapkan cadangan diferensial terbaru.
  4. Terapkan pencadangan log selanjutnya.
  5. Buat cadangan log baru.
  6. Kembalikan cadangan lob baru.

Setelah cadangan log baru diterapkan, pengembalian halaman selesai dan halaman-halaman tersebut kemudian dapat digunakan.

Contoh Pulihkan

RESTORE DATABASE <database> PAGE='1:57, 1:202, 1:916, 1:1016'  
   FROM <file_backup_of_file_B>   
   WITH NORECOVERY;  
RESTORE LOG <database> FROM <log_backup>   
   WITH NORECOVERY;  
RESTORE LOG <database> FROM <log_backup>   
   WITH NORECOVERY;   
BACKUP LOG <database> TO <new_log_backup>;   
RESTORE LOG <database> FROM <new_log_backup> WITH RECOVERY;  
GO  

Referensi: Pulihkan Halaman (SQL Server) (Microsoft Documents) Referensi: RESTORE Statement (Transact-SQL) (Microsoft Documents)

Namun, Anda memiliki lubang pada cadangan TLOG Anda, dan memulihkan dengan prosedur di atas mungkin membawa database Anda kembali ke keadaan saat Anda tidak menginginkannya.


Anda berada dalam situasi yang rumit.

  1. Basis data Anda memiliki halaman yang rusak dan perusahaan Anda terus-menerus menambahkan data baru ke basis data yang bermasalah. Ini bisa mengakibatkan total downtime basis data. Apakah Anda ingin mengambil risiko itu?

  2. Seseorang akan dianggap bertanggung jawab dan semakin Anda mencoba memperbaikinya, semakin banyak manajemen yang cenderung untuk memutuskan bahwa Anda mungkin menjadi orang itu pada akhirnya. Apakah Anda ingin mengambil risiko itu?

  3. Anda menempatkan diri Anda dalam situasi yang sulit dengan mengambil peran yang bukan tempat Anda bekerja. Anda mencoba mencapai sesuatu yang tidak mampu dilakukan oleh DBA perusahaan maupun konsultan eksternal Anda. Meskipun itu mungkin terlihat sebagai gerakan mulia, Anda menempatkan diri Anda dalam risiko. Anda mungkin telah "secara implisit berjanji" sesuatu yang tidak akan pernah bisa Anda penuhi. Apakah Anda ingin mengambil risiko itu?

  4. Ketika seseorang yang bekerja dengan database meminta data yang rusak, mereka mungkin akan menerima pesan kesalahan. Pekerjaan sehari-hari sudah terpengaruh. Semakin lama Anda menunggu dengan tak terhindarkan semakin banyak produktivitas akan terpengaruh. Apakah Anda ingin mengambil risiko itu? (Pertanyaan ini juga dapat diajukan dengan manajemen)

  5. Prosedur pencadangan perusahaan Anda tampaknya salah (jika tidak, bagaimana cadangan TLOG akan hilang?) Dan Anda masih menjalankan basis data produksi Anda seolah-olah tidak ada masalah. Apakah Anda ingin mengambil risiko itu?

Rekomendasi terbaik yang dapat saya berikan kepada Anda adalah untuk menghentikan produksi dan menghubungi Microsoft! Atau setidaknya hubungi Microsoft dan mungkin hentikan produksi.

Sementara tulisan saya mungkin tampak terlalu hati-hati dan sedikit didramatisir dari sudut pandang Anda, saya pribadi dapat menghubungkannya dengan pengalaman sebagai DBA di mana data hilang dalam situasi yang sama. Kami hanya kehilangan data setengah hari, tetapi kami harus menyinkronkan kembali banyak data dengan sistem di sekitarnya .

Semakin lama Anda menunggu pemulihan yang lebih mahal bisa menjadi.


Adapun batasan untuk mengembalikan halaman, berikut kutipan dari dokumentasi resmi:

The jumlah halaman maksimal yang dapat dikembalikan ke setiap file tunggal dalam mengembalikan urutan adalah 1000 . Namun, jika Anda memiliki lebih dari sejumlah kecil halaman yang rusak dalam suatu file, pertimbangkan untuk mengembalikan seluruh file alih-alih halaman tersebut.

( penekanan milikku)

Referensi: Pernyataan RESTORE - Argumen (Transact-SQL) (Microsoft Documents)


Ketika semuanya kembali normal, DBA dan / atau konsultan eksternal mungkin ingin mempertimbangkan untuk menerapkan kebijakan / prosedur pencadangan / pengembalian yang berbeda untuk basis data Anda. Karena harus 7x24 Anda tidak dapat mengambil risiko memiliki prosedur cadangan yang tidak memberikan kemampuan pemulihan yang memadai untuk situasi apa pun.


2
Sebagian besar masalah Anda telah saya angkat dan urus (saya jelas tidak bertanggung jawab jika terjadi kesalahan, produksi harus dihentikan, dll.). Saya telah membuat diri saya sangat jelas mengenai hal itu, namun saya tidak memiliki kendali atau keputusan di sana. Saya tidak berpikir itu sangat hati-hati atau didramatisasi ... Saya pikir mereka pada dasarnya melakukan kesalahan, dan saya hanya mencoba untuk membantu di sini, tetapi tanpa kompromi diri. Saya mengerti batas 1000 halaman, tetapi saya berharap itu hanya untuk satu perintah pemulihan (karena saya melakukannya secara online, saya berharap saya tidak berada dalam urutan ... Saya tidak bisa menjelaskan dokumen) .
Jcl

1

Saya melihat Anda telah mencoba berbagai metode termasuk bekerja dengan "ahli" pemulihan data untuk memperbaiki basis data yang rusak ini terutama dengan ukuran lebih dari 1 TB. Ini membuat prosesnya jauh lebih sulit dan berpacu dengan waktu. Sebagai seorang DBA yang berpengalaman, saya telah menemukan situasi yang serupa di mana sebagian besar waktu, ada cadangan yang baik untuk dipulihkan. Dalam kasus mewarisi cadangan buruk dan database korup, saya sangat bergantung pada alat pihak ketiga yang disebut alat Perbaikan Database Stellar Phoenix SQL . Alat ini terkenal untuk memperbaiki database yang korup (.mdf dan .ndf). Berikut adalah beberapa fungsi alat:

  • Memperbaiki file SQL Database (.mdf & .ndf) yang rusak
  • Memulihkan tabel, pemicu, indeks, kunci, aturan & prosedur tersimpan
  • Melakukan Pemulihan catatan yang dihapus dari SQL Database

  • Menyimpan hasil Pemindaian Basis Data untuk Melakukan Pemulihan di Tahap Selanjutnya

  • Mengizinkan penyimpanan file yang diperbaiki dalam format MSSQL, HTML, XLS & CSV
  • Mendukung MS SQL Server 2016, 2014, 2012.2008 dan versi yang lebih lama

Alat ini membutuhkan file .mdf dan .ndf agar offline sehingga berfungsi dengan baik bahwa Anda memiliki salinan basis data PROD yang rusak dan tidak harus menghentikan layanan SQL Server.

Bagian terbaiknya adalah versi percobaan memberi Anda fungsionalitas penuh alat kecuali bahwa database yang diperbaiki tidak dapat diekspor / disimpan. Anda masih dapat melihat semua objek basis data yang dipulihkan dan file log perbaikan yang luas yang memberikan perincian tentang berbagai tahapan proses perbaikan.

Jangan ragu untuk mengunduh dan melihat apakah itu membantu. Unduh disini

Saya juga menulis blog tentang cara alat ini bekerja di situs ini: blog samosql

Terima kasih dan HTH menjadikan Anda PAHLAWAN hari ini!

PS. Ketika badai ini berakhir, ingatlah untuk memberi tahu manajemen bahwa perlu ada perombakan besar atas prosedur pencadangan mereka terutama untuk database seperti itu. Pengulangan skenario ini sama sekali tidak bisa diterima! :)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.