Mengapa cadangan diferensial tidak dapat menentukan basisnya?

18

Ini adalah posting DBA.SE pertama saya, jadi tolong beri tahu saya jika ada kesalahan, terima kasih!

Saya seorang DBA baru (bukan pro TI, tidak ada orang lain di perusahaan yang melakukannya), jadi semakin dasar penjelasannya, semakin baik. Saya telah membaca tentang strategi cadangan basis data (atau, sebagaimana saya telah belajar menyebutnya, "kembalikan strategi"). Saya memahami apa yang dilakukan cadangan Cadangan, Diferensial, dan Log Transaksi, tetapi saya ingin tahu mengapa cadangan diferensial hanya dapat didasarkan pada cadangan lengkap terbaru.

Jika cadangan diferensial adalah segalanya yang telah berubah sejak cadangan penuh terakhir, lalu mengapa diferensial tidak dapat didasarkan pada cadangan apa pun yang saya pilih? Agar lebih jelas, saya bertanya tentang menentukan basis saat cadangan diambil , bukan saat memulihkan. Saya mengasumsikan bahwa ketika memulihkan Anda akan memilih basis yang benar dan diferensial yang sesuai untuk melakukan pengembalian (tidak menggunakan diferensial yang dibuat dari basis B untuk memulihkan dari basis A).

Apa alasan yang mencegah kemungkinan fungsionalitas ini? Saya pikir pasti ada alasan, saya tidak tahu apa itu.

Catatan: Saya mengerti bahwa markas tidak dapat ditentukan, tetapi pertanyaan saya adalah mengapa tidak ? (Saya juga tidak tertarik berdiskusi tentang "mengapa Anda mau?")

Analogi

Berikut ini analogi tentang bagaimana saya memahami cadangan diferensial:

Saya memiliki file Excel dengan beberapa data dalam sel.

Pada hari 1, saya membuat salinan file ini dan menyimpannya di tempat lain ("full backup").

Pada hari 2, saya melihat file dan membandingkannya dengan salinan cadangan yang saya buat pada hari 1, dan saya perhatikan semua sel yang telah berubah dan apa nilai-nilai baru mereka ("cadangan diferensial"). Saya tidak mencatat setiap perubahan yang dilakukan pada sel, hanya apa nilai akhirnya. Jika sel A1 dimulai sebagai "Alfred", berubah menjadi "Betty", "Charlie", lalu "Dave", saya hanya akan mencatat bahwa "A1 sekarang Dave".

Pada hari 3, saya membandingkan file saat ini dengan file cadangan lagi dan perhatikan perubahan ("cadangan diferensial" lain dengan basis yang sama dengan hari 2). Sekali lagi, hanya mencatat nilai akhir per sel pada saat diamati, tidak semua nilai sel telah sepanjang hari.

Pada hari ke 4, saya membandingkan lagi dan mencatat perubahan lagi. Melanjutkan dengan sel A1, sekarang tertulis "Sarah", bahkan jika itu 10 nama lain sepanjang hari, dan yang saya perhatikan adalah "Sekarang A1 adalah Sarah".

Pada hari ke 5, file saya menjadi kacau; jadi, saya melihat salinan cadangan yang saya buat pada hari 1, kemudian menyatakan terakhir dicatat pada hari 4, dan saya menerapkan perubahan yang dicatat pada salinan cadangan dan sekarang saya memiliki file "dikembalikan" seperti pada hari 4 Jadi, saya melihat cadangan yang dibuat pada hari 1, melihat bahwa pada hari 4 sel A1 berakhir sebagai "Sarah", dan mengubah sel cadangan A1 menjadi "Sarah".

Mengapa penting jika saya membuat salinan cadangan lain ("penuh") dari file pada hari ke 2? Mengapa masih tidak mungkin membandingkan (baca, "ambil cadangan diferensial") file pada hari 3 atau 4 dengan salinan yang dibuat pada hari 1? Seperti yang saya pahami, SQL Server akan meminta saya untuk membandingkan (ketika mengambil cadangan diferensial lain) ke cadangan penuh yang dibuat pada hari ke 2 (jika ada yang dibuat) - tidak ada pilihan lain.

elmer007
sumber

Jawaban:

14

Cadangan diferensial menggunakan apa yang disebut peta perubahan diferensial untuk membuat daftar halaman yang telah dimodifikasi sejak pencadangan penuh terakhir. Daftar ini adalah daftar "diferensial", karenanya nama jenis cadangan, dan alasan cadangan hanya dapat dipulihkan di atas cadangan lengkap terkait.

Melakukan pencadangan penuh akan mengatur ulang peta perubahan diferensial. Sejak saat itu, setiap halaman yang dimodifikasi dicatat di peta. Jika Anda kemudian mengambil diferensial, cadangan itu hanya berisi halaman yang telah dimodifikasi sejak cadangan penuh terakhir, dan direkam di peta.

Dalam analogi Anda, dua cadangan lengkap, yang berfungsi sebagai basis untuk seluruh proses pemulihan kemungkinan akan memiliki konten yang berbeda, dan karenanya peta diferensial berbeda. Jika Anda mengembalikan diff berdasarkan cadangan pertama dari cadangan ke-2, basis data kemungkinan akan rusak. Bahkan, SQL Server mencegah pemulihan cadangan berbeda atas apa pun kecuali cadangan penuh asli yang menjadi dasarnya.

Ketika Anda meminta SQL Server untuk mengambil cadangan diferensial, satu-satunya "basis" untuk diferensial adalah peta perubahan diferensial tunggal yang ada dalam database pada saat cadangan diferensial dimulai. Inilah sebabnya mengapa Anda tidak dapat menentukan basis untuk cadangan diferensial.


Menanggapi komentar dari @MartinSmith - Anda mungkin dapat menggunakan COPY_ONLYcadangan untuk mengembalikan cadangan diferensial atas sejumlah cadangan lengkap. Pertimbangkan skenario berikut:

  1. BACKUP DATABASE xyz TO DISK = 'path_to_backup.bak';
  2. BACKUP DATABASE xyz TO DISK = 'path_to_backup_2.bak' WITH COPY_ONLY;
  3. BACKUP DATABASE xyz TO DISK = 'path_to_backup_3.bak' WITH COPY_ONLY;
  4. BACKUP DATABASE xyz TO DISK = 'path_to_backup_4.bak' WITH COPY_ONLY;
  5. BACKUP DATABASE xyz TO DISK = 'path_to_backup_diff.bak' WITH DIFFERENTIAL;

Pencadangan diferensial pada langkah 5 harus mampu dipulihkan di atas cadangan apa pun yang diambil dalam langkah 1 hingga 4, karena peta perubahan diferensial hanya dihapus saat pencadangan penuh pada langkah 1 terjadi. The COPY_ONLYbackup dalam langkah 2, 3, dan 4, jangan tidak ulang peta perubahan. Karena peta perubahan diferensial mengakumulasikan perubahan yang dibuat sejak cadangan penuh, masing-masing COPY_ONLYcadangan berurutan berisi informasi yang cukup untuk cadangan diferensial untuk bekerja melawan salah satu dari 4 cadangan sebelumnya.

Meskipun sepertinya itu harus bekerja, dalam praktiknya, mengembalikan diferensial di atas hasil copy_only hanya dalam kesalahan berikut:

Msg 3136, Level 16, State 1, Line 1
Cadangan diferensial ini tidak dapat dipulihkan karena basis data belum dipulihkan ke keadaan sebelumnya yang benar.
Msg 3013, Level 16, Status 1, Baris 1
KEMBALIKAN DATABASE berakhir secara tidak normal.

Saya telah membuat repro platform SQL Server 2012 untuk menguji diferensial dan copy_only mengembalikan, dan menyimpan file di gist.github.com - PERINGATAN skrip akan menghapus semua database yang disebut RestoreTestsebagai langkah pertama.

Max Vernon
sumber
Melakukan pencadangan penuh hanya akan mereset peta perubahan diferensial jika tidak COPY_ONLY- Jika OP akan mengambil pencadangan penuh reguler pada hari 1 dan COPY_ONLYpencadangan penuh pada hari 2 maka masalah apa yang akan terjadi dengan menerapkan diferensial yang lebih baru dari basis yang sama ke cadangan hari 2?
Martin Smith
Saya baru saja mengujinya dan dalam prakteknya itu tidak memungkinkan mengembalikan diferensial kemudian ke copy_only meskipun "cadangan diferensial ini tidak dapat dipulihkan karena database belum dikembalikan ke keadaan sebelumnya yang benar." - Saya tidak yakin apakah ada alasan mengapa ini tidak berhasil atau hanya saja tidak diterapkan.
Martin Smith
1
@MartinSmith - shooot. Saya sudah memvalidasi itu juga sekarang.
Max Vernon
5

Fitur yang Anda inginkan bisa ada secara prinsip. Itu tidak akan efisien dengan struktur basis data saat ini (lihat jawaban Max Vernon). SQL Server harus memelihara satu set peta yang berbeda atau membandingkan konten DB saat ini dengan cadangan lengkap yang Anda tentukan sebagai basis.

Ada aplikasi yang mendupuplikasi file besar. Anda dapat membuat dua cadangan penuh dan hanya data yang diubah yang benar-benar akan disimpan. Ini seperti perbedaan dengan basis kustom. exdupemisalnya bisa melakukan itu.

Yang menyenangkan tentang itu adalah ia bekerja dengan set file cadangan sama sekali. Bahkan dimulai dengan file cadangan lengkap ke-3 Anda hanya akan membayar tambahan penggunaan ruang (bukan diferensial). Penggunaan ruang adalah perbedaan dengan file cadangan sebelumnya (bukan yang pertama). Penyimpanan deduplicating memiliki perilaku yang sama.

Mengapa fitur yang Anda jelaskan tidak ada? Setiap fitur menghabiskan anggaran sehingga fitur lainnya tidak ada. Yang ini tampaknya tidak cukup jauh dalam daftar prioritas. Saya tidak yakin apa manfaatnya. Sepertinya persyaratan yang cukup esoteris untuk menggunakan pangkalan khusus.

usr
sumber
3

Jangan bingung antara backup log transaksi dengan backup diferensial, mereka memiliki tujuan yang berbeda! Apa yang Anda sebut "cadangan diferensial", di mana Anda "mencatat semua perubahan pada sel", sebenarnya adalah log transaksi .

Tujuan cadangan diferensial adalah untuk menjaga ukuran file cadangan yang dihasilkan tetap kecil dengan hanya merekam informasi yang telah berubah sejak cadangan penuh terakhir, dan untuk menjaga waktu pemulihan sesuai dengan target waktu pemulihan (RTO).

Tujuan Sebuah transaksi log cadangan adalah untuk membiarkan Anda memutar ulang transaksi ke sembarang titik dalam waktu - sering, tapi pasti tidak perlu untuk "paling baru-baru ini sesuatu yang terjadi".

Apa yang Anda bicarakan sebenarnya mungkin - tetapi Anda perlu mengembalikan cadangan penuh, dan kemudian memulihkan log transaksi.

Jika Anda memiliki cadangan penuh hari 1 dan semua cadangan log transaksi antara hari 1 dan hari 5, tidak ada yang menghentikan Anda dari memulihkan cadangan hari 1 dan memutar ulang log transaksi hingga Anda memiliki data seperti pada hari 4. Anda bisa juga mulai dari cadangan hari 2, yang akan sedikit lebih cepat untuk dipulihkan, karena Anda akan memutar ulang lebih sedikit transaksi. Anda juga dapat mengembalikan cadangan penuh hari 1, cadangan diferensial hari 3, dan kemudian mengembalikan log transaksi ke hari 4.

Sunting: Oke, analogi Anda yang diedit lebih masuk akal. Jawabannya adalah "karena Anda sudah dapat mencapai apa yang Anda inginkan dengan backup log transaksi". Cadangan diferensial hanyalah cara murah dan nyaman untuk merekam sejumlah besar aktivitas log transaksi. Itu tidak menawarkan rincian pemulihan data bahwa cadangan log transaksi tidak menawarkan. Hanya ada begitu banyak fitur yang menawarkan "kenyamanan belaka" yang membuatnya menjadi produk.

dpw
sumber
Saya pikir saya mungkin telah menganalogikan analogi dengan buruk, siaga untuk edit ... maaf
elmer007
Diedit untuk analogi baru Anda.
dpw
1

Memberi analogi dengan Excel membandingkan apel dan jeruk. Mengapa Excel bukan database karena kurang integritas data. Excel adalah aplikasi spreadsheet yang cukup bagus dan mungkin menjadi pelengkap database.

SQL Server adalah sistem basis data relasional yang memungkinkan Anda untuk menyimpan semua data Anda dan menyediakan mekanisme untuk menanyakannya. Bagian yang penting adalah "Relasional" karena hubungan data penting bersama dengan integritas data (properti ACID).

Dasar-dasar:

Data dalam database disusun menjadi komponen logis (tabel, tampilan, procs, pemicu, dll) yang dapat dilihat oleh pengguna. Minimal, database juga secara fisik diimplementasikan sebagai dua (file data & log) atau lebih (file data sekunder) pada disk.

  • Database berisi halaman yang merupakan unit dasar penyimpanan data yang digunakan untuk menyimpan catatan .
  • Halaman database adalah potongan 8192 byte (8KB) ​​dari file data database.
  • 8 halaman yang bersebelahan secara fisik (8 * 8KB = 64KB) dalam file database membentuk batas .
  • Halaman IAM (Indeks Allocation Map) melacak sekitar 4GB ruang dalam satu file, disejajarkan pada batas 4GB. Potongan 4GB ini disebut interval GAM .

mengapa cadangan diferensial hanya dapat didasarkan pada cadangan lengkap terbaru. - atau - Jika cadangan diferensial adalah segalanya yang telah berubah sejak cadangan penuh terakhir, lalu mengapa diferensial tidak dapat didasarkan pada cadangan apa pun yang saya pilih?

Berdasarkan analogi Anda tentang excel, apa yang Anda lakukan adalah menerapkan apa yang telah berubah menjadi yang pertama. Ini menerapkan semua transaksi yang dilakukan dari log transaksi with STOP AT(catatan: Pada hari ke 5 file menjadi kacau dan Anda berhenti pada hari ke 4)

Di setiap bagian 4GB (disebut interval GAM) dari setiap file data ada halaman database khusus yang disebut bitmap diferensial yang melacak bagian mana (disebut luasan) dari bagian 4GB telah berubah sejak cadangan penuh terakhir, yang menunjukkan data yang telah berubah atau telah ditambahkan ke database.

Pencadangan diferensial memindai melalui bitmap ini dan hanya mencadangkan ekstensi file data yang ditandai sebagai diubah. Bitmap direset oleh cadangan lengkap berikutnya (karenanya cadangan diferensial hanya dapat didasarkan pada cadangan lengkap terbaru) , sehingga Anda dapat melihat bahwa semakin banyak perubahan database, semakin banyak yang akan ditandai dalam bitmap diferensial dan cadangan diferensial berturut-turut akan lebih besar dan lebih besar.

Anda bahkan dapat menggunakan skrip ini untuk mencari tahu Berapa banyak dari database telah berubah sejak cadangan penuh terakhir? .

Informasi dasar diferensial disimpan dalam masterbasis data - sys.database_fileatau ( sys.master_files- berguna ketika basis data read_only atau offline).

Ada 3 kolom penting yang menyimpan info terkait basis diferensial .

  • Ini differential_base_lsnadalah basis untuk cadangan diferensial. Data luasan yang diubah setelahnya differential_base_lsnakan dimasukkan dalam cadangan diferensial.
  • Ini differential_base_guidadalah pengidentifikasi unik cadangan dasar yang menjadi dasar cadangan diferensial.
  • Ini differential_base_timeadalah waktu yang sesuai dengandifferential_base_lsn

Pencadangan diferensial berguna untuk mempercepat RTO (Waktu Pemulihan Objective = Waktu yang diperlukan untuk memulihkan basis data Anda) sebagai lawan dari pencadangan penuh yang lebih sering yang akan menjadi masalah bagi basis data besar atau memulihkan volume pencadangan log transaksi karena dapat tumbuh besar dari waktu ke waktu.

Catatan: Cadangan lengkap COPY_ONLY tidak mengatur ulang basis diferensial, sehingga cadangan COPY_ONLY tidak dapat berfungsi sebagai basis diferensial.

Referensi :

Kin Shah
sumber
2
@PaulSRandal menulis Pages ada untuk toko catatan. di blog-nya dan jadi saya referensi apa adanya. Mengambil referensi logis apa yang Anda katakan (berdasarkan referensi) juga benar!
Kin Shah