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. BinaryContent
Tablo 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 PRIMARY
alan dışında her şey FileBinaryContent
dosya 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 FileBinaryContent
alanı 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, FileContentBinary
sorguda 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 FileStreamContentFG
dosya 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.