Mengatur BUFFERCOUNT, BLOCKSIZE, dan MAXTRANSFERSIZE untuk perintah CADANGAN

33

Saya mencari praktis bimbingan untuk menetapkan nilai untuk BUFFERCOUNT, BLOCKSIZEdan MAXTRANSFERSIZEdari BACKUPperintah. 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 harus 3dilakukan 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 untuk GetSuggestedIoDepth(langsung di bawah), baik:

      • GetSuggestedIoDepthsekarang 4, atau
      • pengganda sekarang GetSuggestedIoDepth + 1
    • GetSuggestedIoDepthkembali 3untuk 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 3213menampilkan parameter konfigurasi cadangan / pengembalian saat melakukan operasi pencadangan / pengembalian, dan 3605membuang output ke file ERRORLOG :DBCC TRACEON (3213, 3605, -1);
    • Anda dapat menggunakan DISK = N'NUL:'(setara dengan DOS / Windows /dev/nulldi UNIX) untuk pengujian lebih mudah pada beberapa metrik (tetapi tidak akan mendapatkan waktu total proses yang baik karena tidak menulis I / O)

Sumber daya

  1. Halaman MSDN untuk perintah T-SQL BACKUP
  2. KB904804: Anda mengalami kinerja lambat ketika Anda membuat cadangan database di SQL Server 2000
  3. Opsi untuk Meningkatkan Kinerja Cadangan SQL Server
  4. Cadangkan dan Kembalikan
  5. Mengoptimalkan Pencadangan dan Pemulihan SQL Server
  6. Mengoptimalkan Kinerja Cadangan
  7. Cara meningkatkan kecepatan Pencadangan Penuh SQL Database menggunakan kompresi dan Disk Solid State
  8. Opsi transfer data BufferCount yang salah dapat menyebabkan kondisi OOM
  9. Bagaimana Cara Kerjanya: Bagaimana Pencadangan dan Pemulihan SQL Server memilih ukuran transfer
  10. Bagaimana Cara Kerjanya: Exchange Buffer Exchange SQL Server (a VDI Focus)
  11. Cadangan SQL, tuning basis data besar
  12. Memori SQL Server untuk Buffer Cadangan
  13. Studi Kasus: Pencadangan dan Pemulihan Cepat dan Andal dari VLDB melalui Jaringan (file .docx)
  14. 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 .bakatau.trnfile, itu kompres itu. Dengan cara ini, proses pencadangan tidak melambat pada saat yang dibutuhkan untuk mengompres setiap file.

Solomon Rutzky
sumber
1
Hanya ingin tahu, apakah Anda mencoba mengatasi masalah cadangan yang lambat? Biasanya, standarnya berfungsi dengan baik di sebagian besar lingkungan. Juga, adalah opsi daya diatur ke kinerja tinggi - karena mengambil cadangan menggunakan siklus CPU.
Kin Shah
2
@Kin Tidak, backup tidak lambat. Tetapi, jika membuat perubahan kecil akan / bisa membuat mereka 20% (atau lebih) lebih cepat, maka saya pasti akan menerimanya. 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. Dan itu menjalankannya secara berurutan (single thread). Ketika saya mulai dengan klien ini, pengaturan sebelumnya adalah menggunakan 4 MB untuk MaxTransfer dan 50 untuk BufferCount. Saat ini saya hanya menggunakan standarnya, jadi tidak yakin apakah saya membatalkan unduhan kinerja, jadi ingin mempelajari lebih lanjut sebelum membuat perubahan.
Solomon Rutzky
@srutzky hanya titik cepat dari komentar terakhir Anda, saya menghemat banyak waktu memecah cadangan saya menjadi beberapa file dengan volume yang sama. Saya hanya ingin berbagi dengan Anda kalau-kalau itu belum Anda coba. Jika 206 DB Anda menjalankan pencadangan secara paralel di beberapa DB meskipun Anda mungkin tidak mendapatkan manfaat multi-threading.
Ali Razeghi
2
@ MaxVernon "Backup antarmuka perangkat virtual (VDI) memungkinkan solusi pencadangan pihak ke-3 untuk berintegrasi dengan SQL Server." Yang diambil dari Resource # 10 di Pertanyaan saya :). Saya tidak ingin melalui banyak upaya ;-)
Solomon Rutzky
1
@srutzky jika Anda ingin bersenang-senang: baca MSSQL Backups - periksa ukuran transfer maksimum HBA - pria itu brilian dan sangat teliti dalam pengujiannya. Dan sesuatu yang mungkin cocok dengan pengujian Anda: Penyesuaian Cadangan Otomatis SirSQL .
Marian

Jawaban:

12

Anda telah membahas muatan item dalam pertanyaan Anda. Terima kasih sudah teliti!

Hanya beberapa hal yang saya sadari:

  • Bagaimana berbagai faktor perangkat keras / beban memengaruhi apa yang harus dilakukan.

Apakah Anda menjalankan instance 24x7? Berapa bebannya sepanjang waktu? Saya perhatikan Anda telah menonaktifkan kompresi cadangan; apakah dengan desain untuk pengujian, atau apakah itu diinginkan untuk beberapa alasan untuk mematikannya ketika Anda memasukkan ini ke dalam produksi? Jika Anda memiliki banyak ruang kepala perangkat keras (CPU / RAM), dan menyelesaikan cadangan dalam waktu singkat adalah sangat penting, maka Anda ingin menyetel parameter ini untuk perangkat keras tertentu yang Anda miliki dengan tujuan tersebut. Jika Anda ingin memastikan beban kerja OLTP dilayani setiap saat, dan tidak ingin cadangan berdampak, Anda mungkin perlu menyesuaikan parameter ini dengan cara sebaliknya. Anda belum mengidentifikasi tujuan desain Anda karena Anda meminta panduan umum namun karena Anda dengan bijak menyatakan "itu tergantung ™".

  • Apakah ada keadaan di mana tidak ada nilai-nilai ini yang harus ditimpa?

Anda ingin mempertahankan pengaturan default jika Anda khawatir tentang daya dukungan di jalan setelah Anda tidak lagi mempertahankan instance, dan tidak yakin tentang kemampuan pengganti Anda. Anda mungkin ingin meninggalkan default di tempatnya kecuali Anda memiliki kebutuhan khusus untuk menyetelnya. Biarkan anjing tidur berbaring, seperti kata mereka.

  • 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?

Karena dokumen yang Anda rujuk dengan jelas menyatakan, menaikkan parameter ini terlalu banyak tentunya dapat berdampak negatif pada waktu aktif. Seperti semua hal berbasis produksi, Anda perlu menguji ini secara menyeluruh sebelum menerapkannya, dan biarkan pengaturan itu sendiri kecuali benar-benar diperlukan.

  • Jika saya memiliki server dengan beberapa instance dari SQL Server yang menjalankan (Instance Default dan dua Instance Bernama), dan jika saya menjalankan backup dari semua 3 Instancs 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?

Anda akan ingin memastikan Anda meninggalkan banyak RAM untuk keadaan yang tidak terduga. Saya pasti akan khawatir tentang menggunakan lebih dari 60% atau 70% ram yang tersedia untuk operasi cadangan kecuali saya tahu dengan kepastian 100% bahwa tidak ada hal lain yang akan terjadi selama jendela cadangan.

Saya telah menulis posting blog dengan beberapa kode yang menunjukkan bagaimana saya melakukan pengujian kinerja cadangan, di SQLServerScience.com


ini mungkin bukan jawaban terbaik yang pernah saya tulis, tetapi seperti yang dikatakan The Great One ™, "Anda kehilangan 100% pukulan yang tidak Anda ambil"

Max Vernon
sumber
2
Terima kasih untuk petunjuk itu, Max. +1 untuk itu :). Saya baru saja menambahkan bagian UPDATE ke Pertanyaan saya yang sudah tidak pendek untuk membahas beberapa komentar pada Pertanyaan dan pertanyaan Anda di sini tentang mengapa saya tidak menggunakan kompresi. Saya yakin saya juga menjawab pertanyaan Anda tentang bagaimana saya menjalankan backup :-).
Solomon Rutzky