SQL 2017 TDE डेटाबेस में बैकअप संपीड़न का कारण भ्रष्टाचार


13

SQL Server 2017 (CU3) पर, जब भी मैं अपने TDE डेटाबेस में से किसी पर बैकअप संपीड़न सक्षम करता हूं, तो बैकअप प्रक्रिया हमेशा डेटाबेस में एक विशिष्ट पृष्ठ को दूषित करती है। अगर मैं कम्प्रेशन के बिना बैकअप चलाता हूं, तो यह दूषित नहीं होता है। इस समस्या को सत्यापित करने और पुन: पेश करने के लिए मैंने जो कदम उठाए हैं, वे हैं:

  1. डेटाबेस "TDE_DB1" पर DBCC चेकडीबी चलाएं; सब अच्छा है, कोई त्रुटि नहीं;
  2. संपीड़न के बिना सफलतापूर्वक डेटाबेस का बैकअप लें; बहुत अच्छी तरह से कहता है कि सब अच्छा है;
  3. डेटाबेस को "TDE_DB2" के रूप में सफलतापूर्वक पुनर्स्थापित करें; सब अच्छा है, DBCC CheckDB कोई त्रुटि नहीं दिखाता है;
  4. संपीड़न के साथ सफलतापूर्वक "TDE_DB1" डेटाबेस का बैकअप लें; "केवल बैकअप सेट का पता लगाने के लिए नुकसान" कहकर, मुख्य रूप से त्रुटियों को रोकें;
  5. डेटाबेस को "TDE_DB2" के रूप में पुनर्स्थापित करने का प्रयास करें; त्रुटियां, यह कहते हुए "डेटाबेस में पृष्ठ (1: 92454) पर त्रुटि का पता चला"
  6. दोहराएं चरण 1-3; सब अच्छा है;
  7. DROP "TDE_DB1" और "TDE_DB2"; बैकअप से "TDE_DB1" पुनर्स्थापित करें; सब अच्छा है;
  8. चरण 1-5 दोहराएं; समान परिणाम प्राप्त करें;

संक्षेप में: डेटाबेस और नियमित बैकअप ठीक लगता है, डेटाबेस पर CHECKDB चल रहा है और बैकअप पर VERIFYONLY किसी भी त्रुटि की रिपोर्ट नहीं करते हैं। संपीड़न के साथ डेटाबेस का बैकअप लेना भ्रष्टाचार का कारण बनता है।

नीचे त्रुटियों के साथ कोड नमूने हैं। (नोट: एक TDE डेटाबेस के साथ संपीड़न का उपयोग करने के लिए MAXTRANSFERSIZE आवश्यक है )

-- Good, completes with no corruption;
BACKUP DATABASE [TDE_DB1] TO DISK = N'E:\MSSQL\Backup\TDE_DB1a.bak' WITH CHECKSUM;
RESTORE VERIFYONLY FROM DISK = N'E:\MSSQL\Backup\TDE_DB1a.bak' WITH CHECKSUM;

RESTORE DATABASE [TDE_DB2]
FROM DISK = 'E:\MSSQL\Backup\TDE_DB1a.bak'
WITH MOVE 'DataFileName' to 'E:\MSSQL\Data\TDE_DB2.mdf'
,MOVE 'LogFileName' to 'F:\MSSQL\Log\TDE_DB2_log.ldf';


-- Bad, I haz corruption;
BACKUP DATABASE [TDE_DB1] TO DISK = N'E:\MSSQL\Backup\TDE_DB1b.bak' WITH CHECKSUM, COMPRESSION, MAXTRANSFERSIZE = 131072;
RESTORE VERIFYONLY FROM DISK = N'E:\MSSQL\Backup\TDE_DB1b.bak' WITH CHECKSUM;
-- ERROR
--Msg 3189, Level 16, State 1, Line 1
--Damage to the backup set was detected.
--Msg 3013, Level 16, State 1, Line 1
--VERIFY DATABASE is terminating abnormally.

RESTORE DATABASE [TDE_DB2]
FROM DISK = 'E:\MSSQL\Backup\TDE_DB1b.bak'
WITH MOVE 'DataFileName' to 'E:\MSSQL\Data\TDE_DB2.mdf'
,MOVE 'LogFileName' to 'F:\MSSQL\Log\TDE_DB2_log.ldf';
-- ERROR
--Msg 3183, Level 16, State 1, Line 7
--RESTORE detected an error on page (1:92454) in database "TDE_DB2" as read from the backup set.
--Msg 3013, Level 16, State 1, Line 7
--RESTORE DATABASE is terminating abnormally.

फिर मैंने उस पृष्ठ को जांचने की कोशिश की, जिसमें त्रुटि होने के रूप में रिपोर्ट किया गया है (यह हमेशा एक ही पृष्ठ है।), लेकिन DBCC पृष्ठ रिपोर्ट करता है कि ObjectId 0. है। पॉल रैंडल के इस लेख के अनुसार इसका मतलब है कि कोई मेटाडेटा नहीं मिला, और कारणों में से एक यह हो सकता है कि पृष्ठ ही भ्रष्ट है और मेटाडेटा को देखने का प्रयास करने के लिए गलत मानों का उपयोग किया गया था। उनकी सलाह है CHECKDB, जिसे मैं नहीं कर सकता क्योंकि भ्रष्ट बैकअप पुनर्स्थापित नहीं करेगा।

मैंने मेटाडेटा को रीसेट करने के लिए इस SO पोस्ट (INIT और FORMAT को BACKUP कमांड में जोड़ते हुए) से सुझावों की कोशिश की , लेकिन इससे कुछ भी नहीं बदला, मुझे अभी भी संकुचित बैकअप पर भ्रष्टाचार मिलता है।

यह केवल मेरे एक TDE डेटाबेस के साथ होता है। मेरे पास इसी सर्वर पर 4 अन्य TDE डेटाबेस हैं, और उन्हें यह समस्या नहीं है। यह मुझे बताता है कि इस विशिष्ट डेटाबेस के साथ एक अंतर्निहित समस्या हो सकती है। मुझे एहसास है कि आसान समाधान सिर्फ संपीड़न का उपयोग नहीं करना है, लेकिन मुझे ऐसा लगता है कि यह वास्तव में सड़क पर आने वाली बड़ी समस्या के लिए एक प्रारंभिक चेतावनी हो सकती है।

क्या किसी ने पहले कभी यह देखा है, या किसी को भी पता है कि संपीड़न उस पृष्ठ को भ्रष्ट क्यों करेगा? इस बिंदु पर, मैं आगे क्या करना है के रूप में नुकसान की तरह हूँ। मैंने पहले के बैकअप से पेज को पुनर्स्थापित करने पर विचार किया था, लेकिन मुझे नहीं लगता कि नियमित डेटाबेस में पेज ठीक होने के बाद से कोई फर्क नहीं पड़ता।

अद्यतन 1: नीचे विकल्प 0 के साथ DBCC पृष्ठ से परिणाम हैं:

DBCC निष्पादन पूरा। यदि डीबीसीसी ने त्रुटि का संदेश मुद्रित किया हैं, तो अपने सिस्टम व्यवस्थापक से संपर्क करें।

पेज: (1: 92454)

बफर:

BUF @ 0x000002187AE55640

bpage = 0x000002184865E000 bhash = 0x0000000000000000
bpageno = (1: 92454) bdbid = 8 breferences = 0 bcputicks = 563 bsampleCro = = 1
bUse1 = 51429 bstat = 0x809 ब्लॉग = 0x15a
bnagen = 0x80a ब्लॉग = bxb

पेज हैडर:

पेज @ 0x000002184865E000

m_pageId = (1: 92454) m_headerVersion = 111
m_type = 189 m_typeFlagBits = 0x2d m_level = 197
m_flagBits = 088525e m_objId (AllocUnitId.id.bd = = = = ==
7888158) IndexId = -1 मेटाडाटा: ObjectId = 0 m_prevPage = (32842: 1881351155) m_nextPage = (13086: -560562340)
pminlen = 36067 mslotCnt = 8149 m_freeCnt = 51871 m_freeData = 52971 =_297 = 5295 = = = = = = = = = = = = "=" = "=" = "#:" 14755
m_xdesId = (12811: 1559482793) m_ghostRecCnt =
12339 m_tornBits = -1381699202 DB Frag ID = 1

आवंटन की स्थिति

GAM (1: 2) = आवंटित SGAM (1: 3) = आवंटित नहीं किया गया
PFS (1: 88968) = 0x0 0_PCT_FULL DIFF (1: 6) = नहीं बदला गया
एमएल (1: 7) = नहीं MIN_LOGGED

यदि मैं अन्य विकल्पों के साथ DBCC पृष्ठ को चलाने की कोशिश करता हूं, तो मुझे निम्न त्रुटियां मिलती हैं:

विकल्प 1 के साथ DBCC पृष्ठ: Msg 0, स्तर 11, स्टेट 0, लाइन 0 वर्तमान कमांड पर एक गंभीर त्रुटि उत्पन्न हुई। यदि कोई परिणाम हैं, तो उनकी उपेक्षा की जानी चाहिए।

विकल्प 3 के साथ DBCC पृष्ठ: Msg 2514, स्तर 16, राज्य 5, लाइन 3 एक DBCC पृष्ठ त्रुटि हुई है: अमान्य पृष्ठ प्रकार - डंप शैली 3 संभव नहीं है।

अद्यतन 2: यहाँ sysinos_db_database_page_allocations DMO से कुछ परिणाम दिए गए हैं:

object_id = 75 index_id = 1 rowset_id = 281474981625856 allocation_unit_id = 281474981625856
allocation_unit_type = 1 allocation_unit_type_desc = IN_ROW_DATA extent_file_id = 1 extent_page_id = 92,448
allocated_page_iam_file_id = 1 allocated_page_iam_page_id = 104
allocated_page_file_id = 1 allocated_page_page_id = 92,454
is_allocated = 0 is_iam_page = 0 = 0 is_mixed_page_allocation

जवाबों:


8

ऐसा लगता है कि यह समस्या उन डेटाबेस के साथ है जिनके पास SHRINK ऑपरेशन चला है। मेरे मामले में, मैं SQL सर्वर 2014 पर हमारे उत्पादन डेटाबेस में से एक की प्रतिलिपि ले रहा था (जो पहले से ही TDE के साथ एन्क्रिप्टेड है), दोनों डेटा और लॉग फ़ाइलों पर DBCC SHRINKFILE को चला रहा है, फिर एक बैकअप ले रहा है और इसे मेरी SQL पर पुनर्स्थापित कर रहा है 2017 का सर्वर। (सिकुड़ने का कारण बैकअप को तेज़ी से स्थानांतरित करने के लिए आकार को कम करना था।)

एक परीक्षण के रूप में, मैंने उस डेटाबेस की एक प्रति को पुनर्स्थापित किया जिसे मैंने DBCC SHRINKFILE पर नहीं चलाया था, और बैकअप को संपीड़ित करते समय इसमें भ्रष्टाचार की समस्या नहीं थी।

इसलिए, संक्षेप में, मेरे परीक्षण के परिणाम निम्नानुसार हैं:

  • SQL 2017 में इस "सिकुड़े हुए" TDE डेटाबेस काम पर सामान्य बैकअप / पुनर्स्थापना संचालन
  • "सिकुड़ा हुआ" TDE डेटाबेस का बैकअप लेने से sys.sysmultiobrerere तालिका में भ्रष्टाचार का कारण लगता है
  • नियमित TDE डेटाबेस (DBCC SHRINKFILE रन नहीं होने) के बैकअप का अनुपालन सही ढंग से काम करता है और भ्रष्टाचार की रिपोर्ट नहीं करता है

मुझे नहीं पता कि यह SQL Server 2017 में एक पुष्ट बग है, लेकिन मैंने उनके निष्कर्षों को देखने के लिए Microsoft को अपने निष्कर्ष भेजे हैं।

तो, इस कहानी का नैतिक है: अपने शरीर को हिलाओ मत! कभी! :)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.