Apakah memulihkan database SQL dari cadangan membangun kembali indeksnya?

10

Apakah memulihkan database SQL dari cadangan membangun kembali tabel dan indeksnya dari awal? Atau apakah itu tetap dalam tatanan fisik internal yang sama seperti pada saat cadangan?

Kami menggunakan SQL 2000 dengan cadangan terkompresi Quest Lightspeed, jika itu membuat perbedaan.

BradC
sumber

Jawaban:

16

Jawabannya adalah tidak, untuk perangkat lunak cadangan apa pun yang digunakan.

Cadangan adalah operasi fisik, bukan operasi logis. Itu membaca semua luasan yang berisi halaman yang dialokasikan (yaitu meskipun hanya satu halaman dari tingkat 8 halaman dialokasikan, itu akan mencadangkan seluruh tingkat 64K), dan melakukannya dalam urutan fisik.

Pemulihan adalah operasi fisik, bukan operasi logis. Itu meletakkan luasan di tempat yang selayaknya dalam file data.

Membangun kembali indeks (atau semacamnya) adalah operasi logis, yang harus dicatat. Cadangkan dan pulihkan memanipulasi file data secara langsung, tanpa melalui kumpulan buffer, yang merupakan salah satu alasan mengapa hal ini tidak dapat dilakukan. Alasan lain ini tidak dapat dilakukan adalah cadangan dan pemulihan tidak memiliki pemahaman tentang apa yang terkandung dalam data yang didukung.

Alasan utama ini tidak dapat dilakukan, bagaimanapun, adalah bahwa memindahkan halaman sekitar selama operasi pemulihan akan merusak pointer b-tree. Jika halaman A menunjuk ke halaman B, tetapi halaman A dipindahkan oleh proses pemulihan, bagaimana cara halaman B diperbarui untuk menunjuk ke halaman A? Jika segera diperbarui, maka mungkin akan ditimpa oleh sisa proses pemulihan. Jika ditangguhkan diperbarui, bagaimana jika proses pemulihan mengembalikan beberapa log transaksi yang menghapus halaman A, atau halaman B? Itu tidak bisa dilakukan.

Intinya - cadangan dan pemulihan adalah operasi fisik yang tidak pernah mengubah data.

Semoga ini membantu!

PS Meskipun tidak secara langsung menjawab pertanyaan ini, lihat artikel yang saya tulis untuk July TechNet Magazine yang menjelaskan bagaimana berbagai backup bekerja secara internal: Memahami SQL Server Backups . Majalah September akan memiliki seri berikutnya tentang pemahaman mengembalikan.

Paul Randal
sumber
2
Saya suka fakta bahwa Anda menjelaskan bahwa pengindeksan adalah operasi logis.
Jim B
Ah, itu masuk akal. Cadangan meraih luas fisik 64k penuh, bukan halaman data 8k.
BradC
Ini tidak masuk akal. Operasi cadangan sering memampatkan data yang mereka buat cadangannya, dan itu adalah jenis "perubahan" yang sedang kita bicarakan: Bagaimanapun, indeks dapat dibuat kembali dari tabel, mereka adalah data yang berlebihan (asalkan skema tersebut didukung , tentu saja). Alasan sebenarnya adalah kemalasan pada bagian pengembang basis data.
John
1
@ John Apa maksudmu omong kosong? Kompresi tidak disebutkan di mana pun di sini - hanya membangun kembali indeks, yang sama sekali tidak sama dengan kompresi (yang tidak mengubah halaman atau lokasi mereka dalam database selama pemulihan, sedangkan pembangunan kembali tidak). Membuat indeks dari awal selama pemulihan akan sangat lambat dibandingkan dengan hanya mengembalikannya apa adanya dari cadangan. Saya pikir Anda salah paham sesuatu di sini.
Paul Randal
Menjatuhkan dan membangun kembali indeks adalah jenis kompresi, dan kompresi dapat mengubah apa pun, tergantung pada jenis kompresi. Kompresi lossy dalam pemrosesan gambar masih disebut kompresi. Setiap mekanisme yang mewakili informasi yang diberikan dalam ruang yang lebih kecil adalah bentuk kompresi, dan menjatuhkan indeks adalah contoh sepele dari itu. Waktu pembangunan kembali yang lambat mungkin memang merupakan argumen nyata, setidaknya terhadap implementasi menjadi upaya yang bermanfaat.
John
6

Sebuah asli cadangan SQL hanya dump halaman page-by-file backup, sehingga jawabannya "tidak ada". Pencadangan lightspeed Quest kemungkinan menggunakan semacam algoritma kompresi kompresi, tetapi masih tidak akan "membangun kembali" file data atau indeks, yang akan memakan waktu sangat banyak pada database besar.

Aaron Alton
sumber
Ya, tetapi tetap harus menulis setiap halaman ke disk. Mengapa tidak menuliskannya dalam urutan logis, alih-alih dalam urutan terpecah-pecah? (Mungkin ini lebih merupakan pertanyaan cadangan alih-alih pertanyaan pemulihan : apakah cadangan menulis halaman dalam urutan fisik, atau dalam urutan logis?)
BradC
dengan asumsi ada produk yang menulis data dalam urutan indeks, Anda ingin memesan tabel mana? Katakanlah saya punya tabel dengan 3 kolom product_id, productname, dan harga. Mana kolom yang benar untuk mengurutkan untuk menyimpan halaman dalam urutan yang diindeks? BTW tidak ada yang menghentikan Anda dari pengindeksan pada seluruh tabel (indeks berkerumun) atau masing-masing baris (indeks komposit).
Jim B
@ Jim B: Itu mudah. Tabel akan disimpan dalam urutan indeks berkerumun. Indeks yang tidak berkerumun akan disimpan dalam urutan utama. Tumpukan akan disimpan dalam urutan asli (tidak diurutkan). (Aaron dan Paul telah menyebutkan alasan yang sah bahwa cadangan / pengembalian tidak melakukan hal ini. Tidak dapat mengetahui "urutan pilihan" bukanlah salah satu dari alasan ini. Atau melakukan pembangunan kembali indeks penuh akan memiliki masalah yang sama. )
BradC
Data dicadangkan dalam urutan halaman fisik yang sama persis dengan yang disimpan dalam file database. Ketika data dipulihkan, data tersebut dikembalikan dalam urutan halaman yang sama dengan yang dicadangkan. SQL tidak memindahkan data karena berbagai alasan. Termasuk bahwa mungkin ada masalah dengan transaksi yang memulihkan log dan masalah perangkaian halaman, belum lagi sejumlah besar waktu ekstra yang diperlukan untuk mengocok data sekitar pada basis data multi-TB.
mrdenny
2

Pencadangan dilakukan secara teratur dan sangat sering (saya harap). Jadi desainer memastikan cadangan secepat mungkin. Apa I / O tercepat? Sekuensial. Anda membaca blok dari disk dalam urutan fisik yang tepat, Anda memiliki kinerja terbaik.

Mengapa di Bumi database harus melakukan operasi I / O acak rumit setiap malam , menghancurkan kepala disk di semua tempat? Perbedaannya akan sekitar dua urutan besarnya. Tidak ada untung dalam hal ini.

kubanczyk
sumber
Saya setuju dengan poin keseluruhan Anda, tetapi tergantung pada konfigurasi penyimpanan yang mendasarinya, I / O acak mungkin bukan urutan besarnya lebih buruk daripada I / O berurutan (drive SAN yang tersebar di puluhan spindel, misalnya). Bahkan, jika file data terfragmentasi pada hard drive, maka I / O "sekuensial" tidak benar-benar berurutan sama sekali. Tetapi poin Paul menimpa ini pula (masalah dengan memperbarui pointer, dan bahwa defragmentasi harus menjadi operasi yang dicatat)
BradC
0

Hmmm. BradC, apakah Anda pernah bekerja dengan Firebird / Interbase sebelumnya - di mana utilitas backup / restore / API lebih mirip dengan "Copy Database ..." dari SSMS / EM? Jika demikian, ketahuilah bahwa MS SQL Server TIDAK menyukainya.

Cadangan SQLServer lebih merupakan dump basis data yang dipulihkan "SEBAGAIMANA ADANYA" - jadi ini lebih seperti jalan pintas online yang nyaman untuk operasi "lepaskan-salin-pasang kembali di tempat lain". Basis data yang dipulihkan hampir merupakan salinan tepat dari file basis data asli (hampir karena Anda dapat mengubah penempatan file basis data dari basis data yang dipulihkan) ...

Fabricio Araujo
sumber