संदर्भ
हम नीचे में एक बड़े-ईश डेटाबेस के साथ एक प्रणाली विकसित कर रहे हैं। यह एक MS SQL डेटाबेस SQL Server 2008 R2 पर चल रहा है। डेटाबेस का कुल आकार लगभग 12 जीबी है।
इनमें से, लगभग 8.5 जीबी एक ही तालिका में है BinaryContent
। जैसा कि नाम से पता चलता है, यह एक ऐसी मेज है, जहाँ हम साधारण फ़ाइलों को स्टोर करते हैं, सीधे टेबल में BLOB के रूप में। हाल ही में हम FILESTREAM का उपयोग करके इन सभी फ़ाइलों को डेटाबेस से फ़ाइल सिस्टम में स्थानांतरित करने की संभावना का परीक्षण कर रहे हैं।
हमने अपने डेटाबेस में बिना किसी समस्या के आवश्यक संशोधन किया, और हमारा सिस्टम माइग्रेशन के बाद भी ठीक काम कर रहा है। BinaryContent
टेबल इस तरह मोटे तौर पर दिखता है:
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]
PRIMARY
फ़ाइल समूह में रहने वाले प्रत्येक क्षेत्र के अलावा, उस क्षेत्र को छोड़कर FileBinaryContent
जो एक अलग फ़ाइल समूह में है FileStreamContentFG
।
परिदृश्य
एक विकासकर्ता के दृष्टिकोण से, हम अक्सर अपने उत्पादन वातावरण से डेटाबेस की एक ताजा प्रति पसंद करते हैं, नवीनतम डेटा को काम करने में सक्षम होने के लिए। उन मामलों में, हम शायद ही कभी बाइनरीकॉन्टेंट (अब FILESTREAM का उपयोग करके) में संग्रहीत फ़ाइलों में रुचि रखते हैं।
जैसा कि हम चाहेंगे, हमारे पास यह लगभग काम कर रहा है। हम इस तरह से फाइल स्ट्रीम के बिना, डेटाबेस का बैकअप लेते हैं:
BACKUP DATABASE FileStreamDB
FILEGROUP = 'PRIMARY'
TO DISK = 'c:\backup\FileStreamDB_WithoutFS.bak' WITH INIT
और इसे इस तरह से पुनर्स्थापित करें:
RESTORE DATABASE FileStreamDB
FROM DISK = 'c:\backup\FileStreamDB_WithoutFS.bak'
यह ठीक काम कर रहा है, और हमारा सिस्टम तब तक काम करता है जब तक हम उन हिस्सों से बचते हैं जो FileBinaryContent
क्षेत्र का उपयोग करते हैं। हम उदाहरण के लिए एक समस्या के बिना निम्नलिखित क्वेरी चला सकते हैं:
SELECT TOP 10 [BinaryContentID],[FileName],[BinaryContentRowGUID]
--,[FileContentBinary]
FROM [dbo].[BinaryContent]
स्वाभाविक रूप से, अगर मैं FileContentBinary
क्वेरी में ऊपर दी गई लाइन को अन-कमेंट करता हूं, तो मुझे एक त्रुटि मिलती है:
तालिका "dbo.BinaryContent" के लिए बड़ी ऑब्जेक्ट (LOB) डेटा ऑफ़लाइन फ़ाइलग्रुप ("FileStreamContentFG") पर रहता है जिसे एक्सेस नहीं किया जा सकता है।
हमारा सिस्टम उन फ़ाइलों को संभालता है जहां सामग्री सेट की गई है null
, इसलिए मैं जो करना चाहता हूं वह कुछ इस तरह है:
UPDATE [dbo].[BinaryContent]
SET [FileContentBinary] = null
लेकिन यह निश्चित रूप से मुझे ऊपर के रूप में एक ही त्रुटि देता है। इस बिंदु पर मैं फंस गया हूं।
प्रश्न
क्या कोई ऐसा तरीका है जिससे मैं डेटाबेस को पुनर्स्थापित कर सकता हूं और वह भी FileStreamContentFG
फ़ाइल समूह से सब कुछ बहाल कर सकता है ? या तो मैं ऊपर की कोशिश कर रहा हूँ के रूप में शून्य करने के लिए मूल्यों को अद्यतन करके, या फ़ाइल गायब है या कुछ और करने के लिए डिफ़ॉल्ट रूप से अशक्त करने के लिए?
या मैं शायद गलत तरीके से समस्या का सामना कर रहा हूं?
मैं स्वभाव से एक डेवलपर हूं और एक डीबीए के रूप में ज्यादा ज्ञान नहीं है, इसलिए मुझे बहाना करो अगर मैं यहां कुछ तुच्छ बात कर रहा हूं।