Bagaimana saya bisa membuat cadangan database SQL Server besar tanpa mempengaruhi kinerja?

18

Kami memiliki laporan tentang kueri yang berjalan lambat atau waktu keluar di pagi hari, dan satu-satunya pekerjaan yang saya lihat berjalan yang menurut saya dapat memengaruhi ini adalah pekerjaan cadangan basis data kami.

Basis data itu sendiri sekitar 300GB, dan pekerjaan pencadangan dimulai pada pukul 4:30 pagi dan tidak selesai sampai sedikit setelah 7:00 pagi. Sintaks pekerjaan cadangan kami saat ini adalah:

BACKUP DATABASE [DatabaseName]
TO DISK = N'E:\Database Backups\DatabaseName.Bak'
WITH INIT, NOUNLOAD, NAME = N'DatabaseName.Bak',
NOSKIP, STATS = 10, NOFORMAT

E:\ adalah partisi di server yang menampung baik basis data maupun cadangan basis data.

Perlu juga dicatat bahwa ini adalah server virtual, bukan server mandiri khusus. Kami mulai mendapatkan keluhan tentang perlambatan selama proses pencadangan tepat setelah kami beralih ke server virtual, jadi saya pikir itu mungkin terkait.

Apakah ada cara untuk menjalankan pekerjaan pencadangan ini sehingga tidak memengaruhi kinerja kueri saat sedang berjalan?

Kami menggunakan SQL Server 2005

Rachel
sumber

Jawaban:

21
  1. Pisahkan I / O cadangan dari I / O lainnya di sistem Anda. Walaupun mungkin membutuhkan waktu lebih lama dan lebih rentan terhadap cegukan, mencadangkan melalui jaringan alih-alih ke disk lokal dapat membantu mengurangi dampak langsung pada instance. Bahkan dalam mesin virtual Anda harus dapat mengekspos penyimpanan lain sehingga SQL Server dapat menulis ke subsistem I / O yang berbeda.
  2. Ini tidak akan membuat perbedaan apa pun tetapi, jika ini dijalankan dari pekerjaan, mengapa Anda perlu menggunakan STATSopsi ini? Apakah Anda yakin Anda membutuhkan pilihan lain ( NOUNLOAD, NOSKIP, NOFORMAT)? Saya belum melakukan pengujian kinerja yang luas pada seluruh matriks opsi, tetapi IMHO Anda hanya harus menggunakan opsi yang Anda tahu Anda butuhkan.
  3. Jalankan cadangan lengkap Anda di waktu yang berbeda yang tidak mengganggu aktivitas pengguna biasa. Ini tidak selalu mungkin, tetapi bahkan dalam operasi 24/7 ada puncak dan waktu tenang.
  4. Jika Anda pindah ke 2008+, Anda dapat memanfaatkan kompresi cadangan (Enterprise on 2008, Standard atau Enterprise in 2008 R2 +). Jika Anda tidak dapat pindah ke 2008 atau tidak memiliki edisi yang memadai, ada alat cadangan pihak ke-3 yang akan melakukan kompresi untuk Anda, dan mereka semua sangat mahir melakukannya. Sejak 2008 saya sudah bisa menggunakan kompresi asli, dan saya sudah cukup puas dengan kecepatan dan kompresi% di sana tanpa perlu berinvestasi lebih lanjut di pihak ke-3. Tetapi dengan 2005 saya ingat pernah sukses dengan Red-Gate SQL Backup ; Quest LiteSpeed juga cukup bagus, tapi saya tidak tahu upaya apa yang dilakukan sejak akuisisi Dell.
  5. Jika database Anda dalam pemulihan penuh, Anda bisa pergi lebih lama antara cadangan penuh, menukarnya dengan sepengetahuan bahwa jika Anda harus memulihkan ke titik waktu, Anda berpotensi memiliki lebih banyak log untuk dipulihkan. Anda dapat menggabungkan opsi ini dengan saran Ali di bawah ini untuk mengambil diffs sepanjang minggu - jika Anda harus memulihkan pada hari Kamis, Anda perlu mengembalikan 1 penuh, 1 diff, dan log sejak diff.
  6. Jika Anda memiliki banyak data yang basi dan tidak berubah, Anda dapat mempertimbangkan hosting itu di database yang berbeda dengan rencana pemulihan yang berbeda, atau setidaknya pada filegroup yang berbeda, dan membagi operasi cadangan Anda dengan cara itu. Jika Anda memiliki data referensi atau arsip yang dapat dibuat hanya-baca, dan jika Anda sedang dalam pemulihan sederhana, Anda dapat memindahkannya ke grup-baca baca-saja sendiri, buat cadangannya sekali, dan tidak harus memasukkannya dalam cadangan malam Anda lagi. Lihat topik MSDN ini:

Melakukan pengembalian sedikit demi sedikit

Contoh: Pemulihan sedikit demi sedikit Hanya Beberapa Grup Film (Model Pemulihan Sederhana)

Aaron Bertrand
sumber
Apakah Anda dapat mengarahkan saya ke arah yang benar untuk mempelajari lebih lanjut tentang mengisolasi I / O cadangan dari sisa I / O dalam sistem? # 3 (mengubah waktu pencadangan) bukan merupakan pilihan sejak 4:30 pagi adalah waktu terbaik untuk menjalankan pencadangan, dan kami telah berbicara tentang meningkatkan ke 2008 (# 4), tapi saya tidak berpikir itu akan terjadi dalam waktu dekat
Rachel
Tidak yakin bagaimana mengarahkan Anda ke arah yang benar - dapatkah Anda mengekspos penyimpanan lain ke mesin virtual?
Aaron Bertrand
Ya, saya pikir kita dapat mengekspos penyimpanan lain ke mesin virtual. Ketika Anda mengatakan "mengisolasi I / O cadangan dari sisa I / O dalam sistem", apakah Anda mengacu membuat cadangan ke drive jaringan, bukan drive disk?
Rachel
3
Tidak, maksud saya mencadangkan ke subsistem I / O lainnya selain dari disk di mana Anda juga secara bersamaan melakukan membaca dan menulis untuk database reguler dan aktivitas tempdb. Ini bisa berupa disk drive yang berbeda di server yang sama, berbagi di komputer lain, LUN berbeda di SAN, berbagi di NAS, dll.
Aaron Bertrand
I Pemulihan sedikit demi sedikit adalah solusi hebat yang tidak saya pikirkan, terima kasih telah mempostingnya!
Ali Razeghi
8

Ini adalah masalah umum, ada banyak solusi dan sangat tergantung pada lingkungan Anda. Mari kita lewati mereka:

1- Cadangan Kompresi On The Fly

Pada tahun 2008 Kompresi Cadangan R1 menjadi tersedia di Perusahaan, pada tahun 2008 R2 menjadi Kompresi Standar. Ini BESAR. Ini akan menghemat banyak waktu. Jika Anda dapat meng-upgrade, lakukan saja. Jika tidak bisa, periksa utilitas RedBate HyperBak , atau Quest LiteSpeed . Keduanya memiliki uji coba gratis.

2- Backup Lengkap dan Diff

Saya mewarisi database prod 2TB menyebabkan banyak waktu tunggu untuk perusahaan internet utama 24/7 yang saya kerjakan. Kami mengaktifkan cadangan lengkap dan diferensial yang menghemat banyak waktu. Saya akan mengambil cadangan penuh pada hari Minggu 12:00 ketika aktivitas rendah, dan mengambil perbedaan selama seminggu. Ini menghemat banyak ruang. Pekerjaan Diff berbeda dari log transaksi saat mereka bekerja pada halaman database apa yang diubah. Setiap halaman yang diubah didukung. Dengan demikian, Anda melakukan pengembalian penuh, kemudian pemulihan kembali untuk menambahkan halaman yang dimodifikasi.

3- Apa Hambatan Anda?

Analisis bottleneck penting untuk didiagnosis. Apakah Anda mencadangkan ke disk array yang sama dengan file data Anda? Apakah file data Anda dipatok? Apa DISK SEC / READ dan DISK SEC / WRITE Anda untuk disk data selama pencadangan? Saya memodifikasi cadangan untuk membuat 4 file. Setiap file memiliki penulis utas sendiri dan dalam SAN kami yang bekerja dengan baik. Mengujinya, saya mencukur 45 menit dengan hanya membuat 4 file cadangan. Pastikan metrik disk Anda yang tercantum di atas rendah. Dapatkan garis dasar.

4- Replikasi ke Server yang Berbeda Dan Cadangkan Itu

Yang ini sedikit maju. Anda harus memastikan bahwa database replikasi Anda mutakhir dan Anda perlu pemantauan yang tepat untuk itu. Jika ya, Anda bisa mencadangkan database yang direplikasi.

Ali Razeghi
sumber
Baru saja mengetahui tentang HyperBak, saya sudah mendapatkannya tidak memberikan keuntungan pada VLDB ketika saya mengujinya di akhir tahun 2011. Saya berbicara dengan RedGate dan mereka menyebut itu bug, jadi semoga sekarang sudah teratasi. Saya tidak berpikir 300GB akan dianggap sebagai VLDB, tetapi hati-hati jika tidak bekerja seperti yang diharapkan.
Ali Razeghi
-1

Anda dapat menggunakan parameter ini:

BLOCKSIZE - Pilih Ukuran 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536. (dalam KB)

BUFFERCOUNT - Menentukan jumlah total buffer I / O yang akan digunakan untuk operasi pencadangan. Anda dapat menentukan bilangan bulat positif apa pun; Namun, sejumlah besar buffer dapat menyebabkan kesalahan "kehabisan memori" karena ruang alamat virtual yang tidak memadai dalam proses Sqlservr.exe. - dari MSDN

MAXTRNASFERSIZE - Berukuran mulai 65536 byte (64 KB) hingga 4194304 byte (4 MB)

Filip Holub
sumber
-3

Cobalah. itu menyelesaikan masalah batas waktu kadaluwarsa sementara db ukuran besar.

Private Sub Command1_Click()
On Error Resume Next
Dim con As New Connection
Dim tm As String
con.CommandTimeout = 500'''Command timeout should be 500


 With con
    .ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=dbiBMS;Data Source=192.168.103.4"
    .Open
 End With
 tm = CStr(Time)

con.Execute " backup database dbiBMS to disk='E:\Database_Backup\Test1.bak' with format "

con.Close
MsgBox tm
Exit Sub
x:
MsgBox Err.Description

End Sub
Mainul
sumber
3
Saya tidak berpikir pengaturan batas waktu ke 500 ms akan memperbaiki masalah batas waktu berakhir.
vijayp