Kecilkan basis data di bawah ukuran awalnya

10

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_Dataadalah 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 FULLke SIMPLEdan kembali lagi. Tidak ada sukacita

Saya pikir itu ada hubungannya dengan beberapa TEXTbidang. 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
Paul White 9
sumber

Jawaban:

3

Seperti yang telah disebutkan oleh beberapa orang, Anda dapat membuat basis data baru dan "menyalin" dari database lama. Ini akan menjadi pilihan terbaik untuk Anda. Namun saya perhatikan bahwa Anda ingin melakukannya secara teratur. Jadi pilihan terbaik Anda adalah Redgate Data Compare dan Redgate Compare . Keduanya adalah bagian dari paket Redgate SqlToolbelt .

Jadi apa yang kamu lakukan:

  1. Buat DB kosong dengan ukuran awal kecil.
  2. Gunakan Redgate Compare untuk menyalin struktur db, fungsi dll dari db lama
  3. Gunakan Redgate Data Compare untuk menyalin data dari database lama ke yang baru
  4. Anda bekerja pada basis data dev dan setiap saat Anda hanya melakukan Perbandingan Data dan memperbarui Dev DB secara teratur, atau jika Anda melakukan perubahan apa pun ke db, Anda dapat menggunakan perubahan itu menggunakan Redgate Compare dan kemudian melakukan Redgate Data Compare.

Apa yang baik dengan Pembandingan Data adalah bahwa setelah Anda menyalin 30gb data (Anda dapat melakukannya mulai dengan beberapa tabel saja) setelah beberapa saat hanya perlu 'membandingkan' hanya beberapa perubahan dan tidak seluruh data 30gb. Yang berarti itu akan melakukan dampak yang jauh lebih sedikit pada kedua database maka itu akan dengan menyalinnya secara normal.

MadBoy
sumber
2

Beberapa kemungkinan di sini.

Pertama-tama, apakah Anda menggunakan SQL 2005 SP3 atau lebih baru? Beberapa telah melaporkan masalah SHRINKFILE pada versi sebelumnya (lihat http://www.sqlservercentral.com/Forums/Topic981292-146-6.aspx#bm985164 )

Kedua, dapatkah Anda memverifikasi bahwa basis data diatur ke kompatibilitas mode 90, dan bukan mode 80? Ini tampaknya adalah masalah dengan SQL 2000, tetapi pembatasan diangkat pada SQL 2005. Jika database Anda masih diatur ke mode 80 kompatibilitas, ini mungkin masih menjadi masalah.

Ketiga, ini bisa menjadi masalah dengan data LOB (teks, ntext, varchar (maks)). Lihat artikel bagus Paul Randall di sini

Saya berasumsi bahwa Anda memahami apa yang benar-benar dilakukan SHRINKing, dan itu dapat berdampak negatif pada kinerja Anda:

  • SHRINK berfungsi dengan memindahkan halaman secara membabi buta dari ujung file ke awal
  • Dengan demikian, itu bisa mengerikan indeks fragmen, yang dapat menyebabkan masalah kinerja yang signifikan
  • Karena ini merupakan operasi yang intensif data, psikiater dapat mengambil waktu yang signifikan

Saya biasanya merekomendasikan menindaklanjuti psikiater dengan reindex penuh (yang akan merebut kembali beberapa ruang yang baru saja dibebaskan), tetapi itu tidak terdengar seperti Anda bahkan bisa sampai ke titik itu.

Jika Anda melihat menyusut SPID Anda di monitor aktivitas, apakah itu tampak melakukan sesuatu? (Penghitung IO dan CPU berubah) Atau diblokir? Satu-satunya hal lain yang bisa saya pikirkan adalah jika ada aktivitas lain di database, memblokir psikiater. Pastikan tidak ada spid aktif lain yang menggunakan database pada saat itu.

Beralih ke mode pemulihan sederhana selama proses ini juga merupakan ide yang baik, untuk menjaga agar log tidak tumbuh terlalu banyak.

BradC
sumber
1

SHRINKDATABASE hanya akan mengecilkan basis data (paling-paling) ke MinSize-nya, sehingga tidak akan membantu Anda.

Saat Anda mencoba mengecilkan FILE melalui UI SSMS menggunakan default, ini menggunakan 'DBCC SHRINKFILE (N'MyDB', 0, TRUNCATEONLY) '. Perintah itu hanya akan mengecilkan file (paling banter) ke batas yang dialokasikan terakhir.

Jika Anda ingin mengecilkan file di bawah ukuran MinSize, cukup ubah parameter pada DBCC SHRINKFILEdari 0 ke ukuran yang ingin Anda coba menyusutkan file ke dalam MB. Nomor yang bukan nol akan memberi tahu SHRINKFILE untuk mengecilkan file ke ukuran itu jika memungkinkan. Jadi DBCC SHRINKFILE('MyDB', 300, TRUNCATEONLY)akan mengecilkan file ke 300MB jika database memiliki ruang.

Anda dapat melihat MinSize dengan menjalankan ini:

DBCC TRACEON(3604)
go
DBCC PAGE('MyDB', 1, 0, 3) with tableresults
go

MinSize dalam MB dihitung dengan cara ini: (MinSize * 8) / 1024

infoone
sumber
0

Jika Anda benar-benar ingin melakukan ini:

  • atur ke mode pemulihan ke sederhana
  • hati-hati terhadap: DBCC SHRINKDATABASE (MyDatabase, TRUNCATEONLY);
p.campbell
sumber
0

Jika Anda memiliki, katakanlah, 20003 (mb) dari data aktual dalam database, maka "SIZE = 20000" akan terlalu kecil. Coba dengan 21000 atau 25000, lihat apakah itu berhasil. (Dan ingat, 1 GB = 1024 MB.)

Philip Kelley
sumber
0

Mencoba

DBCC SHRINKDATABASE (N'SMS2_Data' , 0)

Saya menggunakan ini pada database SQL 2005 yang saya miliki di sini dan ruang yang dialokasikan untuk file data berubah dari 10,2 GB menjadi 3 GB.

Fyi, ini adalah proses yang panjang, dan butuh sedikit lebih dari 19 menit untuk database saya.


sumber
ps Baru dicek dan Model Pemulihan untuk basis data saya disetel ke Sederhana.
Itu tidak ada bedanya, saya cukup yakin itu sama yang dilakukan melalui ujung depan.
0

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:

  1. Buat database baru dengan ukuran lebih kecil dari database sumber
  2. Atur paket SSIS dengan tugas basis data transfer. Tetapkan tugas untuk menggunakan transfer online.
  3. Jalankan paket SSIS.
  4. Paket SSIS dapat mengubah ukuran basis data agar sesuai dengan ukuran basis data sumber. Kecilkan basis data ini, karena memiliki ukuran file asli yang lebih kecil.

Lihat informasi tambahan tentang tugas basis data transfer SSIS .

bobs
sumber
0

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.

VladV
sumber
0

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
0

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

execute sp_spaceused

dalam konteks database Anda (gunakan nama file;)
Dapatkah Anda memposting hasil eksekusi?


Pembaruan:
Saya memposting pertanyaan terkait saya di atasnya:

Gennady Vanin Геннадий Ванин
sumber
Itu tidak bekerja dengan baik. 13903.16mb ruang yang tidak terlindungi. Indeks tidak digunakan 1688944 KB