Bağlam
Altta büyük-ish veritabanına sahip bir sistem geliştiriyoruz. SQL Server 2008 R2 üzerinde çalışan bir MS SQL veritabanıdır. Veritabanının toplam boyutu yaklaşık 12 GB'dir.
Bunlardan yaklaşık 8,5 GB tek bir tabloda bulunuyor BinaryContent. Adından da anlaşılacağı gibi, bu, her türlü basit dosyayı doğrudan BLOB olarak tabloda sakladığımız bir tablodur. Son zamanlarda FILESTREAM kullanarak tüm bu dosyaları veritabanından dosya sistemine taşıma olasılığını test ediyoruz.
Veritabanımızda herhangi bir sorun olmadan gerekli değişiklikleri yaptık ve geçişten sonra sistemimiz hala iyi çalışıyor. BinaryContentTablo bu gibi kabaca görünür:
CREATE TABLE [dbo].[BinaryContent](
[BinaryContentID] [int] IDENTITY(1,1) NOT NULL,
[FileName] [varchar](50) NOT NULL,
[BinaryContentRowGUID] [uniqueidentifier] ROWGUIDCOL NOT NULL
) ON [PRIMARY] FILESTREAM_ON [FileStreamContentFG]
ALTER TABLE [dbo].[BinaryContent] ADD [FileContentBinary] [varbinary](max) FILESTREAM NULL
ALTER TABLE [dbo].[BinaryContent] ADD CONSTRAINT [DFBinaryContentRowGUID] DEFAULT (newsequentialid()) FOR [BinaryContentRowGUID]
Ayrı bir dosya grubundaki PRIMARYalan dışında her şey FileBinaryContentdosya grubunda bulunur FileStreamContentFG.
Senaryo
Bir geliştiricinin bakış açısından, en son verileri çalıştırabilmek için genellikle üretim ortamımızdan veritabanının yeni bir kopyasını isteriz. Bu durumlarda, BinaryContent'te saklanan dosyalarla nadiren ilgileniyoruz (şimdi FILESTREAM kullanılıyor).
Bu neredeyse istediğimiz gibi çalışıyor. Veritabanını şu şekilde dosya akışı olmadan yedekliyoruz:
BACKUP DATABASE FileStreamDB
FILEGROUP = 'PRIMARY'
TO DISK = 'c:\backup\FileStreamDB_WithoutFS.bak' WITH INIT
Ve şu şekilde geri yükleyin:
RESTORE DATABASE FileStreamDB
FROM DISK = 'c:\backup\FileStreamDB_WithoutFS.bak'
Bu iyi çalışıyor gibi görünüyor ve FileBinaryContentalanı kullanan parçalardan kaçındığımız sürece sistemimiz çalışıyor . Örneğin, aşağıdaki sorguyu sorunsuz çalıştırabiliriz:
SELECT TOP 10 [BinaryContentID],[FileName],[BinaryContentRowGUID]
--,[FileContentBinary]
FROM [dbo].[BinaryContent]
Doğal olarak, FileContentBinarysorguda dahil olmak üzere yukarıdaki satırın yorumunu kaldırırsam, bir hata alıyorum:
"Dbo.BinaryContent" tablosu için büyük nesne (LOB) verileri, erişilemeyen bir çevrimdışı dosya grubunda ("FileStreamContentFG") bulunur.
Sistemimiz içeriğin ayarlandığı dosyaları işler null, bu yüzden ne yapmak istiyorum böyle bir şey:
UPDATE [dbo].[BinaryContent]
SET [FileContentBinary] = null
Ama bu elbette bana yukarıdaki ile aynı hatayı veriyor. Bu noktada sıkıştım.
Soru
Her şeyi FileStreamContentFGdosya grubundan geri yüklemek zorunda kalmadan veritabanını geri yükleyebilirim herhangi bir yolu var mı ? Yukarıda denediğim gibi değerleri null olarak veya dosya eksikse null olarak varsayılan olarak güncelleyerek?
Ya da soruna yanlış bir şekilde yaklaşıyor muyum?
Ben doğası gereği bir geliştiriciyim ve bir DBA olarak fazla bilgisi yok, bu yüzden burada önemsiz bir şey göz ardı edersem izin verin.