Bir veritabanını arşivleme amacıyla birleştirmenin / sıkıştırmanın en iyi yolu


9

E-posta arşivleme için kullanılan bir SQL Server örneğimiz var (3. taraf arşivleme paketinin izniyle). Yazılım sık sık yeni bir boş veritabanına aktarılır. Bunu üç ayda bir yaptık, ama şimdi aylık olarak yapmak istiyoruz. Arşivlenen veri miktarı ayda yaklaşık 15-20 GB'dir ve verilerin büyük kısmı yalnızca birkaç tabloda bulunur (genellikle 2 - 4).

Yeni bir veritabanına döndüğümüzde, eskisi kesinlikle salt okunur olarak kullanılır. Ne yapmak istiyorum, tüm tablolar / dizinler bitişik ve çok yüksek bir doldurma faktörü ve veri dosyasının sonunda çok fazla boş alan ile güzel, sıkı bir veri dosyasına optimize etmektir. Ayrıca, bu sunucuda Standard Edition kullanıyoruz, ima edilen tüm sınırlamalarla (aksi halde veri sıkıştırmayı zaten kullanıyordum).

Düşünebileceğim birkaç olasılık:

  1. REBUILD / REORGANIZE dizinleri, DBCC SHRINKFILE (Tamam, bu mantıklı bir seçenek değil, çünkü DBCC SHRINKFILE dokunduğu her şeyi işemek parçalayacak, ama bütünlüğü dahil ediyorum.)
  2. Otomatik istatistikler kapalı olarak yeni bir veritabanı oluşturun. Kaynak veritabanındaki tüm tabloları kodlayın ve yeniden oluşturun. Verileri küme anahtarı sırasıyla yeni veritabanına vermek / almak için bcp komutunu kullanın. Tüm dizinleri kodlayın ve yeniden oluşturun. Tüm istatistikleri tam tarama ile yeniden hesaplayın.
  3. Otomatik istatistikler kapalı olarak yeni bir veritabanı oluşturun. Kaynak veritabanındaki tüm tabloları kodlayın ve yeniden oluşturun. Verileri yeni veritabanına aktarmak için SSIS veya T-SQL kullanın. Tüm dizinleri kodlayın ve yeniden oluşturun. Tüm istatistikleri tam tarama ile yeniden hesaplayın.

Her durumda son adım, veritabanını salt okunur moda ayarlamak olacaktır.

Bunu yapmak için başka hangi iyi / daha iyi seçenekler var? Endişem, verileri yüksek bir doldurma faktörünü koruyacak şekilde ve mantıksal olarak bitişik bir şekilde taşımaktır.

Düzenle:

Verilerin yaklaşık% 75'inin resim (LOB) sütunlarında depolandığını belirtmeliyim.


3
Tabloların fiziksel olarak başka bir dosya grubuna girip girmeyeceğini düşünüyor musunuz (veya uygulama) PRIMARY?
Jon Seigel

@JonSeigel Sanmıyorum, ve aslında bu oldukça iyi bir fikir, çünkü bana bir şablon veritabanı oluşturmak ve tüm verileri taşımak zorunda kalma zahmetinden kurtarır.
db2

Yalnızca kendiniz kodladığınız çözümleri mi düşünüyorsunuz yoksa size yardımcı olması için bazı uygulamaları da inceleyebilirsiniz. Canlı verileri sıkıştırmak için RedGate'in SQL Depolama Sıkıştırmasını kullanabilirsiniz. Veya sıkıştırılmış yedekleri çevrimiçi dbs olarak kullanılabilir hale getirmek için Sanal Geri Yükleme'yi deneyebilirsiniz (aslında tam alana ihtiyaç duymadan). Hepsi canlı veri ve yedeklemeleri sıkıştırmada çok iyi olan eski Hyperbac windows dosya sürücüsüne dayanmaktadır.
Marian

@Marian Kulağa ilginç geliyor, ancak şimdilik yerel SQL Server özelliklerine bağlı kalmak istiyorum. Dosyalarda çok fazla kullanılmayan alan kalmadan veritabanlarını çok etkili bir şekilde birleştirmem gerekiyor. El ile komut dosyası yazmak yerine işi gerçekleştiren üçüncü taraf bir araçsa, sorun değil.
db2

Bu sadece bir düşüncedir, ancak neden yeni bir dosya grubu oluşturmuyorsunuz, bir dosya eklemiyorsunuz, makul bir büyüme ayarlıyorsunuz (500MB diyelim) ve ardından tablolarınızı bu yeni dosya grubuna yeniden oluşturmuyorsunuz. Sonra birincil dosyayı neredeyse hiçbir şeye küçültün. Sistem tablolarında parçalanma konusunda bir yalamak umursamazsınız.
Nic

Yanıtlar:


1

Dosyalardaki fiziksel parçalanmayı ortadan kaldırmak için, kümelenmiş dizini yeni bir dosya grubuna bırakılan bırakma hareketiyle taşıyabilirsiniz. RO olacaklarından, tüm dolgu faktörlerini% 100 ekler için yer gerektirmediğinden, güncellemelerin neden olduğu sayfa bölünmeleri haline getirin.

Bu ayrıca, parça parça geri yükleme gerçekleştirmenize ve Enterprise'a gitmeye karar verdiyseniz veritabanını çok hızlı bir şekilde çevrimiçi hale getirmenize olanak tanır. Enterprise ayrıca, büyük bir radyus olan Salt Okunur veriler için sorgu süresini büyük ölçüde azaltmanın yanı sıra, sütun deposu dizinlerine de izin verir.

Shrinkfile seçeneğini, okuma işlemine geçmeden önce, dosyanın sonundaki alanı istediğiniz gibi kaldırmak için parçalanma konusunda ciddi bir sorun olmadan okumak için bir kez kullanabilirsiniz.

Bir yan notta, LOBS'ınız için en son Veri Türlerini kullandığınızı kontrol edin. yani ntext veya metin yerine nvarchar (max) veya varchar (max), görüntü yerine varbinary (max)?


Ne yazık ki çoğunlukla metin ve resim kullanıyor. Bu bir üçüncü taraf uygulaması, bu yüzden bunu değiştirme yeteneğim yok.
db2

@its uygulama için gerçekten şeffaf, SQL sunucusu bilgileri <8k ise satırda saklar. Satıcı desteklenmediğini söylüyorsa, neden hala SQL Server 2005'te kullanımdan kaldırılan veri türlerini kullandıklarını sorarım!
DamagedGoods

Uygulamanın veri türünü değiştirdikten sonra başarısız olacak WRITETEXT gibi metin / görüntüye özgü şeyler yapmadığından tamamen emin olamıyorum. Ancak ana noktaya geri dönersek, kümelenmiş dizini yeniden oluşturmak LOB verilerini aslında onunla taşımıyor gibi görünüyor.
db2

Bunu yapabilirsiniz, ancak GUI'de tasarımcıya gitmeniz, ardından özellikleri genişletmeniz gerekir, daha sonra bir 'düzenli veri alanınız' değil, aynı zamanda bir TEXTIMAGE dosya grubunuz da olur, bunu değiştirirsiniz, ancak bu tabloyu yeniden yaratacaktır! Açıkçası bunu komut dosyası ve mümkünse bir bakım penceresinde çalıştırabilirsiniz
DamagedGoods

Anlaşıldı, en azından uygun yeniden oluşturma komut dosyalarını oluşturmak için yararlı bir yol olabilir.
db2

0

Yapılandırılmamış verileri depolamak için bir görüntü veri türü kullanan üçüncü taraf bir araçla benzer bir sorunla karşılaştım ve sütunu filestream kullanmak için dönüştürerek çözdüm . Uygulamanın beklediğiniz gibi çalıştığından emin olmak için bazı testler yapmanız gerekecek, ancak bu, verilerinizi verimli bir şekilde bir arşiv db'sine taşıyan kendi arşivleme sürecinizi yazma olanağı verecektir.


Filestream'in bu durumda iyi ölçeklenmeyeceğinden şüpheleniyorum. 17 veritabanında 14 milyondan fazla satıra sahibiz ve günde 15.000 civarında mesaj alıyoruz. İleti gövdelerinin önemli bir kısmı 4 KB'nin altında olduğundan, NTFS küme israfı muhtemelen acımasız olacaktır (ve 64KB'den küçük bir blok boyutuna sahip yeni bir disk birimi eklesek bile).
db2

Bu durumda, veri türünü nvarchar (max) gibi bir şeye dönüştürebilir ve bu büyük nesneler için farklı bir dosya grubu belirtmek üzere TEXTIMAGE_ON yantümcesini kullanabilir misiniz? Bu, verileri satır dışında depolamanıza ve arşivlemeyi yönetmek için kendi işleminizi oluşturmanıza olanak tanır.
Liam Confrey

filestream kullanımı gerçekten her LOBS büyüklüğüne bağlıdır. Bence kayıt başına> 1MB. Yani bu durumda onun bir seçenek değil kabul ediyorum
DamagedGoods
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.