Cadangan internal - Apa yang terjadi ketika pekerjaan cadangan berjalan - dalam hal penguncian dan overhead kinerja di SQL Server?


13

Untuk MySQL saya tahu database didukung tabel demi tabel dalam Pernyataan SQL, ini menghasilkan penguncian dan jika Anda memperbarui kolom saat membuat cadangan Anda mungkin berakhir dengan masalah integritas.

Untuk pemahaman saya ini tidak berlaku untuk Microsoft SQL Server, tetapi bagaimana SQL Server menangani ini? Apakah ada pembekuan internal agar db konsisten?

Saya juga mendengar bahwa pencadangan adalah satu utas yang berarti hanya menggunakan satu inti, dengan asumsi Anda membuat cadangan ke satu file. Juga dengan asumsi Anda memiliki mesin multicore, misalnya 16 core, atau setidaknya jumlah yang lebih besar dari satu.

Dari pengalaman pribadi saya, saya tidak pernah memiliki masalah saat mengambil cadangan, tidak mengunci atau masalah overhead, tetapi pengalaman saya terbatas. Itu sebabnya saya selalu merekomendasikan untuk mengaktifkan kompresi cadangan di properti server.

Jadi apa yang terjadi ketika pekerjaan cadangan sedang berjalan? Dan apakah ada perbedaan signifikan untuk versi yang berbeda? misalnya 2008, 2012 dan 2014 (bukan lisensi).


4
Artikel Paul Randall ini merupakan awal yang baik untuk informasi tentang backup technet.microsoft.com/en-us/magazine/2009.07.sqlbackup.aspx
James Anderson

Jawaban:


9

Semua poin Anda tercakup dalam mitos cadangan - oleh Paul Randal

30-01) operasi cadangan menyebabkan pemblokiran

Tidak. Operasi pencadangan tidak mengambil kunci pada objek pengguna . Cadangan memang menyebabkan beban baca yang sangat berat pada subsistem I / O sehingga mungkin tampak seperti beban kerja sedang diblokir, tetapi sebenarnya tidak. Itu hanya diperlambat. Ada kasus khusus di mana cadangan yang harus mengambil luasan yang dicatat secara massal akan mengambil kunci file yang dapat memblokir operasi pos pemeriksaan - tetapi DML tidak pernah diblokir.

Saya juga mendengar bahwa pencadangan adalah satu utas yang berarti hanya menggunakan satu inti, dengan asumsi Anda membuat cadangan ke satu file.

Pencadangan bila dilakukan untuk satu file atau perangkat akan menggunakan 1 utas penulis. Jadi, jika Anda mencadangkan ke Beberapa file / perangkat (selain itu beberapa file .bak) akan memiliki satu utas penulis per file / perangkat.

Cara termudah untuk meningkatkan kinerja cadangan adalah dengan memungkinkan operasi cadangan untuk paralel, yang dikenal sebagai striping cadangan. Secara default, ada utas pembaca data tunggal untuk setiap huruf drive atau titik pemasangan yang dibaca dan utas penulis data tunggal untuk setiap perangkat cadangan yang ditulis.

Memeriksa

  1. Video kesiapan SQL Server 2008 Microsoft Certified Master (MCM) terutama Backup Internal.
  2. Pandangan tentang Cadangan Internal dan Cara Melacak Cadangan dan Pemulihan Throughput (Bagian 1) - Oleh: Jonathan Kehayias
  3. Pandangan tentang Cadangan Internal dan Cara Melacak Cadangan dan Pemulihan Throughput (Bagian 2) - Oleh: Jonathan Kehayias

7

Artikel yang ditulis oleh Paul mengenai internal backup sangat bagus dan Anda harus membacanya. Menambah apa yang orang lain katakan dan tekankan pada bagian spesifik dari pertanyaan Anda

Saya juga mendengar bahwa pencadangan adalah satu utas yang berarti hanya menggunakan satu inti, dengan asumsi Anda membuat cadangan ke satu file. Juga dengan asumsi Anda memiliki mesin multicore, misalnya 16 core, atau setidaknya jumlah yang lebih besar dari satu.

Operasi pencadangan can use parallelismtetapi ingat ini Bukan paralelisme yang didorong oleh Pengoptimal dalam SQL Server, didorong oleh jumlah disk yang terlibat dari mana cadangan harus membaca file data dan di mana cadangan menulis file data dan jumlah file cadangan yang dibuat.

Anda tidak dapat menggunakan MAXDOP petunjuk saat mengambil cadangan SQL Server

Anda tidak dapat membuat rencana eksekusi di SSMS untuk operasi pencadangan TSQL sederhana.

Paralelisme yang didorong oleh pengoptimal permintaan dalam SQL Server pada dasarnya adalah untuk operator yang terlibat (sebenarnya ini lebih kompleks tetapi demi kesederhanaan Anda dapat mengambil ini) karena operasi cadangan tidak melibatkan operator apa pun karena itu tidak dapat menggunakan paralelisme yang didorong oleh pengoptimal.

Saya menulis sebuah artikel di Technet Wiki tentang Pencadangan dan paralelisme di mana saya menggunakan contoh sederhana untuk menjelaskan paralelisme selama pencadangan SQL Server. Berikut ini adalah kesimpulannya

  1. Jika file basis data ada di beberapa disk, operasi pencadangan akan dimulai pada utas per drive perangkat untuk membaca data. Dengan cara yang sama jika pemulihan dilakukan pada beberapa drive / titik pemasangan operasi cadangan akan memulai satu utas per titik drive / pemasangan

  2. Bahkan jika Anda membuang banyak salinan cadangan pada drive yang sama, kami akan mencabut satu utas per file cadangan.

  3. Paralelisme yang terkait dengan cadangan terkait dengan garis-garis. Setiap strip mendapatkan utas pekerjanya sendiri dan itu benar-benar satu-satunya bagian cadangan / pemulihan yang harus dipertimbangkan sebagai operasi paralel.

  4. Tingkat paralelisme maks tidak memengaruhi operasi cadangan.

Saya mendapat pendapat ahli tentang hal ini dari Paul dan Bob Dorr.

Jadi apa yang terjadi ketika pekerjaan cadangan sedang berjalan? Dan apakah ada perbedaan signifikan untuk versi yang berbeda? misalnya 2008, 2012 dan 2014 (bukan lisensi).

Saya sarankan Anda untuk membaca artikel blog.msdn ini oleh Bob Dorr. Beberapa poin penting yang ia tekankan adalah

  1. Saat pencadangan dimulai, ia menciptakan serangkaian buffer, dialokasikan dari memori di luar kumpulan buffer. Target biasanya 4MB untuk setiap buffer menghasilkan sekitar 4 hingga 8 buffer. Rincian tentang perhitungan ada di: http://support.microsoft.com/kb/904804/en-us

  2. Buffer ditransisikan antara antrian bebas dan data. Pembaca menarik buffer gratis, mengisinya dengan data dan menempatkannya pada antrian data. Penulis menarik buffer data yang terisi dari antrian data, memproses buffer dan mengembalikannya ke daftar gratis.

  3. Anda mendapatkan penulis per perangkat cadangan, masing-masing mengambil dari antrian data. Jadi perintah cadangan dengan empat (4) spesifikasi disk akan memiliki empat penulis dan satu pembaca. Pembaca menggunakan async I / O sehingga dapat mengimbangi penulis.

Anda dapat mengaktifkan trace flags 3213 and 3605, keduanya tidak berdokumen jadi silakan gunakan di lingkungan pengujian, dan lihat pesan menarik apa yang dibuang di SQL Server errorlog. Sesuatu seperti di bawah ini akan muncul

Memory limit: 249MB
BufferCount:                7
Sets Of Buffers:            1
MaxTransferSize:            1024 KB
Min MaxTransferSize:        64 KB
Total buffer space:         7 MB
Tabular data device count:  1
Fulltext data device count: 0
Filestream device count:    0
TXF device count:           0
Filesystem i/o alignment:   512
Media Buffer count:            7
Media Buffer size:          1024KB

Saya tidak mengetahui adanya perubahan signifikan dalam kode cadangan untuk berbagai versi, hal-hal seperti itu tidak didokumentasikan. Saya hanya tahu tentang peningkatan yang diperkenalkan pada SQL Server 2012 SP1 Cumulative Update 2,cadangan dan pemulihan yang diaktifkan dari layanan penyimpanan Windows Azure Blob dari SQL Server menggunakan TSQL atau SMO. Baca di sini


4

Pada dasarnya, SQL Server melakukan salinan kotor dari semua halaman pada disk. Halaman-halaman itu kemungkinan tidak konsisten jika ada aktivitas bersamaan atau jika sebelumnya ada cara non-checkpointed.

Kemudian, SQL Server juga menyalin bagian yang diperlukan dari log transaksi yang diperlukan untuk membawa halaman kedaluwarsa ke versi terbaru dan membuat semuanya konsisten pada pemulihan.

Saya tidak dapat berbicara dengan multi-utas operasi pencadangan. Saya berharap itu bisa diparalelkan. Bagaimana lagi Anda bisa membuat cadangan basis data 10TB pada subsistem IO 10GB / detik?


Terima kasih atas jawabannya, tetapi ada beberapa hal yang tidak jelas. Apa yang terjadi jika saya telah mengatur model pemulihan ke pernyataan sederhana atau menjalankan seperti terpotong selama pekerjaan cadangan. Bukankah itu berarti SQL server tidak dapat membawa ini ke keadaan yang konsisten?
RayofCommand

Model log efektif selama cadangan penuh. SQL Server harus dapat memutar semuanya ke depan, bahkan jika Anda ingin SEDERHANA. Memotong tabel adalah operasi yang dicatat dan ditransaksikan, tidak ada masalah di sana. DDL bersifat transaksional.
usr
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.