DIFFs ने FULL को बढ़ावा दिया

Nov 06 2020

हम DatabaseBackupSQL सर्वर 2012 आवृत्ति पर Azure बूँद संग्रहण में SharePoint डेटाबेस का लोड बैकअप करने के लिए Ola Hallengren की संग्रहीत कार्यविधि का उपयोग करते हैं। हम बिना किसी मुद्दे के काफी समय से ऐसा कर रहे हैं। हालाँकि, पिछले 6 हफ्तों से हमारा DIFFsबेतरतीब ढंग से प्रचार किया जा रहा है FULLऔर हम इसका पता नहीं लगा सकते हैं।

यह एजेंट स्टेप से आउटपुट है

BACKUP DATABASE [Database] TO URL = N'https://strorgage.blob.core.windows.net/server/instance/Database/2020/11/diff/Database_FULL_20201105_200000.bak' 
WITH NO_CHECKSUM, COMPRESSION, CREDENTIAL = N'*storeageaccountname*'

यदि आप जेनरेट किए गए URL पर एक नज़र रखते हैं, तो आप ध्यान देंगे कि प्रक्रियाएँ DIFF निर्देशिका में संग्रहीत हो रही हैं, लेकिन पूर्ण बैकअप फ़ाइल बना रही हैं।

https://strorgage.blob.core.windows.net/server/instance/Database/2020/11/diff/Database_FULL_20201105_200000.bak
                                                                        --^           --^

DatabaseBackup (Ola proc) 2019-06-14 से है इसलिए इसे निष्पक्ष होने के लिए अपग्रेड की जरूरत है, लेकिन इसने 18 महीनों तक अच्छा काम किया है।

हम ओला कोड को सीधे नहीं कहते हैं क्योंकि हमारे पास एक छोटा आवरण प्रक्रिया है जो एज़्योर के लिए वर्चुअल पथ नाम बनाता है, लेकिन अनिवार्य रूप से यह है कि हम ओला के कोड को कैसे कहते हैं।

यह एक अज्ञात कारण है कि कुछ अज्ञात कारण से डीआईएफएफ बैकअप को फुल में बढ़ावा दिया जा रहा है, यह हर दिन गीगाबाइट के बजाय एज़्योर बूँद बैकअप के पेटाबाइट्स का कारण बनता है।

EXECUTE dbo.DatabaseBackup
    @Database = @DatabaseName,
    @URL = @BackupPath,
    @Credential = @StorageAccount,
    @BackupType = @backupType,
    @Compress = @Compression,
    @LogToTable = 'Y',
    @ChangeBackupType = 'Y',
    @Updateability = @DatabaseReadOnlyState,
    @DirectoryStructure = NULL,
    @AvailabilityGroupDirectoryStructure = NULL

क्या आपके पास उस पर कोई विचार है?

जवाब

6 alroc Nov 09 2020 at 23:00

आप कहते हैं कि डीआईएफएफ टू फुल बैकअप का यह प्रचार "रैंडम" है, लेकिन मैं चाहता हूं कि आप इस गतिविधि और डेटा मंथन (या इंडेक्स मेंटेनेंस) के बीच एक कनेक्शन डेटाबेस में ही पा सकें।

क्योंकि आप उपयोग कर रहे हैं ChangeBackupType='Y', इसलिए बैकअप नौकरी sysinos_db_file_space_usage पर देख रही है कि डेटाबेस में से कितना बदल गया है, और यदि यह एक सीमा से अधिक है तो पूर्ण बैकअप करता है (मुझे कठिनाई हो रही है कि स्रोत कोड से डिफ़ॉल्ट रूप से समझदारी हो ) का है। आप ModificationLevelपैरामीटर को समायोजित करके उस सीमा को बदल सकते हैं , जो एक प्रतिशत है। से प्रलेखन


जब एक विभेदक बैकअप को पूर्ण बैकअप में बदल दिया जाएगा, तब संशोधन एक प्रतिशत निर्दिष्ट करें। इस विकल्प का उपयोग केवल @ChangeBackupType = 'Y' के साथ किया जा सकता है। DatabaseBackup, आवंटित किए गए डेटाबेस की कितनी गणना करता है, इसकी गणना करने के लिए sysinos_db_file_space_usage में आवंटित_extent_page_count और संशोधित_extent_page_count चेक करता है।

3 JohnK.N. Nov 10 2020 at 00:32

परिचय

अपने कोड को देखते हुए, यह है कि आप पहले से ही उपयोग कर रहे हैं लगता है @ChangeBackupTypeपैरामीटर ओला उसकी में प्रदान की एसक्यूएल सर्वर रखरखाव समाधान के लिए DatabaseBackup संग्रहीत प्रक्रिया। इस पैरामीटर का प्रलेखन निम्नलिखित जानकारी प्रदान करता है:

DatabaseBackup चेकों differential_base_lsnमें sys.master_filesनिर्धारित करने के लिए एक विभेदक बैकअप प्रदर्शन किया जा सकता है या नहीं। यदि अंतर बैकअप संभव नहीं है, तो डेटाबेस डिफ़ॉल्ट रूप से छोड़ दिया जाता है। वैकल्पिक रूप से, आप ChangeBackupType को Y के बजाय पूर्ण बैकअप के लिए सेट कर सकते हैं।

प्रासंगिक ... और ...

DatabaseBackup यह निर्धारित करने के लिए जांच करता last_log_backup_lsnहै sys.database_recovery_statusकि पूर्ण या बल्क-लॉग रिकवरी मॉडल में एक लेनदेन लॉग बैकअप किया जा सकता है या नहीं। यदि लेन-देन लॉग बैकअप संभव नहीं है, तो डेटाबेस डिफ़ॉल्ट रूप से छोड़ दिया जाता है। वैकल्पिक रूप से, आप ChangeBackupType को Y के बजाय अंतर या पूर्ण बैकअप के लिए सेट कर सकते हैं।

संबद्ध नहीं

संदर्भ: DatabaseBackup (ola.hallengren.com)

कल्पना

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

हालाँकि

... कुछ SharePoint डेटाबेस को इस तरह से बदल रहा है, ओला की प्रक्रिया यह मान रही है कि डेटाबेस को एक पूर्ण बैकअप की आवश्यकता है। ओला विभिन्न स्थितियों की जांच करता है, जिनमें से एक पैरामीटर पर आधारित है ...।

संशोधन

@ModificationLevelपहला पैरामीटर @ChangeBackupType = 'Y'सेट होने पर अतिरिक्त पैरामीटर है जो DIFF बैकअप को पूर्ण बैकअप में बदल देगा । ओला के कोड को देखते हुए हमें यह प्रदान करता है:

  IF @ModificationLevel IS NOT NULL AND @BackupType <> 'DIFF'
  BEGIN
    INSERT INTO @Errors ([Message], Severity, [State])
    SELECT 'The value for the parameter @ModificationLevel is not supported.', 16, 3
  END

इसका मतलब है कि यदि पैरामीटर @ModifcationLevelएक मान @ChangeBackupTypeपर सेट है और Yउसके लिए सेट है , तो बैकअप प्रक्रिया DIFF बैकअप को पूर्ण बैकअप में बदल देगी यदि पृष्ठों की मात्रा बदल जाती है तो मामला बदल जाता है

क्योंकि आपने @ModificationLevelयह निर्धारित नहीं NULLकिया है कि ओला के कोड में देखा जा सकता है:

@ModificationLevel int = NULL,

यह आपकी स्थिति में ऐसा प्रतीत नहीं होता, जब तक कि आपके पैरामीटर्स का मूल्य @ModificationLevelनहीं है NULL

समाधान 1

किस मामले में, हमने दोषी पाया है। @ModificationLevelवापस करने के लिए मान बदलें NULLऔर सब कुछ ठीक है।

आगे रूपांतरण के कारण

एक अन्य कारण बैकअप से बदल जाएगा DIFFकरने के लिए FULLपैरामीटर है @ChangeBackupTypeही।

विवरण (ऊपर से) इस प्रकार लिखा गया था:

DatabaseBackup (प्रक्रिया) एक अंतर बैकअप प्रदर्शन किया जा सकता है या नहीं यह निर्धारित करने के लिए जाँच करता differential_base_lsnहै sys.master_files। यदि अंतर बैकअप संभव नहीं है, तो डेटाबेस डिफ़ॉल्ट रूप से छोड़ दिया जाता है। वैकल्पिक रूप से, आप ChangeBackupType को Y के बजाय पूर्ण बैकअप के लिए सेट कर सकते हैं।

कोड को चेज करना

ओला ने इसे कोड में लिखा है:

SELECT @CurrentDifferentialBaseLSN = differential_base_lsn
FROM sys.master_files
WHERE database_id = DB_ID(@CurrentDatabaseName)
AND [type] = 0
AND [file_id] = 1

और यह हिस्सा यहाँ है:

   IF @CurrentBackupType = 'DIFF'
    BEGIN
      SELECT @CurrentDifferentialBaseIsSnapshot = is_snapshot
      FROM msdb.dbo.backupset
      WHERE database_name = @CurrentDatabaseName
      AND [type] = 'D'
      AND checkpoint_lsn = @CurrentDifferentialBaseLSN
    END

    IF @ChangeBackupType = 'Y'
    BEGIN
      IF @CurrentBackupType = 'DIFF' AND @CurrentDifferentialBaseIsSnapshot = 1
      BEGIN
        SET @CurrentBackupType = 'FULL'
      END
    END;

इसका क्या मतलब है?

ओला के कोड का अनुवाद करना

वैसे यह इस तरह से थोड़ा पढ़ता है:

  1. differntial_base_lsnवर्तमान डेटाबेस के लिए मान प्राप्त करें

  2. यदि बैकअप प्रकार DIFF है तो ...

    • वर्तमान डेटाबेस के लिए तालिका is_snapshotमें कॉलम को पढ़ें और बैकअप है (डेटाबेस बैकअप)msdb.dbo.backupset@CurrentDifferentialBaseLSNtypeD
    • अगर
      • @ChanageBackupType is य` और
      • @CurrentBackupType `डिफ और है
      • @CurrentDifferentialBaseIsSnapshot है 1
    • फिर
      • को सेट @CurrentBackupTypeकरेंFULL

यहाँ आप एक संभावित स्थिति है ...

समाधान २

... यदि आपका डेटाबेस किसी तीसरे पक्ष के समाधान (CommVault, NetApp, et। al।) द्वारा समर्थित था, तो 3-rd पार्टी समाधान ने SQL सर्वर VSS लेखक सेवा का उपयोग करके एक वैध और सुसंगत डेटाबेस बैकअप बनाया होगा, जो में एक नोट करेगा msdb.dbo.backupsetकि डेटाबेस की एक स्नैपशॉट कॉपी ली गई थी, जो is_snapshotउस डेटाबेस के लिए दिए गए पैरामीटर को निर्धारित करता है, differntial_base_lsnजिस पर आपका DIFF आधारित होगा।

इसकी वजह से आप जो DIFF बैकअप लेने का प्रयास कर रहे हैं, वह is_snapshotबैकअप पर आधारित नहीं रह सकता है is_snapshotऔर differntial_base_lsnमान और रीसेट करने के लिए और भविष्य के DIFF बैकअप के लिए एक नया आधार बनाने के लिए फिर से एक नया FULL बैकअप बनाना होगा ।

अन्य बैकअप का पता लगाएं

आपको यह निर्धारित करना होगा कि कौन सा 3-पार्टी (या अन्य बैकअप समाधान) आपके कार्यान्वित सॉल्यूशन के साथ ध्यान कर रहा है और यह सुनिश्चित करता है कि वे या तो हैं ...

  1. सह-अस्तित्व में संशोधित
  2. एक बैकअप समाधान के लिए कम से कम।