it-swarm-id.com

Apakah aman untuk mengaktifkan SQL Server menyusut otomatis?

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?

44
Paul Randal

(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 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 auto-shrink 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 Perkecil otomatis - matikan! (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 kepada 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 di SQL Server - itu memutar kembali langkah halaman saat ini yang dilakukannya jika terganggu.

Semoga ini membantu!

71
Paul Randal

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 suatu tempat dmv di suatu tempat .... Aku ingin tahu.

4
Sam

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

Tetapi tidak direkomendasikan 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.

2
David Spillett

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

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

1
Jeremy Thake

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.
1
Carl C

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 basis data produksi memiliki ruang kosong yang besar, sayangnya Anda harus mengembalikan basis data 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.)

1
SuperCoolMoss

Lihat juga tutorial video ini ....

Tonton Paul Randal menunjukkan bagaimana menyusut dan menyusut otomatis dapat menyebabkan masalah fragmentasi serius untuk database Anda http://wtv.watchtechvideos.com/topic194.html

1