Saya punya database dev SQL server 2005 yang merupakan salinan live 30GB. Kami telah menghapus beberapa data yang tidak diperlukan di dev, yang membawa ruang file data yang digunakan menjadi 20GB. Jadi kami memiliki sekitar 33% yang tidak digunakan.
Saya perlu merebut kembali ruang, yang akan memungkinkan kita untuk memiliki DB dev kedua di server (berdasarkan versi pengurangan); Namun, saya tidak bisa mendapatkan kembali ruang, saya telah melakukan hal berikut:
Ukuran awal file
SMS2_Data
adalah 30GB.DBCC SHRINKFILE (N'SMS2_Data' , 0, TRUNCATEONLY)
diikuti oleh
DBCC SHRINKFILE (N'SMS2_Data' , 19500)
Tidak ada sukacita Saya telah mencoba membuat cadangan, membuat DB baru dengan ukuran awal yang rendah kemudian memulihkan, tidak ada kesenangan karena ukuran awal akan ditimpa. Sudah juga mencoba:
ALTER DATABASE SMS2HazSub MODIFY FILE (NAME = 'SMS2_Data', SIZE = 20000)
Ini salah, mengatakan:
MODIFIKASI FILE gagal. Ukuran yang ditentukan kurang dari ukuran saat ini.
Saya mencoba 20800 dan kemudian terus naik hingga 29000 (29GB) dan masih tidak akan membiarkan saya mengubahnya.
Telah melakukan menyusut kemudian mengubah mode pemulihan dari FULL
ke SIMPLE
dan kembali lagi. Tidak ada sukacita
Saya pikir itu ada hubungannya dengan beberapa TEXT
bidang. Kami memiliki sekitar 6 di seluruh sistem. Jadi sebagai ujian saya menjatuhkan mereka semua dan kemudian melakukan penyusutan file dan masih tidak ada perubahan.
Satu-satunya pilihan yang tersisa adalah mengimpor kembali data ke DB lain. Ini tidak praktis, karena harus dilakukan pada live DB, yang membawa terlalu banyak risiko. Kami semi-rutin mengambil salinan DB langsung dan menimpa dev / test. Kami memiliki sekitar 500 tabel. Saya ingin cara melakukannya yang tidak akan memiliki risiko mengekspor data ke DB baru.
Saya mencoba memindahkan data ke file lain, dan itu menyalin semua kecuali 5% dari data. Inilah yang membuat saya mencoba dan menjatuhkan semua kolom teks.
Server berada pada mode kompatibilitas 90, tetapi SP2. Saya sekarang telah melakukan 3 kali berikut: indeks ulang semua tabel, database cadangan, menyusut file, menyusutkan database. Masih tidak ada sukacita.
EXECUTE sp_spaceused
pengembalian:
database_name database_size unallocated space
SMS2Tests 31453.94 MB 13903.16 MB
reserved data index_size unused
16545568 KB 10602264 KB 4254360 KB 1688944 KB
sumber
Saya berasumsi bahwa Anda memiliki file database tunggal dengan nama logis SMS2_Data. Anda juga memiliki satu atau lebih file log transaksi dalam database.
Anda memiliki tantangan yang tidak dapat diperbaiki pada salinan database saat ini. Sepotong informasi penting yang Anda nyatakan adalah 'ukuran asli file database adalah 30 GB'. Sayangnya, file ini tidak dapat menyusut lebih kecil dari ukuran aslinya.
Seperti yang sudah Anda alami, SHRINKDB dan SHRINKFILE tidak memberikan apa yang Anda inginkan. Perintah-perintah ini mengikuti tidak dapat menyusut lebih kecil dari aturan ukuran asli. Jadi, Anda hanya dapat mengecilkan basis data ke ukuran asli dan tidak lebih kecil.
Pencadangan dan pemulihan basis data ke basis data yang ada dan lebih kecil tidak berfungsi. Ketika Anda melakukan pemulihan database, file database dikembalikan ke ukuran file seperti saat cadangan. Dan, model pemulihan (sederhana, penuh, dll.) Tidak memiliki relevansi dengan masalah ini.
Dan, satu titik berita buruk terakhir. Anda mungkin mempertimbangkan untuk menambahkan file database lain yang lebih kecil ke database, mentransfer semua data dari file 30 GB, dan kemudian menjatuhkannya. Sayangnya, ini tidak akan berhasil karena Anda tidak dapat menghapus file awal dari database.
Jadi, solusi terbaik adalah menyalin data ke database lain. Anda memiliki beberapa opsi di sini, dan mungkin Anda sudah menyadarinya. Langkah pertama adalah membuat database baru dengan ukuran yang lebih kecil dari ukuran data. Kemudian, Anda dapat memperluas ukuran basis data ke ukuran yang diperlukan.
Anda dapat mempertimbangkan SSIS sebagai cara untuk mentransfer data dari satu database ke yang lain. Anda akan menemukan tugas basis data salinan yang akan membantu Anda. Anda dapat menggunakan langkah-langkah berikut:
Lihat informasi tambahan tentang tugas basis data transfer SSIS .
sumber
Beberapa ruang yang tidak digunakan dalam database adalah normal.
Jika Anda memiliki banyak catatan besar (mis. String panjang), mungkin ada banyak ruang yang tidak digunakan di halaman data (karena satu catatan biasanya tidak dibagi antara halaman).
Hal lain adalah faktor pengisian - awalnya, indeks berkerumun tidak dibuat 100% penuh untuk menghindari pemisahan halaman (operasi yang mahal) pada penyisipan berikutnya.
Jika banyak data dihapus dari database, ruang yang sebelumnya ditempati oleh data ini tidak akan secara otomatis direklamasi - itu akan tetap dialokasikan ke tabel.
Coba panggil
DBCC DBREINDEX (table_name, '', 100)
setiap tabel di basis data Anda - ini akan membangun kembali semua indeks dengan faktor pengisian 100%, sehingga data ditempatkan sekompleks mungkin. Kemudian coba menyusutkan basis data lagi.sumber
Saya telah menemukan bahwa menyusutkan database SQL Server bisa menyusahkan. Rasanya seperti Anda harus melakukan rutinitas lagu dan tarian.
Ini adalah proses yang biasanya saya lalui:
Backup Shrink database Backup Shrink log dan file database secara terpisah. Cadangkan Ulangi sampai akhirnya menyusut.
Saya harus melakukan proses ini beberapa kali hingga tiga kali agar akhirnya berhasil. Kami memiliki basis data lebih dari 68 GB, dengan sesuatu ruang 98% yang tidak digunakan. Pergi melalui rutin lagu-dan-dansa ini beberapa kali, tetapi akhirnya menyusut hingga di bawah 1GB.
sumber
Saya akan mencoba mengurangi ukuran awal file mdf menjadi 29.000 MB terlebih dahulu, kemudian menjadi 28.000 mendeteksi penutupan.
Tidak masuk akal untuk berharap mengurangi 30% dalam ukuran file database dengan menghapus 30% data.
Anda dapat memperkirakan berapa banyak ruang yang tidak digunakan dalam database Anda
dalam konteks database Anda (gunakan nama file;)
Dapatkah Anda memposting hasil eksekusi?
Pembaruan:
Saya memposting pertanyaan terkait saya di atasnya:
sumber