Bir veritabanını başlangıç ​​boyutunun altına küçültme


10

Canlı bir 30GB kopyası olan bir SQL Server 2005 dev veritabanı var. Dev'de gerekli olmayan ve kullanılan veri dosyası alanını 20 GB'a düşüren bazı verileri sildik. Yani yaklaşık% 33 kullanılmamış.

Bize (cut down sürümü dayalı) sunucu üzerinde ikinci bir dev DB olmasını sağlayacak alan, talep etmek gerekir; ancak, alanı geri alamıyorum, aşağıdakileri yaptım:

  • Dosyanın başlangıç ​​boyutu SMS2_Data30 GB'dir.

    DBCC SHRINKFILE (N'SMS2_Data' , 0, TRUNCATEONLY)

    bunu takiben

    DBCC SHRINKFILE (N'SMS2_Data' , 19500)

Sevinç yok. Ben bir yedekleme yapma denedim, düşük bir başlangıç ​​boyutu ile yeni bir DB oluşturma sonra geri yükleme, ilk boyutu üzerine yazılır gibi hiçbir sevinç. Ayrıca denedim:

ALTER DATABASE SMS2HazSub MODIFY FILE (NAME = 'SMS2_Data', SIZE = 20000) 

Bu yanlış söyleyerek:

DOSYA DEĞİŞTİRME başarısız oldu. Belirtilen boyut geçerli boyuttan küçük.

20800'ü denedim ve 29000'e (29GB) kadar çıkmaya devam ettim ve hala değiştirmeme izin vermiyor.

Daha sonra psikiyatriste yapılan kurtarma moduna değiştirdiniz FULLiçin SIMPLEve tekrar. Sevinç yok.

Bazı TEXTalanlarla ilgili olduğunu düşündüm . Sistem genelinde yaklaşık 6 tane var. Bu yüzden bir test olarak hepsini düşürdüm ve daha sonra dosyayı küçültdüm ve hala değişiklik yapmadım.

Kalan tek seçenek, verileri başka bir DB'ye yeniden aktarmaktır. Bu, çok fazla risk taşıyan canlı DB'de yapılması gerektiği için pratik değildir. Canlı DB'nin bir kopyasını yarı düzenli olarak alıyoruz ve geliştirici / testin üzerine yazıyoruz. 500 masa gibi bir şeyimiz var. Bunu yeni bir DB'ye veri aktarma riski taşımayan bir yol istiyorum.

Verileri başka bir dosyaya taşımayı denedim ve verilerin% 5'i dışında tümünü kopyaladı. Tüm metin sütunlarını bırakmaya çalışmamı sağlayan şey buydu.

Sunucu uyumluluk modu 90'da, ancak SP2. Şimdi aşağıdaki 3 kez yaptım: tüm tabloları reindex, yedekleme veritabanı, shrink dosyası, shrink veritabanı. Hala neşe yok.

EXECUTE sp_spaceused İadeler:

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

Yanıtlar:


3

Bazı kişilerin daha önce de belirttiği gibi, yeni veritabanı oluşturabilir ve eski veritabanından "kopyalayabilirsiniz". Bu sizin için en iyi seçenek olacaktır. Ancak bunu oldukça düzenli yapmak istediğinizi fark ettim. Bu yüzden en iyi seçeneğiniz Redgate Veri Karşılaştırması ve Redgate Karşılaştırmasıdır . Her ikisi de Redgate SqlToolbelt paketinin bir parçasıdır .

Ee ne yapıyorsun:

  1. Küçük başlangıç ​​boyutuna sahip boş bir DB oluşturun.
  2. Eski db'den db yapısını, fonksiyonlarını vb. Kopyalamak için Redgate Compare'i kullanın
  3. Eski veritabanındaki verileri yenisine kopyalamak için Redgate Veri Karşılaştırmasını kullanın
  4. Dev veritabanında çalışır ve daha sonra ya sadece Veri Karşılaştırması yapar ve Dev DB'yi düzenli olarak güncelleştirirsiniz veya db'de herhangi bir değişiklik yaparsanız, bu değişiklikleri Redgate Compare'i kullanarak ve sonra Redgate Data Compare'i kullanarak dağıtabilirsiniz.

Veri Karşılaştırması ile iyi olan şey, 30 gb'lik verileri kopyaladıktan sonra (yalnızca bazı tablolarla başlayarak yapabilirsiniz) bir süre sonra sadece 30 gb'lik veriyi değil sadece bazı değişiklikleri 'yeniden' karşılaştırması gerekir. Bu, her iki veritabanı üzerinde çok daha az etki yaratacağı anlamına gelir ve normal olarak kopyalar.


2

Burada birkaç olasılık var.

Her şeyden önce, SQL 2005 SP3 veya sonraki bir sürümü kullanıyor musunuz? Bazıları önceki sürümlerde SHRINKFILE sorunları bildirmiştir (bkz. Http://www.sqlservercentral.com/Forums/Topic981292-146-6.aspx#bm985164 )

İkinci olarak, veritabanının mod 80'e değil mod 90 uyumluluğuna ayarlandığını doğrulayabilir misiniz? Bu görünüşe göre SQL 2000 ile ilgili bir sorundu, ancak kısıtlama SQL 2005'te kaldırıldı. Veritabanınız hala mod 80 uyumluluğuna ayarlanmışsa, bu hala bir sorun olabilir.

Üçüncüsü, bu LOB verileriyle ilgili bir sorun olabilir (metin, ntext, varchar (max)). Paul Randall'ın mükemmel makalesine buradan bakın

SHRINKing'in gerçekten ne yaptığını anladığınızı ve performansınızı olumsuz etkileyebileceğini varsayıyorum:

  • SHRINK sayfaları dosyanın sonundan başlayarak körü körüne hareket ettirerek çalışır
  • Bu nedenle, önemli performans sorunlarına neden olabilecek dizinleri korkunç bir şekilde parçalayabilir.
  • Böylesi veri yoğun bir işlem olduğu için, küçülme önemli zaman alabilir

Normalde küçültmeyi tam bir reindex ile takip etmenizi öneririm (ki bu sadece serbest bırakılan alanın bir kısmını geri kazanır), ama o noktaya bile ulaşabileceğiniz gibi gelmiyor.

Etkinlik monitöründe shrink SPID'nize bakarsanız, herhangi bir şey yapıyor gibi görünüyor mu? (IO ve CPU sayaçları değişiyor) Yoksa engellenmiş mi? Aklıma gelen tek şey, büzüşmeyi engelleyen veritabanında başka bir etkinlik olup olmadığı. O sırada veritabanından başka hiçbir etkin örümcek kullanılmadığından emin olun.

Bu işlem sırasında Basit kurtarma moduna geçmek, günlüğün çok fazla büyümesini önlemek için de iyi bir fikirdir.


1

Bunu gerçekten yapmak istiyorsanız:

  • modu kurtarmak için basit olarak ayarlayın
  • haberdar: DBCC SHRINKDATABASE (MyDatabase, TRUNCATEONLY);

1

SHRINKDATABASE veritabanını (en iyi şekilde) yalnızca MinSize değerine küçültür, böylece size yardımcı olmaz.

DOSYAYI SSMS kullanıcı arabirimi aracılığıyla varsayılanları kullanarak küçültmeye çalıştığınızda, 'DBCC SHRINKFILE (N'MyDB', 0, TRUNCATEONLY) 'kullanır. Bu komut yalnızca (en iyi) dosyayı en son ayrılan ölçüde küçültür.

Dosyayı MinSize öğesinin altına küçültmek istiyorsanız, 0'daki parametreyi DBCC SHRINKFILE, dosyayı MB olarak küçültmeye çalışmak istediğiniz boyuta değiştirin. Sıfır olmayan bir sayı, SHRINKFILE dosyasına dosyayı mümkünse bu boyutta küçültmesini söyleyecektir. Yani DBCC SHRINKFILE('MyDB', 300, TRUNCATEONLY)veritabanı alanına sahipse 300MB dosyayı küçülecek.

Bunu çalıştırarak MinSize'i görebilirsiniz:

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

MB cinsinden MinSize şu şekilde hesaplanır: (MinSize * 8) / 1024


0

Örneğin, veritabanında 20003 (mb) gerçek datat varsa, "SIZE = 20000" çok küçük olur. 21000 veya 25000 ile deneyin, işe yarayıp yaramadığına bakın. (Ve unutmayın, 1 GB = 1024 MB.)


0

Deneyin

DBCC SHRINKDATABASE (N'SMS2_Data' , 0)

Ben burada var bir SQL 2005 veritabanında kullandım ve veri dosyası için ayrılan alan 10,2 GB 3 GB gitti.

Fyi, bu uzun bir süreç ve veritabanım için 19 dakikadan biraz fazla zaman aldı.


ps Yeni kontrol edildi ve veritabanım için Kurtarma Modeli Basit olarak ayarlandı.

Bu hiçbir fark yaratmadı, eminim ki ön uç üzerinden yapılan aynı.

0

SMS2_Data mantıksal adı ile tek bir veritabanı dosyanız olduğunu varsayalım. Ayrıca veritabanında bir veya daha fazla işlem günlüğü dosyası var.

Veritabanının geçerli kopyasında düzeltilemeyen bir zorluğunuz var. Belirttiğiniz önemli bilgi, 'veritabanı dosyasının orijinal boyutunun 30 GB' olmasıdır. Maalesef, Bu dosya orijinal boyutundan daha küçülemez.

Daha önce deneyimlediğiniz gibi, SHRINKDB ve SHRINKFILE size istediğinizi vermiyor. Bu komutlar orijinal boyut kuralından daha küçük küçülemez. Böylece, bir veritabanını yalnızca orijinal boyutuna küçültebilirsiniz, küçülmez.

Veritabanı yedekleme ve varolan daha küçük bir veritabanına geri yükleme de çalışmaz. Bir veritabanı geri yüklemesi yaptığınızda, veritabanı dosyaları yedekleme sırasında olduğu gibi dosya boyutlarına geri yüklenir. Ve kurtarma modelinin (basit, dolu vb.) Bu konuyla hiçbir ilgisi yoktur.

Ve son bir kötü haber noktası. Veritabanına başka, daha küçük veritabanı dosyaları eklemeyi, tüm verileri 30 GB dosyadan aktarmayı ve sonra bırakmayı düşünebilirsiniz. Ne yazık ki, ilk dosyayı veritabanından silemediğiniz için bu da çalışmaz.

Bu nedenle, en iyi çözüm, verileri başka bir veritabanına kopyalamaktır. Burada birkaç seçeneğiniz var ve belki de bunların farkındasınız. İlk adım, veri boyutundan daha küçük boyutlu yeni bir veritabanı oluşturmaktır. Ardından, veritabanı boyutunu gereken boyuta genişletebilirsiniz.

SSIS'i, verileri bir veritabanından diğerine aktarmanın bir yolu olarak düşünebilirsiniz. Size yardımcı olacak bir kopyalama veritabanı görevi bulacaksınız. Aşağıdaki adımları kullanabilirsiniz:

  1. Kaynak veritabanından daha küçük boyutlu yeni veritabanı oluşturma
  2. Transfer veritabanı görevi ile SSIS paketini kurun. Çevrimiçi aktarımı kullanmak için görevi ayarlayın.
  3. SSIS paketini çalıştırın.
  4. SSIS paketi, veritabanı boyutunu kaynak veritabanı boyutuna uyacak şekilde değiştirebilir. Orijinal veritabanının boyutu daha küçük olduğundan bu veritabanını küçültün.

SSIS aktarım veritabanı görevi hakkında ek bilgilere bakın .


0

Veritabanında kullanılmayan bazı alanlar normaldir.
Çok sayıda büyük kaydınız varsa (örneğin, uzun dizeler), veri sayfalarında çok fazla kullanılmayan alan olabilir (çünkü bir kayıt genellikle sayfalar arasında bölünmez).
Başka bir şey, bir doldurma faktörüdür - başlangıçta, sonraki eklemelerde sayfa bölünmelerini (pahalı bir işlem) önlemek için kümelenmiş dizinler% 100 dolu olarak oluşturulmaz.
Veritabanından çok sayıda veri silinmişse, bu veriler tarafından önceden kullanılan alan otomatik olarak geri kazanılmaz - tabloya ayrılmış olarak kalır.

DBCC DBREINDEX (table_name, '', 100)Veritabanınızdaki her tabloyu çağırmayı deneyin - tüm dizinleri% 100 doldurma faktörü ile yeniden oluşturur, böylece veriler mümkün olduğunca kompakt bir şekilde yerleştirilir. Ardından veritabanını tekrar daraltmayı deneyin.


0

Bir SQL Server veritabanını küçültmenin zahmetli olabileceğini keşfettim. Bir şarkı ve dans rutini yapmak zorundasınız.

Genelde yaşadığım süreç budur:

Yedekleme Shrink veritabanı Yedekleme Günlük ve veritabanı dosyalarını ayrı ayrı daraltın. Yedekleme Son olarak küçülene kadar tekrarlayın.

Sonunda çalışabilmesi için bu işlemi birkaç kez yapmak zorunda kaldım. % 98 kullanılmayan alan içeren 68 GB'tan büyük bir veritabanımız vardı. Bu şarkı ve dans rutini birkaç kez geçti, ama sonunda 1GB'ın altına düştü.


0

İlk önce 29.000 MB, daha sonra 28, 000 yakın hit tespit mdf dosyasının başlangıç ​​boyutunu azaltmaya çalışacaktı.

Verilerin% 30'unu silerek veritabanı dosya boyutunda% 30'luk bir azalma beklemek mantıksızdır.

Veritabanınızda ne kadar kullanılmayan alan olduğunu tahmin edebilirsiniz.

execute sp_spaceused

veritabanınız bağlamında (datadabaename kullanın;) Yürütülmesinin
sonucunu gönderebilir misiniz?


Güncelleme:
İlgili sorumu yayınladım:


Çok iyi çalışmadı. 13903.16mb ayrılmamış alan. Kullanılmayan dizin 1688944 KB
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.