Sql Server - Praktik Terbaik untuk Menumbuhkan File Database

16

Saya telah memantau pertumbuhan file melalui pengumpul data di sql server 2008 r2 selama dua minggu. Basis data tumbuh secara konsisten pada sekitar 35 (MB) / Hari. DB belum mencapai ukuran awal 2 GB.

Pertumbuhan file DB otomatis diatur ke 5MB dan saya ingin mencoba pendekatan yang berbeda, jadi saya mencari saran dan komentar.

Ada tugas penyetelan yang berjalan setiap minggu pada Minggu malam pukul 1:30 pagi. Tugas akan:

  • Periksa Integritas Basis Data
  • Kecilkan File Log - (Ini tidak masalah karena mode logging Sederhana)
  • Kecilkan Database
  • Atur Ulang Indeks
  • Rebuild Index
  • Perbarui Statistik
  • Bersihkan Sejarah

Saya ingin menambahkan dua langkah lagi ke rencana tuning mingguan:

  1. Tumbuhkan file database hingga 500 MB jika ruang yang digunakan mencapai ambang tertentu atau ukuran total.
  2. Tumbuhkan file log dengan 250 MB (setelah menyusut) jika ruang yang digunakan mencapai batas tertentu dari ukuran total.

Dengan menempatkan beban pertumbuhan dalam jam offline, saya berharap untuk mendapatkan kinerja dengan mengurangi jumlah acara pertumbuhan otomatis selama beban berat.

Saya punya dua pertanyaan yang berkaitan dengan file yang tumbuh secara otomatis.

  • Tempat terbaik untuk meletakkan langkah tumbuh file adalah sebelum langkah saat ini atau sesudahnya?
  • Jika saya menggunakan ALTER DATABASE|MODIFY FILEuntuk menumbuhkan file maka bagaimana saya bisa menentukan jika SpaceUsedInFile >= (TotalFileSpace-@AllowanceThreshold)?
Ross Bush
sumber
2
DB Anda harus memiliki ukuran yang cukup sehingga tidak pernah tumbuh. Tidak ada yang kurang, pastikan Inisialisasi File Instan diaktifkan.
Remus Rusanu
3
@Remus sementara ideal, apakah Anda mengatakan bahwa Anda telah melakukan pra-ukuran setiap database dengan sempurna sepanjang karier Anda? Selalu akan ada beberapa tebakan yang terlibat dan penyesuaian yang harus dilakukan. Saya akan setuju bahwa pertumbuhan harus dikendalikan dan tidak dibiarkan begitu saja 7 kali sehari.
Aaron Bertrand
3
@ AaronBertrand: Saya menyukai saran hiperbola yang sederhana . Pada waktunya saya belajar tongkat itu lebih baik. Sebagian besar pengguna tidak dapat menangani 'itu tergantung' dan mereka yang dapat mengetahui sendiri bahwa ada nuansa abu-abu di antara hitam dan putih ...
Remus Rusanu
3
@DanAndrews: alokasi berlebihan dapat memiliki efek 'hilir'. Pikirkan seorang dev mencoba mengembalikan DB pada mesinnya hanya untuk menemukan itu membutuhkan dua drive 1TB baru untuk 1Gb data ...
Remus Rusanu
2
Saya hanya berperan sebagai penasihat iblis. Namun, HD itu murah. Kehilangan waktu dalam produksi untuk konfigurasi ulang dan kehilangan kinerja adalah mahal.
Dan Andrews

Jawaban:

24

Anda harus bertujuan untuk tumbuh secara otomatis sesedikit mungkin. Tujuh kali sehari sangat menyiksa, bahkan dengan inisialisasi file instan.

Jangan lakukan Shrink Database. Pernah. Shrinkfile, mungkin, tetapi hanya setelah kejadian luar biasa. Mengecilkannya hanya untuk tumbuh lagi adalah latihan yang sia-sia dan harus benar-benar disebut auto-fragment.

Jika model pemulihan sederhana, tidak ada cara di bumi Anda harus menumbuhkan file log Anda sebesar 250 GB. Ruang yang digunakan dalam file akan membersihkan dirinya sendiri secara otomatis dari waktu ke waktu, kecuali jika Anda memulai transaksi sebulan yang lalu dan tidak memiliki niat untuk pernah melakukan atau mengembalikannya.

Jadi saran saya adalah:

Tumbuhkan file data secara manual selama periode tenang ke ukuran yang akan mengakomodasi beberapa bulan pertumbuhan. Untuk apa Anda menyimpannya?

Setel peningkatan pertumbuhan-otomatis untuk file data ke sesuatu yang relatif kecil (sehingga tidak mengganggu pengguna saat itu terjadi), dan beri tahu acara ini (Anda dapat menangkapnya di jejak default, misalnya, atau melalui perluasan peristiwa). Ini dapat memberi tahu Anda bahwa Anda mencapai titik tinggi yang Anda perkirakan dan sekarang saatnya untuk tumbuh secara manual lagi. Pada titik ini Anda akan ingin menyimpan manual ini jika Anda ingin menambahkan file / filegroup baru pada drive yang berbeda untuk mengakomodasi ruang, karena pada akhirnya Anda akan mengisi drive saat ini.

Tumbuhkan otomatis file log menjadi, katakanlah, dua kali lipat terbesar yang pernah ada. Seharusnya tidak tumbuh lebih lanjut secara otomatis kecuali ada transaksi abnormal yang menahannya. Anda harus memantau acara ini juga, sehingga Anda tahu tentang mereka.

Aaron Bertrand
sumber
Terima kasih atas masukannya ... Saya akan meminta saran Anda untuk menumbuhkan file log dan memonitornya sebentar. Saya salah menggunakan GB untuk MB dalam ukuran autgrow. Saya setuju dan tidak berpikir Shrink Database melakukan apa yang seharusnya dilakukan. Pada akhir tahun DB mencapai 15GB, saat pekerjaan dibuat kami kehabisan ruang untuk cadangan.
+1 untuk harus disebut fragmen otomatis :-) Sudahkah Anda meluncurkan masalah Connect untuk itu? :-)
marc_s
10

Pertumbuhan otomatis adalah sesuatu yang harus Anda hindari jika memungkinkan. Masalahnya adalah Anda tidak memiliki kendali atas kapan pertumbuhan dapat terjadi dan sistem Anda dapat mengambil pukulan serius saat itu terjadi.

Tetapkan ukuran file Anda menjadi sesuatu yang masuk akal selama sebulan atau lebih dan pantau laju pertumbuhan Anda dari sana, tentukan berapa banyak ruang yang Anda perkirakan untuk jumlah waktu X dan setel ukuran Anda ke margin kesalahan.

Saya telah menyiapkan pekerjaan pemantauan sederhana yang akan mengingatkan saya ketika ukuran file mencapai maksimum yang telah ditentukan sebelum pertumbuhan otomatis. Anda dapat menggunakan sesuatu seperti ini:

SELECT instance_name,
       [Data File(s) Size (KB)],
       [LOG File(s) Size (KB)],
       [Log File(s) Used Size (KB)],
       [Percent Log Used]
       into ##Logsize
FROM
(
   SELECT *
   FROM sys.dm_os_performance_counters
   WHERE counter_name IN
   (
       'Data File(s) Size (KB)',
       'Log File(s) Size (KB)',
       'Log File(s) Used Size (KB)',
       'Percent Log Used'
   )
     AND instance_name = 'database your interested in' 
) AS Src
PIVOT
(
   MAX(cntr_value)
   FOR counter_name IN
   (
       [Data File(s) Size (KB)],
       [LOG File(s) Size (KB)],
       [Log File(s) Used Size (KB)],
       [Percent Log Used]
   )
) AS pvt 
go
declare @logsize int
Select @logsize = [Percent Log Used] from ##Logsize

If @logsize > the maximum percent you want the log to fill too i.e 90
    BEGIN
        --Do your thing here
    END

Drop table ##Logsize

Tentu saja ini bisa dijadwalkan sebagai pekerjaan.

Nick Winstanley
sumber
Saya menghapus "AND instance_name = 'database yang Anda minati" sehingga mengembalikan semua database. Kemudian gunakan hitungan di mana ukuran log berada di atas ambang batas dalam pernyataan IF. Jika jumlah lebih tinggi dari 1 saya melakukan sp_send_dbmail dengan pernyataan nama pilih dari tabel temp untuk mengirim email nama-nama log di atas batas.
Nick Winstanley