डेटाबेस SQL ​​Server 2012 को मिरर करने में असमर्थ


11

निम्नलिखित कमांड का उपयोग करके डेटाबेस को मिरर करने की कोशिश करते समय

ALTER AVAILABILITY GROUP SQLAlwaysonGroup ADD DATABASE test0916aj8CJ

मुझे निम्नलिखित त्रुटि मिलती है

Msg 1475, स्तर 16, राज्य 105, पंक्ति 1
डेटाबेस "test0916aj8CJ" में बल्क लॉग किए गए परिवर्तन हो सकते हैं जिनका बैकअप नहीं लिया गया है। प्रिंसिपल डेटाबेस या प्राइमरी डेटाबेस पर लॉग बैकअप लें। फिर इस बैकअप को मिरर डेटाबेस पर या तो डेटाबेस मिररिंग को सक्षम करने के लिए या हर सेकेंडरी डेटाबेस पर आपको उपलब्धता समूह में शामिल करने के लिए सक्षम करने के लिए पुनर्स्थापित करें।

क्या यह डेटाबेस का समर्थन किए बिना किया जा सकता है? या मुझे बैकअप लेना चाहिए और फिर बैकअप को छोड़ देना चाहिए। यह एक नए बनाए गए डीबी के लिए है, इसलिए मुझे इस बिंदु पर वैसे भी बैकअप की आवश्यकता नहीं है।

मैंने निम्नलिखित कोशिश की है ...

BACKUP
DATABASE [test0916aj8CJ] TO DISK = NNUL
WITH COPY_ONLY, NOFORMAT, INIT,
NAME = Ntest-Full Database Backup’,
SKIP, NOREWIND, NOUNLOAD
GO

लेकिन उपरोक्त विधि भी काम नहीं किया।

धन्यवाद


चीजों की जोड़ी ... आप वास्तव में उस आदेश के साथ नहीं बल्कि एक उपलब्धता समूह के लिए एक डेटाबेस जोड़ रहे हैं। जो तब मुझसे पूछता है कि आपका एजी कैसे सेटअप है, आपके डेटाबेस में कौन-सी रिकवरी मोड है, और क्यों, एक लॉग इश्यू को ठीक करने के लिए, आप एक COPY_ONLY बैकअप कर रहे हैं जो लॉग को बरकरार रखता है जो कि वह त्रुटि नहीं है जो आपको निर्दिष्ट कर रही है। ? यह मुझे लगता है कि आप कुछ कदम याद कर रहे हैं या आप क्या करने की कोशिश कर रहे हैं के बारे में बहुत उलझन में हैं।
स्टीव मैंगमेली

जवाबों:


15

आपके द्वारा प्राप्त की गई त्रुटि को पुन: उत्पन्न करना आसान है

  • प्राथमिक पर पूर्ण पुनर्प्राप्ति मोड में डेटाबेस बनाएं।
  • पूर्ण पुनर्प्राप्ति मोड में डेटाबेस बनाएँ माध्यमिक।
  • GUI लॉन्च करें और प्राथमिक और माध्यमिक के बीच मिररिंग कॉन्फ़िगर करने का प्रयास करें।

नीचे त्रुटि है जो आपको मिलेगी:

डेटाबेस "test_mirroring_kin" में ऐसे बल्क लॉग परिवर्तन हो सकते हैं जिनका बैकअप नहीं लिया गया है। प्रिंसिपल डेटाबेस या प्राइमरी डेटाबेस पर लॉग बैकअप लें। फिर इस बैकअप को मिरर डेटाबेस पर या तो डेटाबेस मिररिंग को सक्षम करने के लिए या हर सेकेंडरी डेटाबेस पर आपको उपलब्धता समूह में शामिल करने के लिए सक्षम करने के लिए पुनर्स्थापित करें। (Microsoft SQL सर्वर, त्रुटि: 1475)

यहाँ छवि विवरण दर्ज करें

आइए समझें कि वह त्रुटि क्या है:

आपने अपने डेटाबेस को पूर्ण पुनर्प्राप्ति मोड में कॉन्फ़िगर किया है और सोचते हैं कि डेटाबेस वास्तव में पूर्ण पुनर्प्राप्ति मोड में है।

उपरोक्त सत्य नहीं है। डेटाबेस बनाने के बाद, यदि आप एक फुल बैकअप नहीं करते हैं, भले ही डेटाबेस फुल रिकवरी मोड में है, यह छद्म SIMPLE रिकवरी में है

आप आसानी से इसे का उपयोग सत्यापित कर सकते हैं dbcc dbinfo> - dbi_dbbackupLSNका मूल्य होने 0:0:0(0x00000000:00000000:0000)या पॉल रैंडल के स्क्रिप्ट का उपयोग

dbcc traceon (3604)
go
dbcc dbinfo('test_mirroring_kin') with tableresults
go
dbcc traceoff (3604)

यहाँ छवि विवरण दर्ज करें

संपादित करें:COPY_ONLY विकल्प के साथ पहला पूर्ण बैकअप लेने पर भी बैकअप श्रृंखला स्थापित नहीं होती है

backup database test_mirroring_kin
to disk = 'D:\test_mirroring_kin_FULL.bak'
with init, stats=10, COPY_ONLY

dbcc dbinfo-> dbi_dbbackupLSNअभी भी मूल्य है 0:0:0(0x00000000:00000000:0000)। इसका मतलब है कि डेटाबेस अभी भी छद्म सरल रिकवरी मोड में है।

उपरोक्त त्रुटि को हल करने के लिए आपको क्या करने की आवश्यकता है?

आपको प्राथमिक पर एक पूर्ण बैकअप + एक लेन-देन लॉग बैकअप लेने की आवश्यकता है और फिर इसे द्वितीयक डेटाबेस पर पुनर्स्थापित करें with norecoveryऔर फिर एजी समूह या मिररिंग में डेटाबेस में शामिल हों।

एक साइड नोट के रूप में और पूर्णता के लिए, आपकी स्क्रिप्ट बताने के लिए backup to NUL, गेल शॉ द्वारा इस ब्लॉग पोस्ट को पढ़ें।


5

क्यों TO DISK = N’NUL’?

मुझे समझ नहीं आ रहा है कि आप क्यों इस्तेमाल कर रहे हैं TO DISK = N’NUL’:

BACKUP
DATABASE [test0916aj8CJ] TO DISK = NNUL

यदि आप ऐसा करते हैं, तो बैकअप NUL(यानी = कहीं नहीं / कुछ भी) में सहेजा जाता है और इसका उपयोग नहीं किया जा सकता क्योंकि इसकी फ़ाइल मौजूद नहीं है।

जबकि NULलॉग बैकअप के लिए एक गंतव्य के रूप में भी इस्तेमाल किया जा सकता है, इसका उपयोग या तो नहीं किया जाना चाहिए, विशेष रूप से उत्पाद सर्वर पर क्योंकि लॉग खो जाएगा और बैकअप श्रृंखला टूट जाएगी। (~ समान SHRINKFILE)

लॉग बैकअप

समूह में DB जोड़ने से पहले, आपको इसे तैयार करना होगा। जब आप एक द्वितीयक DB तैयार करना चाहते हैं, तो कम से कम 1 ट्रांजेक्शन लॉग बैकअप लिया जाना चाहिए और पुनर्स्थापित किया जाना चाहिए। दर्पण इसका उपयोग यह पता लगाने के लिए करता है कि कौन से लेन-देन पहले से ही द्वितीयक डीबी पर सिंक किए गए हैं और कौन से लेनदेन अभी प्राथमिक डीबी के साथ सिंक में नहीं हैं।

इसलिए आपको प्राथमिक DB पर लेनदेन लॉग का बैकअप लेना चाहिए:

BACKUP LOG [test0916aj8CJ] TO  DISK = N'....bak' 
WITH  COPY_ONLY, FORMAT, INIT,  NAME = N'test0916aj8CJ-Transaction Log  Backup', STATS = 10

COPY_ONLYविकल्प इस्तेमाल किया जाना चाहिए। यह सुनिश्चित करता है कि लॉग बैकअप के अंत में लॉग्स को छोटा नहीं किया गया है।

प्राथमिक DB बैकअप श्रृंखला

हालाँकि, आप केवल एक लॉग बैकअप को पुनर्स्थापित नहीं कर सकते हैं, जिसका अर्थ है एक बैकअप श्रृंखला के बिना (परि का उत्तर भी देखें)। इसका मतलब यह है कि एक पूर्ण डेटाबेस बैकअप (+ यदि आवश्यक हो तो एक वैकल्पिक अंतर) के बाद लेनदेन लॉग बैकअप लिया जाना चाहिए।

चूंकि COPY_ONLYविकल्प बैकअप श्रृंखला को नहीं तोड़ता है, इसलिए यह बैकअप श्रृंखला भी नहीं बनाता है। COPY_ONLYविकल्प डाटाबेस बैकअप के लिए इस्तेमाल नहीं किया जा सकता।

बैकअप क्रम में:

  • COPY_ONLYविकल्प के बिना पूर्ण डेटाबेस बैकअप
  • वैकल्पिक अंतर बैकअप
  • COPY_ONLYविकल्प के साथ 1 लॉग बैकअप
  • यदि आवश्यक हो तो एक और (या अधिक) लॉग बैकअप ...

द्वितीयक DB को पुनर्स्थापित करें

फिर डेटाबेस बैकअप को द्वितीयक पर (+ विभेदक) पुनर्स्थापित किया जाना चाहिए।

यह NORECOVERYविकल्प के साथ बहाल किया जाना चाहिए क्योंकि आप FULL बैकअप को पुनर्स्थापित करने के बाद लॉग बैकअप (ओं) को भी पुनर्स्थापित करना चाहते हैं।

अंतिम रूप से आप लॉग बैकअप को पुनर्स्थापित करेंगे। आपको अभी भी NORECOVERYविकल्प का उपयोग करने की आवश्यकता है क्योंकि दर्पण एक बार लेनदेन को बहाल रखेगा।

  • NORECOVERYविकल्प के साथ पूर्ण बैकअप पुनर्स्थापित करें
  • NORECOVERYविकल्प के साथ DIFF बैकअप पुनर्स्थापित करें
  • NORECOVERYविकल्प के क्रम में सभी लॉग बैकअप पुनर्स्थापित करें

यह सब एक साथ डाल देता है (अपने env के लिए अनुकूल करें)

  • प्राथमिक सर्वर रन पर:

    USE master
    Go
    BACKUP DATABASE [test0916aj8CJ] TO DISK = N'....bak'
    WITH FORMAT, INIT, NAME = N'test0916aj8CJ-Full Database Backup', STATS = 10
    GO
    BACKUP LOG [test0916aj8CJ] TO DISK = N'....bak' 
    WITH COPY_ONLY, FORMAT, INIT, NAME = N'test0916aj8CJ-Transaction Log Backup', STATS = 10
    GO
    
  • द्वितीयक सर्वर रन पर:

    USE master
    Go
    RESTORE DATABASE [test0916aj8CJ] FROM DISK = N'....bak' 
    WITH FILE = 1, NORECOVERY, NOUNLOAD, REPLACE, STATS = 10
    GO
    RESTORE LOG [test0916aj8CJ] FROM DISK = N'....bak' 
    WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
    
  • फिर आप लाभ समूह में नए माध्यमिक DB को जोड़ने के साथ आगे बढ़ सकते हैं ...

वैकल्पिक क्रियाएं

  • DISK विकल्प को एक साझा फ़ोल्डर में सेट करना बेहतर है जो प्राथमिक और द्वितीयक दोनों सर्वरों से उपलब्ध है।
  • प्राथमिक और माध्यमिक सर्वर दोनों पर समान डिस्क और स्थान पर DB फ़ाइलों को संग्रहीत करना भी बेहतर है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.