[server] 하나씩 트랜잭션 로그를 일괄 적으로 복원하는 방법

밤새 전체 백업으로 10 분마다 트랜잭션 로그를 백업하는 SQL Server 데이터베이스가 있습니다.

SQL 2008 Management Studio를 사용하면 각 트랜잭션 로그를 하나씩 선택해야합니다. 디렉토리를 가리킬 방법이 있습니까?

하루에 여러 번 차등 백업을 실행하는 것을 고려하고 있는데,이 중 일부는 상쇄 될 수 있지만 수십 / 수백 개의 파일을 하나씩 실행하는 데 시간이 많이 걸리는 것 같습니다. 스크립트 작성을위한 코드 작성은 핵심 역량과는 거리가 멀다.

SQL Server Management Studio가 더 빠른 방법이 없다면 타사 도구가 있습니까?



답변

SQL Server Management Studio에서 복원 할 트랜잭션 로그 백업 (oк 폴더)을 지정하는 방법은 없습니다.

그러나 데이터베이스 MSDB (테이블 백업 세트 및 관련)에서 SQL Server 백업 작업에 대한 모든 정보를 찾을 수 있습니다.

다음은 백업에서 데이터베이스를 복원하고 마지막 전체 데이터베이스 백업에서 수행 된 모든 트랜잭션 로그 백업을 적용하기위한 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


답변

다음은 TSQL을 사용하여 디렉토리의 백업 파일에서 SQL Server 복원 스크립트를 자동 생성하는 방법에 대한 예입니다.

디렉토리의 백업 파일에서 SQL Server 복원 스크립트 자동 생성

SQL Server 데이터베이스 복원 스크립트 자동 생성


답변

다음과 같은 SQL 문 목록이 필요합니다 …

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

따라서 주어진 폴더에서이 SQL을 쉽게 생성하는 VB 스크립트를 만들 수 있습니다. 다음은 http://blogs.lessthandot.com/index.php/DataMgmt/DBAdmin/MSSQLServerAdmin/restoring-multiple-transaction-log-backu 예입니다.

일단 SQL을 생성하면 제대로 보이는지 확인하고 실행하면됩니다.


답변

확장 저장 프로 시저를 활성화하고 싶지 않기 때문에 허용되는 답변의 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

    }


답변