Pertanyaan ini ditanyakan dalam berbagai bentuk di sini tetapi pertanyaannya bermuara pada:
Saya tahu menyusutkan database berisiko. Dalam hal ini, saya telah menghapus begitu banyak data dan saya tidak akan pernah menggunakannya lagi.
- Bagaimana saya bisa mengecilkan basis data saya? File apa yang saya susutkan?
- Apa yang harus saya pertimbangkan ketika melakukan ini?
- Haruskah saya melakukan sesuatu setelahnya?
- Bagaimana jika itu adalah database besar? Bisakah saya mengecilkannya dengan kenaikan kecil?
sql-server
shrink
Mike Walsh
sumber
sumber
Jawaban:
Beberapa Peringatan Awal:
Jika Anda sudah membaca tentang kekhawatiran dan risiko dan Anda masih perlu melakukan psikiater ini karena Anda membebaskan signifikan jumlah ruang, mudah-mudahan sisa jawaban ini akan membantu Anda keluar. Tetapi pertimbangkan risikonya.
Ada dua pendekatan utama yang dipertimbangkan di sini:
1.) Kecilkan Ya, lakukan penyusutan yang sebenarnya - Pertimbangkan untuk menggunakan
DBCC SHRINKFILE
alih-alihDBCC SHRINKDATABASE
, Anda memiliki kontrol lebih besar atas apa yang menyusut dan bagaimana. Ini pasti akan menyebabkan beberapa penurunan kinerja - ini adalah operasi besar yang melakukan banyak IO. Anda berpotensi lolos dengan penyusutan berulang ke ukuran target yang semakin kecil.Ini adalah contoh "A.)" di
DBCC SHRINKFILE
tautan di atas .. Datafile sedang menyusut ke ukuran target 7MB dalam contoh ini. Format ini adalah cara yang baik untuk menyusut berulang kali sesuai dengan waktu jeda jendela Anda. Saya akan melakukan ini dalam pengujian pengembangan untuk melihat bagaimana kinerja terlihat dan seberapa rendah / tinggi Anda dapat meningkatkan dan untuk menentukan waktu yang diharapkan dalam produksi. Ini adalah operasi online - Anda dapat menjalankannya dengan pengguna dalam sistem mengakses database yang menyusut, tetapi akan ada penurunan kinerja, hampir dijamin. Jadi monitor dan tonton dan lihat apa yang Anda lakukan ke server, pilih jendela downtime atau periode aktivitas yang lebih ringan, idealnya.Selalu Ingat: - setiap kali Anda mengecilkan Anda memecah indeks Anda dan harus melakukan indeks membangun kembali jika Anda akan mengecilkan potongan selama periode waktu yang lama. Anda sekarang dikenai biaya itu setiap kali jika Anda tidak bisa menyelesaikannya dalam satu jendela.
2.) Basis Data Baru - Anda dapat membuat basis data baru dan memigrasikan data ke dalamnya. Anda harus membuat skrip database kosong dan semua kunci, indeks, objek, procs, fungsi, dll. Dan kemudian memigrasikan data ke dalamnya. Anda bisa menulis skrip untuk ini atau Anda bisa menggunakan alat seperti SQL Data Compare dari Red Gate atau vendor lain dengan alat serupa. Ini lebih banyak pekerjaan pengaturan di sisi Anda, lebih banyak pengembangan dan pengujian, dan tergantung pada lingkungan Anda juga dapat meledakkan jendela downtime Anda juga tetapi pilihan untuk dipertimbangkan.
Ketika saya dipaksa untuk mengecilkan Database Jika ini adalah lingkungan saya, saya akan mencari untuk meninggalkan ruang putih yang adil / besar dalam file data karena saya suka menjadi babi disk dan suka dipersiapkan untuk pertumbuhan di masa depan / tak terduga. Jadi saya akan baik-baik saja memberikan ruang kembali jika kita hanya menghapus sebagian besar ruang, tetapi saya tidak akan pernah percaya orang mengatakan "tapi itu tidak akan pernah tumbuh lagi" dan masih meninggalkan beberapa ruang putih. Rute yang mungkin saya tempuh ( menghela nafas) adalah pendekatan menyusut jika saya memiliki jendela downtime yang lebih kecil dan tidak ingin menimbulkan kerumitan membuat DB kosong dan memigrasikan data ke dalamnya. Jadi saya akan mengecilkannya beberapa kali secara bertahap (berdasarkan berapa kali saya pikir saya perlu berdasarkan pengujian saya di dev dan ukuran yang diinginkan. Semakin memilih ukuran file yang lebih kecil) dan kemudian membangun kembali indeks .. Dan kemudian saya ' d tidak pernah memberi tahu siapa pun bahwa saya menyusutkan database saya ;-)
sumber
DBCC SHRINKFILE
perintah yang Anda sebutkan. Tergantung pada server Anda, berapa banyak file yang terdiri dari basis data Anda. Database sederhana memiliki satu file database dan satu file log transaksi.Kita semua tahu bahwa tidak disarankan melakukan SHRINK secara teratur. Saya mencoba untuk mengabaikan semua peringatan dan penolakan yang mungkin Anda ketahui. Cadangkan, dan jangan lakukan ini di rumah jika memungkinkan :)
Bonus: dalam lingkungan replikasi jika Anda melakukan ini pada database penerbit, itu tidak akan menyebabkan basis data pelanggan menyusut (yang mungkin memiliki masalah ukuran karena mereka edisi Express).
Akhirnya, skrip pengindeksan ulang saya:
Satu-satunya variabel dalam ini adalah 14, yang dapat diperoleh dengan mengeluarkan pilih
DB_ID('YourDBName')
, dan skrip mengasumsikan bahwa Anda hanya tertarik pada tabel di skema dba. *.sumber
Anda telah mendengar semua peringatan tentang penyusutan basis data dan semuanya benar. Ini akan memecah indeks Anda dan secara umum, membersihkan database Anda dan tidak boleh dilakukan pada sistem produksi.
Tapi, saya biasanya melakukannya setiap minggu ketika saya mengembalikan cadangan pada workstation saya karena ruang pada drive SSD saya. Pikiran Anda, saya tidak menulis skrip ini tetapi menemukannya bertahun-tahun yang lalu. Pada database lain [250 GB], saya membuat paket SSIS yang akan mentransfer tabel yang saya butuhkan dan kemudian membuat ulang indeks untuk indeks yang terasa begitu segar.
sumber
Kutipan di bawah ini langsung dari Microsoft (berlaku untuk versi 2008-2016), dan memberikan panduan tentang jika / kapan dan bagaimana Anda harus menggunakan
DBCC SHRINKFILE
perintah.https://msdn.microsoft.com/en-us/library/ms189493.aspx
sumber