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

Повторитесь после меня:

НИКОГДА не выполняйте веб-сервер как корень.

НИКОГДА не выполняйте веб-сервер как корень.

НИКОГДА не выполняйте веб-сервер как корень.

НИКОГДА не выполняйте веб-сервер как корень.

Как отъезд Вашего разблокированного дома и ехать в отпуск в течение 6 месяцев.

Как, туда, где поместить Ваш веб-корень. Я рекомендую где-нибудь, что это имеет смысл Вам. Я - большой поклонник помещения его где-нибудь НЕСТАНДАРТНЫЙ просто, потому что это помогает защитить от всех различных деточек сценария там. (Все еще не делает Вас в безопасности, но это помогает.)

10
задан 9 August 2010 в 11:04
4 ответа

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

Но можно найти всю информацию об операциях резервного копирования SQL Server в базе данных MSDB (таблица backupset и связанный).

Вот сценарий для генерации команд 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
9
ответ дан 2 December 2019 в 22:04

Вам просто нужен список 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, просто необходимо проверить, что это выглядит правильным и выполняет его.

4
ответ дан 2 December 2019 в 22:04

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

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

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

4
ответ дан 2 December 2019 в 22:04

Я не хотел использовать основанный на SQL подход принятого ответа, потому что не хотел включать расширенные хранимые процедуры. Поэтому я написал для этого скрипт Powerhell.

Вы направляете его в папку, и он генерирует скрипт на основе последней полной резервной копии, а также всех последующих резервных копий журнала транзакций.

    [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

    }
1
ответ дан 2 December 2019 в 22:04

Теги

Похожие вопросы