Как восстановить пакет журналов транзакций, а не один за другим?

11

У меня есть база данных SQL Server, которая создает резервные копии журналов транзакций каждые 10 минут с полным резервным копированием в течение ночи.

Используя SQL 2008 Management studio, мы, похоже, должны выбирать каждый журнал транзакций один за другим. Есть ли способ указать его на каталог?

Я планирую запускать разностное резервное копирование несколько раз в день, что может компенсировать некоторые из них, но просмотр одного за другим десятков / сотен файлов кажется довольно трудоемким. Написание кода для написания сценариев кажется слишком далеким от нашей основной компетенции.

Если в SQL Server Management Studio нет более быстрого способа, возможно, имеется сторонний инструмент?

aSkywalker
источник
да, если не работает весь возможный механизм, лучше обратиться за помощью к средству восстановления журналов SQL sqlserverlogexplorer.com/restore
Джейсон Кларк,

Ответы:

10

Невозможно указать набор резервных копий журнала транзакций (папка ok) для восстановления в SQL Server Management Studio.

Но вы можете найти всю информацию об операциях резервного копирования 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/…
Андрей Савиных
@sergey: вы должны указывать скрипты, которые вы извлекаете из Интернета! : mssqltips.com/sqlservertip/1243/…
Mitch Wheat
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, вам просто нужно убедиться, что он выглядит правильно и запустить его.

JamesRyan
источник
4

Вот пример того, как вы можете автоматически сгенерировать сценарий восстановления SQL Server из файлов резервных копий в каталоге, используя TSQL:

Автоматическое создание сценария восстановления SQL Server из файлов резервных копий в каталоге

Автоматическое создание сценариев восстановления базы данных SQL Server

DaniSQL
источник
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 был поврежден, поэтому пришлось восстановить его из резервной копии и не иметь информации о цепочке журналов. Ваш скрипт избавил меня от необходимости создавать сценарии восстановления журнала транзакций вручную на основе имени файла!
августа
Что если вам нужна только одна база данных и все журналы транзакций? Что бы вы хотели изменить в сценарии?
user493592
Вот что он делает. Одна база данных (самая последняя) и все журналы транзакций с тех пор. Нет смысла просматривать журналы транзакций до полного резервного копирования.
Бен Кертоис