Apakah aman untuk SQL Server menyusut otomatis dihidupkan?

44

Ada banyak opsi SQL Server yang dapat diaktifkan untuk basis data, dan salah satu yang paling disalahpahami adalah auto-shrink. Apakah ini aman? Jika tidak, mengapa tidak?

Paul Randal
sumber

Jawaban:

70

(Awalnya saya bertanya sebagai pertanyaan biasa tetapi kemudian menemukan metode yang benar - terima kasih BrentO)

Tidak, tidak pernah.

Saya telah menemukan ini beberapa kali sekarang di ServerFault dan ingin menjangkau khalayak luas yang bagus dengan beberapa saran bagus. Jika orang-orang tidak menyukai cara melakukan hal-hal ini, downvote dan saya akan menghapus ini dengan senang hati.

Penyusutan otomatis adalah pengaturan database yang sangat umum untuk diaktifkan. Sepertinya ide yang bagus - hapus ruang ekstra dari database. Ada banyak 'DBA yang tidak disengaja' di luar sana (pikirkan TFS, SharePoint, BizTalk, atau SQL Server lama yang biasa) yang mungkin tidak tahu bahwa auto-shrink benar-benar jahat.

Sementara di Microsoft saya dulu memiliki SQL Server Storage Engine dan mencoba untuk menghapus fitur auto-shrink, tetapi harus tetap untuk kompatibilitas mundur.

Mengapa menyusut otomatis sangat buruk?

Basis data cenderung tumbuh lagi, jadi mengapa mengecilkannya?

  1. Shrink-grow-shrink-grow menyebabkan fragmentasi level sistem file dan membutuhkan banyak sumber daya.
  2. Anda tidak dapat mengontrol kapan ia melakukan tendangan (meskipun itu biasa-ish)
  3. Ini menggunakan banyak sumber daya. Memindahkan halaman dalam database membutuhkan CPU, banyak IO, dan menghasilkan banyak log transaksi.
  4. Inilah kicker sebenarnya: menyusut file data (baik otomatis atau tidak) menyebabkan fragmentasi indeks besar-besaran, yang mengarah pada kinerja yang buruk.

Saya melakukan posting blog beberapa waktu lalu yang memiliki contoh skrip SQL yang menunjukkan masalah yang disebabkannya dan menjelaskan sedikit lebih detail. Lihat Penyusutan Otomatis - nonaktifkan! (tidak ada iklan atau sampah seperti itu di blog saya). Jangan bingung dengan menyusutkan file log, yang berguna dan perlu sesekali.

Jadi bantulah dirimu sendiri - lihat di pengaturan database Anda dan matikan auto-shrink. Anda juga seharusnya tidak menyusut dalam rencana perawatan Anda, untuk alasan yang persis sama. Sebarkan berita ini ke kolega Anda.

Sunting: Saya harus menambahkan ini, diingatkan oleh jawaban kedua - ada kesalahpahaman umum bahwa mengganggu operasi psikiater dapat menyebabkan korupsi. Tidak, tidak akan. Saya dulu memiliki kode menyusut dalam SQL Server - itu memutar kembali langkah halaman saat ini yang dilakukannya jika terganggu.

Semoga ini membantu!

Paul Randal
sumber
Apakah ada cara Anda bisa mengindeks ulang setelah menyusut?
Lance Roberts
4
Bukan pengindeksan ulang karena itu akan menumbuhkan file lagi (membangun indeks baru sebelum menjatuhkan yang lama), tetapi melakukan reorganisasi (baik melalui DBCC INDEXDEFRAG lama saya atau INDEKS INDEKS BARU ... REORGANIZE) akan memilah fragmentasi, dengan mengorbankan lebih banyak IO, cpu, logging ...
Paul Randal
Saya perhatikan bahwa setelah menghapus autoshrink penggunaan memori srrver lebih tinggi.
user193655
4

Tentu saja, Paul benar.

Lihat semua DB dan pengaturan autoshrink-nya. Jika Anda memiliki banyak basis data, seseorang akan menyelinap masuk.

sp_msforeachdb  @command1 = 'Select ''[?]'',DATABASEPROPERTYEX(''?'',''IsAutoShrink'')'

Apakah ini di dmv di suatu tempat .... Aku ingin tahu.

Sam
sumber
2
sys.databases memiliki is_auto_shrink isian (dan is_auto-close, is_auto_update_stats, dll)
Paul Randal
googling im indah: bagaimana saya punya laporan membantu kami untuk mengetahui dbs mana yang dikonfigurasi sebagai autoshrink dan kode Anda berjalan baik dan menghasilkan laporan yang baik dari semua db untuk kami
saber tabatabaee yazdi
2

Itu bukan "tidak aman" - tidak akan merusak apa pun.

Tetapi tidak disarankan untuk lingkungan produksi di mana basis data dapat memutuskan untuk memulai dan memulai latihan penataan ulang yang mahal sesaat sebelum setumpuk permintaan masuk membuat permintaan tersebut membutuhkan waktu lebih lama untuk dilayani. Anda jauh lebih baik menggunakan penjadwalan operasi menyusut bersama dengan operasi pemeliharaan lainnya seperti cadangan (sebenarnya, setelah cadangan - itu akan lebih dari log transaksi seperti itu). Atau tidak menyusut sama sekali kecuali ada masalah pertumbuhan - Anda selalu dapat mengatur monitor agar Anda tahu kapan ruang yang dialokasikan tidak digunakan tumbuh melampaui rasio tertentu atau ukuran tetap.

IIRC opsi tidak aktif secara default untuk semua database di semua edisi MSSQL kecuali Express.

David Spillett
sumber
2
Susut tidak boleh dijadwalkan - itu harus benar-benar operasi langka karena masalah yang ditimbulkannya. Saya tidak mengerti komentar Anda tentang melakukan menyusut setelah pencadangan - catatan log yang dihasilkan oleh operasi penyusutan akan diambil oleh pencadangan log transaksi berikutnya terlepas dari kapan Anda melakukannya atau cadangan apa yang Anda ambil. Terima kasih
Paul Randal
1

Ada whitepaper tersedia di TechNet yang menjelaskan pemeliharaan SQL lebih terinci.

http://technet.microsoft.com/en-us/library/cc262731.aspx

Jeremy Thake
sumber
Sayangnya whitepaper hanya ditujukan untuk instalasi SharePoint dan sebenarnya memiliki beberapa kesalahan. Saya hanya menghabiskan waktu mengajar kelas MCM SharePoint saat ini dengan penulis whitepaper, Bill Baer.
Paul Randal
3
Pengantar umum yang baik untuk pemeliharaan basis data ada di artikel Majalah TechNet saya tentang masalah Pemeliharaan Basis Data Efektif - technet.microsoft.com/en-us/magazine/cc671165.aspx .
Paul Randal
1

Saya telah melihat server SQL dengan Autogrow dan Autoshrink diaktifkan. Server (relatif kuat) ini sangat lambat, karena semua yang dilakukannya sepanjang hari adalah menyusut dan menumbuhkan file database. Autoshrink dapat berguna, tetapi saya akan merekomendasikan dua hal:

  1. Nonaktifkan Autoshrink secara default.
  2. Dokumentasikan konfigurasi server Anda, sehingga Anda tahu di mana Autogrow dan Autoshrink diaktifkan dan di mana mereka tidak.
Carl C
sumber
1

Satu-satunya waktu saya terpaksa menyusutkan database adalah menyegarkan salinan pada server uji dengan ruang disk lebih sedikit (tidak cukup untuk menyimpan basis data produksi).

File database produksi memiliki ruang kosong yang luas, sayangnya Anda harus mengembalikan database dengan ukuran file yang sama seperti saat Anda membuat cadangannya. Jadi tidak punya pilihan selain mengecilkan produksi sebelum mendukungnya. (Penyusutan itu memakan waktu lama, banyak sumber daya dikonsumsi dan pertumbuhan log transaksi selanjutnya bermasalah.)

SuperCoolMoss
sumber