मैं एक-एक करके लेन-देन लॉग के एक बैच को कैसे पुनर्स्थापित करूं


12

मेरे पास एक SQL सर्वर डेटाबेस है जो हर 10 मिनट में लेन-देन लॉग का बैकअप देता है, रात भर के बैकअप के साथ।

SQL 2008 प्रबंधन स्टूडियो का उपयोग करके हमें लगता है कि प्रत्येक लेनदेन को एक-एक करके लॉग इन करना है। क्या किसी निर्देशिका में इसे इंगित करने का कोई तरीका है?

मैं दिन में कई बार डिफरेंशियल बैकअप चलाने पर विचार कर रहा हूं, जिसमें कुछ की भरपाई हो सकती है, लेकिन दर्जनों / सैकड़ों फाइलों के माध्यम से एक-एक करके जाना काफी समय लेने वाला लगता है। स्क्रिप्ट के लिए प्रयास करने के लिए कोड लिखना यह हमारी मुख्य दक्षताओं से बहुत दूर का विषय लगता है।

यदि SQL सर्वर प्रबंधन स्टूडियो के पास तेज़ तरीका नहीं है, तो शायद कोई तृतीय पक्ष उपकरण उपलब्ध है?


हां, यदि सभी संभावित तंत्र काम नहीं करते हैं, तो SQL लॉग रिकवरी टूल sqlserverlogexplorer.com/restore
जेसन क्लार्क

जवाबों:


11

SQL सर्वर प्रबंधन स्टूडियो में पुनर्स्थापित करने के लिए लेन-देन लॉग बैकअप (oк फ़ोल्डर) का गुच्छा निर्दिष्ट करने का कोई तरीका नहीं है।

लेकिन आप डेटाबेस MSDB (तालिका बैकअप और संबंधित) में SQL सर्वर बैकअप संचालन के बारे में सभी जानकारी पा सकते हैं।

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

DECLARE @databaseName sysname
DECLARE @backupStartDate datetime
DECLARE @backup_set_id_start INT
DECLARE @backup_set_id_end INT

-- set database to be used
SET @databaseName = '<your_database_name_here>' 

SELECT @backup_set_id_start = MAX(backup_set_id) 
FROM  msdb.dbo.backupset 
WHERE database_name = @databaseName AND type = 'D'

SELECT @backup_set_id_end = MIN(backup_set_id) 
FROM  msdb.dbo.backupset 
WHERE database_name = @databaseName AND type = 'D'
AND backup_set_id > @backup_set_id_start

IF @backup_set_id_end IS NULL SET @backup_set_id_end = 999999999

SELECT backup_set_id, 'RESTORE DATABASE ' + @databaseName + ' FROM DISK = ''' 
               + mf.physical_device_name + ''' WITH NORECOVERY'
FROM    msdb.dbo.backupset b,
           msdb.dbo.backupmediafamily mf
WHERE    b.media_set_id = mf.media_set_id
           AND b.database_name = @databaseName
          AND b.backup_set_id = @backup_set_id_start
UNION
SELECT backup_set_id, 'RESTORE LOG ' + @databaseName + ' FROM DISK = ''' 
               + mf.physical_device_name + ''' WITH NORECOVERY'
FROM    msdb.dbo.backupset b,
           msdb.dbo.backupmediafamily mf
WHERE    b.media_set_id = mf.media_set_id
           AND b.database_name = @databaseName
          AND b.backup_set_id >= @backup_set_id_start AND b.backup_set_id < @backup_set_id_end
          AND b.type = 'L'
UNION
SELECT 999999999 AS backup_set_id, 'RESTORE DATABASE ' + @databaseName + ' WITH RECOVERY'
ORDER BY backup_set_id

1
यदि आप इस स्क्रिप्ट को मूल सर्वर पर चला सकते हैं लेकिन किसी अन्य सर्वर पर पुनर्स्थापित करना चाहते हैं तो वास्तव में बहुत अच्छा काम करता है!
realMarkusSchmidt

2
स्क्रिप्ट से आता है mssqltips.com/sqlservertip/1243/...
एंड्रयू Savinykh

@sergey: आपको उन लिपियों का श्रेय देना चाहिए जिन्हें आप वेब से उठाते हैं! : mssqltips.com/sqlservertip/1243/…
मिच गेहूं

5

यहां एक उदाहरण दिया गया है कि कैसे आप SQL सर्वर को TSQL का उपयोग करके निर्देशिका में बैकअप फ़ाइलों से स्क्रिप्ट को पुनर्स्थापित कर सकते हैं।

ऑटो एक निर्देशिका में बैकअप फ़ाइलों से एसक्यूएल सर्वर पुनर्स्थापना स्क्रिप्ट उत्पन्न करते हैं

ऑटो उत्पन्न SQL सर्वर डेटाबेस स्क्रिप्ट को बहाल


4

आपको बस sql कथनों की सूची की आवश्यकता है ...

RESTORE LOG AdventureWorks FROM DISK = 'C:\AdventureWorks_1.TRN' WITH NORECOVERY
GO
RESTORE LOG AdventureWorks FROM DISK = 'C:\AdventureWorks_2.TRN'
GO

तो आप एक VB स्क्रिप्ट बना सकते हैं जो आपके लिए दिए गए फोल्डर से इस SQL ​​को आसानी से जेनरेट करता है। यहाँ एक उदाहरण है http://blogs.lessthandot.com/index.php/DataMgmt/DBAdmin/MSSQLServerAdmin/restoring-multiple-transaction-log-backu

एक बार जब यह एसक्यूएल बन जाता है तो आपको बस यह जांचना होगा कि यह सही दिखता है और इसे चलाएं।


1

मैं स्वीकृत उत्तर के SQL आधारित दृष्टिकोण का उपयोग नहीं करना चाहता था, क्योंकि मैं विस्तारित संग्रहीत प्रक्रियाओं को सक्षम नहीं करना चाहता था। इसलिए मैंने इसे करने के लिए एक पॉवरशेल स्क्रिप्ट लिखी।

आप इसे एक फ़ोल्डर में इंगित करते हैं, और यह हाल ही में पूर्ण बैकअप, और बाद के सभी लेन-देन लॉग बैकअप के आधार पर एक स्क्रिप्ट उत्पन्न करता है।

    [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")

    $foldername = New-Object System.Windows.Forms.FolderBrowserDialog
    $foldername.rootfolder = "MyComputer"
    $foldername.ShowNewFolderButton = $false
    $foldername.SelectedPath = "E:\DatabaseBackups"

    if($foldername.ShowDialog() -eq "OK") {
        $backupPath = Get-Item($foldername.SelectedPath)    
        $databaseName = $backupPath.Name

        Write-Host($backupPath)
        Write-Host($databaseName)

        $transactionLogFiles = New-Object System.Collections.ArrayList;
        $outputFile = "Restore Database - Script.sql"
        $backupFile;


        foreach ($file in  get-childitem ($backupPath) | sort-object LastWriteTime -descending)
        {
            if ($file.Extension -eq '.trn')
            {
                [void]$transactionLogFiles.Add($file);
            }
            elseif ($file.Extension -eq '.bak')
            {
                $backupFile = $file;
                break;
            }
        }


        Set-Content $outputFile ""

        Add-Content $outputFile "USE master"
        Add-Content $outputFile "ALTER DATABASE $databaseName SET SINGLE_USER WITH ROLLBACK AFTER 5"
        Add-Content $outputFile "RESTORE DATABASE $databaseName FROM DISK = '$($backupFile.FullName)' WITH NORECOVERY";

        foreach ($file in $transactionLogFiles | sort-object LastWriteTime)
        {
            Add-Content $outputFile "RESTORE LOG $databaseName FROM DISK = '$($file.FullName)' WITH NORECOVERY";    
        }

        Add-Content $outputFile "RESTORE DATABASE $databaseName WITH RECOVERY";
        Add-Content $outputFile "ALTER DATABASE $databaseName SET MULTI_USER";
        Add-Content $outputFile "USE $databaseName" 

        Write-Host("Script generated at $outputFile");
        Write-Host "Press any key to continue ..."
        $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
        Invoke-Item $outputFile

    }

धन्यवाद! आपने अभी-अभी मेरी बेकन को तेज गर्म आग से बचाया ... एमएसडीबी भ्रष्ट था इसलिए बैकअप से बहाल करना पड़ा और लॉग चेन की जानकारी नहीं थी। आपकी स्क्रिप्ट ने मुझे फ़ाइल नाम के आधार पर लेनदेन लॉग पुनर्स्थापना स्क्रिप्ट बनाने से बचाया!
अग्रनाथ

क्या होगा अगर आप सिर्फ एक डेटाबेस और सभी लेन-देन लॉग चाहते हैं? आपको स्क्रिप्ट में क्या बदलाव करने की आवश्यकता होगी?
user493592

वही करता है। तब से एक डेटाबेस (सबसे हाल का) और सभी लेनदेन लॉग होते हैं। पूर्ण बैकअप से पहले लेनदेन लॉग को देखने का कोई मतलब नहीं है।
बेन करथॉयस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.