ฉันจะกู้คืนบันทึกธุรกรรมเป็นชุดมากกว่าหนึ่งต่อหนึ่งได้อย่างไร


12

ฉันมีฐานข้อมูล SQL Server ที่สำรองข้อมูลบันทึกธุรกรรมทุก 10 นาทีด้วยการสำรองข้อมูลเต็มรูปแบบข้ามคืน

ใช้สตูดิโอการจัดการ SQL 2008 เราดูเหมือนจะต้องเลือกแต่ละรายการบันทึกหนึ่งโดยหนึ่ง มีวิธีการชี้ไปที่ไดเรกทอรีใด ๆ

ฉันกำลังพิจารณาที่จะทำการสำรองข้อมูลที่แตกต่างกันหลายครั้งต่อวันซึ่งอาจชดเชยบางส่วนได้ แต่การทำทีละไฟล์ผ่านหลายสิบ / หลายร้อยไฟล์ดูเหมือนจะใช้เวลาค่อนข้างนาน การเขียนโค้ดเพื่อพยายามเขียนสคริปต์ดูเหมือนจะไม่เป็นไปตามที่คาดหวังจากความสามารถหลักของเรา

หาก Studio จัดการเซิร์ฟเวอร์ SQL ไม่มีวิธีที่เร็วกว่าอาจมีเครื่องมือของบุคคลที่สามหรือไม่


ใช่ถ้ากลไกที่เป็นไปได้ทั้งหมดไม่ทำงานก็ควรใช้ความช่วยเหลือจากเครื่องมือบันทึกการกู้คืนของ SQL sqlserverlogexplorer.com/restore
Jason Clark

คำตอบ:


11

ไม่มีวิธีระบุเครือข่ายสำรองข้อมูลบันทึกรายการ (โฟลเดอร์oк) เพื่อกู้คืนในสตูดิโอจัดการเซิร์ฟเวอร์ SQL

แต่คุณสามารถค้นหาข้อมูลทั้งหมดเกี่ยวกับการสำรองข้อมูล SQL Server ในฐานข้อมูล MSDB (ชุดแบ็คอัพตารางและอื่น ๆ ที่เกี่ยวข้อง)

นี่คือสคริปต์เพื่อสร้างคำสั่ง SQL Server สำหรับกู้คืนฐานข้อมูลจากการสำรองข้อมูลและใช้การสำรองข้อมูลบันทึกธุรกรรมทั้งหมดที่ดำเนินการจากการสำรองฐานข้อมูลเต็มรูปแบบล่าสุด ฉันคิดว่ามันจะช่วยคุณได้

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/…
Andrew Savinykh

@sergey: คุณควรสคริปต์แอตทริบิวต์ที่คุณยกจากเว็บ! : mssqltips.com/sqlservertip/1243/…
Mitch Wheat

5

นี่คือตัวอย่างเกี่ยวกับวิธีที่คุณสามารถสร้างสคริปต์การคืนค่า SQL Server โดยอัตโนมัติจากไฟล์สำรองข้อมูลในไดเรกทอรีโดยใช้ TSQL:

สร้างสคริปต์การคืนค่าเซิร์ฟเวอร์ SQL โดยอัตโนมัติจากไฟล์สำรองข้อมูลในไดเรกทอรี

สร้างสคริปต์การคืนค่าฐานข้อมูล SQL Server โดยอัตโนมัติ


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

เมื่อสร้าง SQL ขึ้นมาแล้วคุณต้องตรวจสอบดูให้ถูกต้องแล้วเปิดใช้งาน


1

ฉันไม่ต้องการใช้วิธีที่อิงกับ SQL ของคำตอบที่ยอมรับเพราะฉันไม่ต้องการเปิดใช้งานกระบวนงานที่เก็บแบบขยาย ดังนั้นฉันจึงเขียนสคริปต์ PowerShell เพื่อทำมัน

คุณชี้ไปที่โฟลเดอร์และจะสร้างสคริปต์ตามการสำรองข้อมูลเต็มรูปแบบล่าสุดและการสำรองข้อมูลบันทึกธุรกรรมที่ตามมาทั้งหมด

    [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

    }

ขอบคุณ! คุณเพิ่งบันทึกเบคอนของฉันจากไฟร้อนแรง ... msdb เสียหายดังนั้นจึงต้องกู้คืนจากการสำรองข้อมูลและไม่มีข้อมูลบันทึกของโซ่ สคริปต์ของคุณช่วยให้ฉันไม่ต้องสร้างสคริปต์กู้คืนบันทึกธุรกรรมด้วยมือตามชื่อไฟล์!
agrath

ถ้าคุณต้องการฐานข้อมูลเดียวและบันทึกธุรกรรมทั้งหมด คุณต้องการเปลี่ยนอะไรในสคริปต์
user493592

นั่นคือสิ่งที่มันทำ ฐานข้อมูลเดียว (ล่าสุด) และบันทึกธุรกรรมทั้งหมดตั้งแต่นั้นมา ไม่มีประเด็นที่จะดูบันทึกธุรกรรมก่อนการสำรองข้อมูลเต็มรูปแบบ
Ben Curthoys
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.