Konteks
Kami sedang mengembangkan sistem dengan database besar-ish di bagian bawah. Ini adalah database MS SQL yang berjalan pada SQL Server 2008 R2. Ukuran total database adalah sekitar 12 GB.
Dari jumlah tersebut, sekitar 8,5 GB berada dalam satu tabel BinaryContent
. Seperti namanya, ini adalah tabel tempat kami menyimpan file sederhana, dalam bentuk apa pun, langsung di dalam tabel sebagai BLOB. Baru-baru ini kami telah menguji kemungkinan untuk memindahkan semua file ini dari database ke sistem file menggunakan FILESTREAM.
Kami melakukan modifikasi yang diperlukan untuk database kami tanpa masalah, dan sistem kami masih berfungsi dengan baik setelah migrasi. The BinaryContent
meja terlihat kira-kira seperti ini:
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]
Dengan semua yang ada di PRIMARY
grup file, kecuali bidang FileBinaryContent
yang ada di grup file terpisah FileStreamContentFG
.
Skenario
Dari sudut pandang pengembang, kami sering ingin salinan baru dari database dari lingkungan produksi kami, untuk dapat mengerjakan data terbaru. Dalam kasus tersebut, kami jarang tertarik pada file yang disimpan di BinaryContent (sekarang menggunakan FILESTREAM).
Kami memiliki ini hampir berfungsi sesuka kami. Kami mencadangkan basis data, tanpa aliran file seperti ini:
BACKUP DATABASE FileStreamDB
FILEGROUP = 'PRIMARY'
TO DISK = 'c:\backup\FileStreamDB_WithoutFS.bak' WITH INIT
Dan kembalikan seperti ini:
RESTORE DATABASE FileStreamDB
FROM DISK = 'c:\backup\FileStreamDB_WithoutFS.bak'
Ini tampaknya berfungsi dengan baik, dan sistem kami berfungsi selama kami menghindari bagian-bagian yang menggunakan FileBinaryContent
bidang tersebut. Misalnya, kami dapat menjalankan kueri berikut tanpa masalah:
SELECT TOP 10 [BinaryContentID],[FileName],[BinaryContentRowGUID]
--,[FileContentBinary]
FROM [dbo].[BinaryContent]
Secara alami, jika saya berhenti mengomentari baris di atas, termasuk FileContentBinary
dalam kueri, saya mendapatkan kesalahan:
Data objek besar (LOB) untuk tabel "dbo.BinaryContent" berada di filegroup offline ("FileStreamContentFG") yang tidak dapat diakses.
Sistem kami menangani file mana konten diatur ke null
, jadi apa yang saya suka lakukan adalah sesuatu seperti ini:
UPDATE [dbo].[BinaryContent]
SET [FileContentBinary] = null
Tapi ini tentu saja memberi saya kesalahan yang sama seperti di atas. Pada titik ini saya terjebak.
Pertanyaan
Apakah ada cara saya bisa memulihkan database tanpa harus juga mengembalikan semuanya dari FileStreamContentFG
grup file? Baik dengan memperbarui nilai-nilai ke nol seperti yang saya coba di atas, atau default ke nol ketika file hilang atau sesuatu?
Atau mungkin saya mendekati masalah dengan cara yang salah?
Saya pada dasarnya adalah seorang pengembang dan tidak memiliki banyak pengetahuan sebagai DBA, jadi permisi jika saya mengabaikan hal-hal sepele di sini.
Jawaban:
Apa yang Anda coba lakukan akan membuat basis data dalam keadaan tidak konsisten (transaksi), sehingga tidak mungkin.
The Partial database Ketersediaan whitepaper adalah panduan referensi yang berguna dan termasuk contoh bagaimana untuk memeriksa apakah meja atau file tertentu yang online. Jika akses data Anda melalui prosedur tersimpan, Anda dapat dengan relatif mudah memasukkan pemeriksaan itu.
Salah satu pendekatan alternatif (tapi agak gila) yang mungkin layak dilihat dalam skenario Anda adalah menyembunyikan tabel dan menggantinya dengan tampilan.
sumber
Anda bisa mengisolasi tabel dengan
FILESTREAM
dalam database yang terpisah dan membuat referensi ke dalamPRODUCTION
database menggunakan tampilan.Ini akan memungkinkan Anda melakukan apa yang Anda inginkan tanpa menggunakan peretasan.
sumber