Melakukan operasi pembaruan data sambil mencadangkan database SQL Server yang besar

9

Saya memiliki basis data besar (dalam puluhan juta catatan) yang akan saya gunakan untuk membuat cadangan basis data lengkap .

Namun, basis data cukup besar sehingga transaksi dapat dimulai sebelum dan selama, serta komit selama dan setelah pencadangan berlangsung.

Sebagai contoh:

T0 = Transaction A start
T1 = Full database backup start
T2 = Transaction B start (will not deadlock with A)
T3 = Transaction A commit/rollback (does not matter, does it?)
T4 = Full database backup end
T5 = Transaction B commit/rollback (again, does not matter, does it?)

T0          T1          T2          T3          T4          T6
||----------||----------||----------||----------||----------||---------->

Pemahaman saya adalah bahwa tidak ada kunci yang digunakan selama pencadangan (meskipun masalah kinerja lainnya mungkin timbul karena mengatakan, I / O tinggi) , tapi saya tidak yakin apa yang bisa saya jamin apa yang akan dilakukan atau tidak.

Juga, kekhawatiran saya bukanlah bahwa basis data akan berada dalam keadaan tidak konsisten, melainkan bagaimana keadaan itu (bahkan jika itu tidak deterministik, jika ada seperangkat aturan yang dapat diterapkan secara konsisten) dan bagaimana database itu sampai di sana ( misalnya, berapa banyak file data yang digunakan bersama dengan log transaksi untuk membuat file cadangan)?

casperOne
sumber
Saya menghapus komentar pertama saya dan memperluasnya menjadi jawaban. Saya masih mencoba mencari tahu bagaimana menemukan dengan tepat ketika data membaca cadangan selesai.
Simon Righarts

Jawaban:

7

Pada dasarnya, cadangan akan menjadi keadaan basis data ketika menyelesaikan bagian pembacaan data dari cadangan (sehingga semua data akan dicadangkan), ditambah berapa pun jumlah log transaksi yang diperlukan untuk memastikan konsistensi transaksional (awal) waktu log yang disertakan adalah MIN(most recent checkpoint time, oldest active transaction start time)). Paul Randal membahas ini di sini (dengan bantuan diagram, yang membuatnya jauh lebih mudah). Dalam contoh Anda, Aakan dilakukan (atau dibatalkan jika ROLLBACK TRANSACTIONdikeluarkan bukan a COMMIT) dan Bakan dibatalkan (terlepas dari hasil akhir transaksi itu).

(Alasan lain Anda mencoba dan membuat cadangan pada waktu yang tenang, selain dari pertentangan I / O, adalah bahwa semua log transaksi yang dihasilkan selama cadangan biasanya harus disertakan dengan cadangan.)

Fase pemulihan pemulihan basis data mengambil semua transaksi yang dilakukan dari log yang disertakan dalam cadangan dan menerapkannya ke basis data, dan mengembalikan semua transaksi yang tidak berkomitmen. (Inilah sebabnya WITH RECOVERY/ WITH NORECOVERYini penting. WITH RECOVERYDan Anda dapat menggunakan database, tetapi Anda tidak dapat menerapkan cadangan log lebih lanjut, Anda harus mengembalikannya untuk memasukkan WITH NORECOVERYcadangan log. Pemulihan memutus rantai log dengan memutar kembali transaksi yang tidak dikomit. )

Bacaan lebih lanjut:

Simon Righarts
sumber
4

Cadangan penuh akan kembali ke titik saat bagian pembacaan data cadangan selesai, minus transaksi yang tidak dikomit pada saat itu.

Seperti yang Anda sebutkan, database tetap online dan tersedia untuk ditulis saat cadangan terjadi. Cara kerjanya adalah sistem cadangan mencadangkan sekumpulan halaman data yang tidak konsisten (karena ini membutuhkan waktu yang tidak nol untuk membaca data) - dibutuhkan salinan dari setiap halaman data saat dihadapkan padanya, apa pun keadaannya in. Cadangan lengkap juga mencakup catatan log transaksi mulai dari awal transaksi aktif tertua di awal cadangan, hingga catatan log terakhir saat bagian pembacaan data selesai.

Ketika cadangan dipulihkan, data dan log disusun kembali apa adanya (ingat halaman data dalam keadaan tidak konsisten), maka proses pengulangan terjadi dari awal log transaksi yang dicadangkan (sekali lagi, di dalam cadangan penuh) , sampai akhir; kemudian, jika Anda memulihkan dengan RECOVERY, batalkan terjadi untuk memutar kembali setiap transaksi yang tidak berkomitmen pada saat cadangan selesai. The undo operasi apa yang meninggalkan database dalam keadaan transactionally konsisten, siap untuk digunakan. Memulihkan dengan NORECOVERYmengabaikan proses undo , memungkinkan Anda untuk mengembalikan cadangan tambahan (diferensial atau log transaksi).

Perhatikan bahwa jika basis data cukup besar dengan beban kerja tulis yang berat, log transaksi mungkin perlu bertambah selama pencadangan jika tidak tersedia ruang yang cukup saat ini. Log tidak dapat (secara internal) menghapus selama cadangan lengkap, bahkan jika Anda mengambil cadangan log transaksi, karena catatan log diperlukan untuk cadangan lengkap. Jika Anda mengambil cadangan log transaksi saat cadangan penuh terjadi, pembersihan log ditangguhkan secara otomatis hingga cadangan lengkap selesai.

Jon Seigel
sumber