Saya mencari praktis bimbingan untuk menetapkan nilai untuk BUFFERCOUNT
, BLOCKSIZE
dan MAXTRANSFERSIZE
dari BACKUP
perintah. Saya telah melakukan sedikit riset (lihat di bawah), saya telah melakukan sedikit pengujian, dan saya sepenuhnya sadar bahwa jawaban yang benar-benar berharga akan dimulai dengan "Ya, itu tergantung ...". Kekhawatiran saya tentang pengujian yang telah saya lakukan dan pengujian yang ditunjukkan pada salah satu sumber daya yang saya temukan (lihat di bawah) adalah bahwa pengujian dilakukan dalam ruang hampa, kemungkinan besar pada sistem tanpa beban lainnya.
Saya ingin tahu tentang panduan / praktik terbaik yang tepat mengenai ketiga opsi ini yang didasarkan pada pengalaman jangka panjang: banyak titik data selama beberapa minggu atau bulan. Dan saya tidak mencari nilai spesifik karena sebagian besar merupakan fungsi dari perangkat keras yang tersedia, tetapi saya ingin tahu:
- Bagaimana berbagai faktor perangkat keras / beban memengaruhi apa yang harus dilakukan.
- Apakah ada keadaan di mana tidak ada nilai-nilai ini yang harus ditimpa?
- Apakah ada jebakan untuk mengganti salah satu dari ini yang tidak segera terlihat? Menggunakan terlalu banyak memori dan / atau disk I / O? Operasi pemulihan yang rumit?
- Jika saya memiliki server dengan beberapa instance SQL Server yang berjalan (Instance Default dan dua Instance Berned), dan jika saya menjalankan backup dari semua 3 Instance secara bersamaan, apakah itu mempengaruhi bagaimana saya menetapkan nilai-nilai ini di luar memastikan bahwa kolektif (
BUFFERCOUNT
*MAXTRANSFERSIZE
) tidak melebihi RAM yang tersedia? Kemungkinan pertentangan I / O? - Dalam skenario yang sama yaitu memiliki ketiga Mesin Virtual pada satu server, dan sekali lagi menjalankan pencadangan di ketiganya secara bersamaan, bagaimana juga menjalankan pencadangan untuk beberapa Database secara bersamaan dalam setiap Mesin Virtual mempengaruhi pengaturan nilai-nilai ini? Artinya, jika masing-masing dari tiga Mesin Virtual memiliki masing-masing 100 Database, menjalankan 2 atau 3 cadangan per masing-masing Mesin Virtual secara bersamaan sehingga ada antara 6 dan 9 cadangan yang berjalan secara bersamaan. (Dalam situasi ini, saya memiliki banyak basis data kecil hingga menengah daripada beberapa yang besar.)
Apa yang telah saya kumpulkan sejauh ini:
BLOCKSIZE
:- Ukuran yang didukung adalah 512, 1024, 2048, 4096, 8192, 16384, 32768, dan 65536 (64 KB) byte. [1]
- Standarnya adalah 65536 untuk perangkat tape dan 512 sebaliknya [1]
- Jika Anda mengambil cadangan yang ingin Anda salin dan kembalikan dari CD-ROM, tentukan BLOCKSIZE = 2048 [1]
- Ketika Anda menulis ke disk tunggal, default 512 tidak apa-apa; jika Anda menggunakan RAID array atau SAN, Anda harus menguji untuk melihat apakah default atau 65536 lebih baik. [13 (halaman 18)]
Jika mengatur secara manual, nilainya harus> = Ukuran Blok yang digunakan untuk membuat file data, jika tidak, Anda akan mendapatkan kesalahan berikut:
Msg 3272, Level 16, Negara 0, Baris 3
'C: \ Program Files \ Microsoft SQL Server \ MSSQL11.MSSQLSERVER \ MSSQL \ Backup \ BackupTest.bak' perangkat memiliki ukuran sektor perangkat keras 4096, tetapi parameter ukuran blok menentukan nilai ganti yang tidak kompatibel dari 512. Keluarkan kembali pernyataan menggunakan ukuran blok yang kompatibel.
BUFFERCOUNT
:Default [2], [8] :
SQL Server 2005 dan versi yang lebih baru:
(NumberofBackupDevices * [mystery_multiplier]) + NumberofBackupDevices + (2 * NumberofVolumesInvolved)[mystery_multiplier]: Ada beberapa ketidakkonsistenan mengenai nilai ini. Saya telah melihatnya diungkapkan dalam 3 bentuk:
3
[2]GetSuggestedIoDepth
[8]GetSuggestedIoDepth + 1
[8]
Pengujian yang menunjukkan pengali harus3
dilakukan pada SQL Server 2005 SP2 [9] .Pengujian saya pada SQL Server 2008 R2 dan 2012, dan komentar pengguna tentang SQL Server 2014 [8] , menunjukkan pengganda menjadi
4
. Artinya, diberi nilai yang dilaporkan untukGetSuggestedIoDepth
(langsung di bawah), baik:GetSuggestedIoDepth
sekarang4
, atau- pengganda sekarang
GetSuggestedIoDepth + 1
GetSuggestedIoDepth
kembali3
untuk perangkat DISK [9]- Tidak ada nilai maks hard-set, tetapi mengingat bahwa memori diperlukan = (
BUFFERCOUNT
*MAXTRANSFERSIZE
), akan terlihat bahwa nilai maks praktis adalah:BUFFERCOUNT <= (available_memory / MAXTRANSFERSIZE)
MAXTRANSFERSIZE
:- Nilai yang mungkin adalah kelipatan dari 65536 byte (64 KB) berkisar hingga 4194304 byte (4 MB). [1]
- Nilai default: Jika perangkat dalam mode baca (restore) atau ini adalah Desktop atau Express Edition menggunakan 64K, gunakan 1 MB. [9]
- Umum / Lain-lain:
- Ukuran maksimal yang dapat digunakan adalah ( Buffer Pool's To Physical Memory / 16 ). Telah kembali dari panggilan API GlobalMemoryStatusEx (ullTotalPhys). [9]
- Lacak Bendera yang
3213
menampilkan parameter konfigurasi cadangan / pengembalian saat melakukan operasi pencadangan / pengembalian, dan3605
membuang output ke file ERRORLOG :DBCC TRACEON (3213, 3605, -1);
- Anda dapat menggunakan
DISK = N'NUL:'
(setara dengan DOS / Windows/dev/null
di UNIX) untuk pengujian lebih mudah pada beberapa metrik (tetapi tidak akan mendapatkan waktu total proses yang baik karena tidak menulis I / O)
Sumber daya
- Halaman MSDN untuk perintah T-SQL BACKUP
- KB904804: Anda mengalami kinerja lambat ketika Anda membuat cadangan database di SQL Server 2000
- Opsi untuk Meningkatkan Kinerja Cadangan SQL Server
- Cadangkan dan Kembalikan
- Mengoptimalkan Pencadangan dan Pemulihan SQL Server
- Mengoptimalkan Kinerja Cadangan
- Cara meningkatkan kecepatan Pencadangan Penuh SQL Database menggunakan kompresi dan Disk Solid State
- Opsi transfer data BufferCount yang salah dapat menyebabkan kondisi OOM
- Bagaimana Cara Kerjanya: Bagaimana Pencadangan dan Pemulihan SQL Server memilih ukuran transfer
- Bagaimana Cara Kerjanya: Exchange Buffer Exchange SQL Server (a VDI Focus)
- Cadangan SQL, tuning basis data besar
- Memori SQL Server untuk Buffer Cadangan
- Studi Kasus: Pencadangan dan Pemulihan Cepat dan Andal dari VLDB melalui Jaringan (file .docx)
- Berapa banyak perangkat cadangan yang disarankan untuk meningkatkan kinerja cadangan?
Saya diuji dengan:
--DBCC TRACEON (3213, 3605, -1);
BACKUP DATABASE [Test] TO
DISK = 'NUL:'
--,DISK = 'NUL:'
-- DISK = 'BackupTest1.bak'
-- ,DISK = 'BackupTest2.bak'
WITH
STATS = 5,
FORMAT,
CHECKSUM,
NO_COMPRESSION,
COPY_ONLY
--,BUFFERCOUNT = 40
--,MAXTRANSFERSIZE = 4194304--2097152,
--,BLOCKSIZE = 16384
--DBCC TRACEOFF (3213, 3605, -1);
MEMPERBARUI
Sepertinya saya terkadang lupa menambahkan beberapa info yang selalu saya minta orang lain berikan ketika saya menjawab Pertanyaan ;-). Saya memang memberikan beberapa informasi di atas mengenai situasi saya saat ini, tetapi saya dapat memberikan lebih detail:
Saya bekerja untuk klien yang menyediakan aplikasi SaaS 24/7 / 365.25. Jadi ada potensi bagi pengguna untuk berada di titik mana pun, tetapi secara realistis, pengguna semua berbasis di AS (untuk saat ini) dan cenderung bekerja sebagian besar jam "standar": 7 pagi Pasifik (yaitu 10 pagi Timur) hingga 7 malam Pasifik (Yaitu 10 PM Timur), tetapi 7 hari seminggu, tidak hanya Senin - Jumat, meskipun beban akhir pekan sedikit lebih ringan.
Mereka diatur sedemikian rupa sehingga setiap klien memiliki DB mereka sendiri. Ini adalah ceruk industri sehingga tidak ada puluhan ribu (atau lebih) klien potensial. Jumlah DB klien bervariasi per Mesin Virtual, dengan Mesin Virtual terbesar yang menampung 206 klien. DB terbesar adalah sekitar. 8 GB, tetapi hanya sekitar 30 DB lebih dari 1 GB. Oleh karena itu, saya tidak secara khusus mencoba memaksimalkan kinerja VLDB.
Ketika saya mulai dengan klien ini, cadangan mereka selalu LENGKAP, sekali sehari, dan tidak ada cadangan LOG. Mereka juga telah mengatur MAXTRANSFERSIZE menjadi 4 MB dan BUFFERCOUNT menjadi 50. Saya mengganti pengaturan itu dengan versi skrip cadangan database Ola Hallengren yang sedikit disesuaikan . Bagian yang sedikit disesuaikan adalah dijalankan dari alat multi-threading (yang saya tulis dan mudah-mudahan akan mulai dijual segera) yang secara dinamis menemukan DB saat terhubung ke setiap Mesin Virtual, dan memungkinkan untuk pelambatan per Mesin Virtual (karenanya saya saat ini menjalankan tiga Instans secara bersamaan, tetapi DBs untuk setiap instance secara berurutan karena saya tidak yakin tentang konsekuensi menjalankannya secara bersamaan).
Setup sekarang adalah melakukan backup FULL satu hari per minggu dan backup DIFF di hari lain; Cadangan LOG diambil setiap 10 menit. Saya menggunakan nilai default untuk 3 opsi yang saya tanyakan di sini. Tetapi, mengetahui bagaimana mereka ditetapkan, saya ingin memastikan bahwa saya tidak membatalkan optimasi (hanya karena ada beberapa kelemahan utama dalam sistem lama tidak berarti bahwa semuanyasalah). Saat ini, untuk 206 database, dibutuhkan sekitar 62 menit untuk backup FULL (seminggu sekali) dan antara 7 dan 20 menit untuk backup DIFF pada hari-hari yang tersisa (7 pada hari pertama setelah FULL, dan 20 pada hari terakhir sebelum LENGKAP berikutnya). Dan itu menjalankannya secara berurutan (single thread). Proses pencadangan LOG, secara total (semua DB di semua 3 Instance), membutuhkan waktu 50 hingga 90 detik setiap kali (sekali lagi, setiap 10 menit).
Saya menyadari bahwa saya dapat menjalankan banyak file per DB, tetapi a) Saya tidak yakin seberapa baik yang akan diberikan multithreading dan DB ukuran kecil hingga sedang, dan b) Saya tidak ingin mempersulit proses pemulihan ( ada berbagai alasan mengapa berurusan dengan satu file lebih disukai).
Saya juga menyadari bahwa saya dapat mengaktifkan kompresi (kueri pengujian saya sengaja dinonaktifkan), dan saya telah merekomendasikan hal itu kepada tim, tetapi perlu diperhatikan bahwa kompresi bawaan agak sial. Bagian dari proses lama adalah memampatkan setiap file menjadi RAR, dan saya melakukan pengujian sendiri dan menemukan bahwa ya, versi RAR setidaknya 50% lebih kecil daripada versi yang dikompresi secara asli. Saya memang mencoba menggunakan kompresi asli terlebih dahulu untuk mempercepat dan kemudian RAR file, tetapi file-file itu, walaupun lebih kecil daripada yang hanya dikompresi secara asli, masih sedikit lebih besar daripada versi terkompresi hanya-RAR, dan dengan perbedaan yang cukup untuk membenarkan tidak menggunakan kompresi asli. Proses untuk mengompres cadangan tidak sinkron dan berjalan setiap X menit. Jika menemukan .bak
atau.trn
file, itu kompres itu. Dengan cara ini, proses pencadangan tidak melambat pada saat yang dibutuhkan untuk mengompres setiap file.