Dapatkan MS SQL Server untuk melepaskan ruang disk

9

Tabel database yang dikelola dengan buruk telah berkembang menjadi sangat besar. 48+ pertunjukan catatan anak yatim. Saya mencoba untuk membersihkannya dan mengembalikan hard drive penuh saya yang berbahaya ke keadaan normal. Saya akan menghapus sekitar 400 juta catatan dari tabel ini. Ini berjalan saat saya mengetik. Saya perhatikan bahwa saya tidak melihat penurunan dalam ruang hard drive saya tetapi saya melihat penurunan memori pada permintaan tabel sistem, saya berlari untuk mendapatkan ukuran tabel. Basis data menggunakan "Model Pemulihan Sederhana".

Ada banyak pertanyaan serupa dengan ini dengan tanggapan yang mengatakan Anda perlu menyusutkan database. Tetapi mereka terus menjelaskan seberapa buruk / menakutkan hal ini dilakukan karena data terfragmentasi dll.

  1. Karena database seharusnya tidak seukuran ini. Apakah masih buruk bagi saya untuk mengecilkannya?
  2. Ini adalah basis data produksi. Jika saya mengecilkannya, apakah itu akan menyebabkan downtime atau mengunci basis data?
  3. Di SQL Server Management Studio Anda memiliki dua opsi untuk menyusut, database atau file. Mengingat situasi saya, apa yang akan menjadi pilihan terbaik?
  4. apakah ada aturan tentang persentase ruang kosong yang seharusnya dimiliki DB?

Bahkan membaca deskripsi tag menyusut membuat saya tidak ingin melakukannya. Apakah ada cara lain?

jackncoke
sumber

Jawaban:

14

Saya akan menghapus sekitar 400 juta catatan dari tabel ini.

Mudah-mudahan, Anda melakukannya dalam potongan - untuk menghindari membengkaknya log transaksi.

perhatikan bahwa saya tidak melihat penurunan pada ruang hard drive saya

Anda tidak akan, karena Anda harus secara eksplisit mengecilkan file database untuk melepaskan ruang. Hanya menghapus catatan, SQL server tidak akan melepaskan ruang kembali ke OS .

  1. Karena database seharusnya tidak seukuran ini. Apakah masih buruk bagi saya untuk mengecilkannya?

Ini umumnya merupakan praktik yang buruk karena database harus dipresentasikan dengan benar. Jika Anda 100% yakin bahwa database Anda TIDAK akan menjadi ukuran ini lagi, tidak masalah bagi Anda untuk mengecilkan database (dalam skenario Anda) .

  1. Ini adalah Database produksi. Jika saya mengecilkannya, apakah itu akan menyebabkan downtime atau mengunci basis data?

Mengecilkan basis data sangat intensif IO. Dianjurkan untuk menyusut menggunakan DBCC SHRINKFILEselama jendela pemeliharaan atau ketika ada aktivitas minimal.

  1. Di studio manajemen Anda memiliki dua opsi, Database atau File. Mengingat situasi saya, apa yang akan menjadi pilihan terbaik?

Anda harus menggunakan TSQL untuk melakukan menyusut. (karena Anda bertanya, menyusutkan FILE adalah cara untuk pergi alih-alih basis data). Anda dapat menggunakan database shrink di chunks - skrip tsql untuk melakukan shrink in chunks.

Ingatlah bahwa ketika Anda menyusut, Anda memecah indeks Anda.

  1. apakah ada aturan tentang persentase ruang kosong yang seharusnya dimiliki DB?

Anda bisa merujuk ke Memperkirakan Kebutuhan Ruang Disk untuk artikel Database . Tidak ada aturan perbaikan, Anda harus memperhitungkan bagaimana pertumbuhan database Anda. Anda juga harus memperhitungkan, autogrowth dari database Anda .

Referensi: Mengapa Log Transaksi Terus Berkembang atau Kehabisan Ruang?

Kin Shah
sumber
5

Anda memiliki alasan yang baik untuk khawatir karena DB menyusut dalam SQL Server sering "payah". Paul Randal, kepala Storage Engine di SQL 2005 menyatakan, ShrinkDB ditulis sangat buruk. Ini akan menemukan ruang kosong dengan mengambil data di bagian paling akhir dan meletakkannya di bagian paling awal dan terus melakukan ini sampai memiliki ruang kosong di 'ujung' file DB. Pada titik ini kemudian dapat melepaskan ruang dari SQL Server dan mengembalikannya ke OS. Anda secara efektif membalik file database Anda sehingga Anda akan melihat fragmentasi besar biasanya. Anda dapat membaca tentang pandangannya pada posting blog ini atau pada Video MCM Internals ini

Seperti halnya semuanya, Anda harus benar-benar menguji ini di lingkungan Anda terlebih dahulu. Cara yang lebih baik untuk melakukannya adalah memindahkan data ke grup file yang berbeda. Anda dapat melakukan pembangunan kembali indeks online dengan indeks berkerumun dan kemudian memasukkan kembali dalam filegroup baru. Kemudian Anda dapat menjatuhkan yang lama dan melepaskan ruang dan hampir tidak memiliki fragmentasi. Perhatikan ini akan membutuhkan sekitar 120% ruang ekstra saat sedang bekerja melaluinya. Masalahnya adalah Anda membutuhkan ruang kosong tambahan yang sepertinya tidak Anda miliki. Ini adalah fitur perusahaan.

Jika ruang kosong sebesar itu, maka Anda mungkin harus menggigit peluru dan perlahan-lahan mengecilkan DB sepotong kecil pada suatu waktu untuk menghindari proses berjalan lama. Perhatikan bahwa data Anda akan sangat terfragmentasi dan Anda akan ingin mengindeks kembali semuanya lagi. Perhatikan bahwa setelah pengindeksan ulang semuanya, Anda kemudian akan menggembungkan ruang bekas Anda dan kembali untuk memiliki ruang kosong tambahan. Lihat saran Brent di sini .

Sejauh berapa banyak ruang kosong yang baik untuk Anda, adalah soal seberapa banyak Anda mampu melakukan kegiatan fragmentasi dan pertumbuhan file. Dengan IFI diaktifkan, pertumbuhan file hampir instan tetapi Anda masih mendapatkan fragmentasi. Aturan praktis yang baik adalah melakukan preallocate sebanyak ruang yang Anda pikir akan Anda butuhkan, atau memantau pertumbuhan dan menyesuaikan potongan secara berkala jika Anda harus. Ini menjaga fragmentasi fisik tetap rendah.

Juga pertumbuhan file log jauh lebih penting. File log tambahan dapat menyebabkan fragmentasi VLF. Ini membuat pemulihan Anda lebih lambat dan dapat memengaruhi checkpoint / truncate. Inilah beberapa risiko kinerja yang Anda ambil dengan log yang terfragmentasi. Lakukan DBCC LOGINFO();pada setiap database. Usahakan agar jumlahnya sekitar 50an per Kim Tripp, tetapi jika Anda melihat ratusan, Anda memiliki masalah fragmentasi yang berarti file log Anda harus tumbuh untuk mendukung operasi. Cara yang baik untuk melihat file log Anda seharusnya per Paul Randal adalah membiarkannya tumbuh selama seminggu dan mengindeks ulang. Itu bisa menjadi poin yang bagus, mungkin Anda bisa membuang sedikit lebih banyak ruang kosong di sana untuk berjaga-jaga. Pastikan log Anda tidak terfragmentasi dengan DBCC LOGINFO (); lagi dan jika ya, itu berarti mereka tumbuh banyak. Kecilkan dan perluas ulang file log menggunakanmetode ini .

Ali Razeghi
sumber
2

Tidak masalah bagi Anda untuk mengecilkannya untuk memastikan server Anda tidak akan crash dalam jumlah waktu yang Anda perlukan untuk menilai kebutuhan penyimpanan Anda dan merencanakan perangkat keras / layanan hosting dengan tepat (lihat pertanyaan 4). Tidak, itu tidak akan menguncinya. Lihat batasan . Kecilkan basis data karena hal-hal yang sederhana.

Saya sarankan mengontrak keahlian untuk melakukan penelitian dan menulis rencana.

pengguna41207
sumber