Como restaurar um lote de logs de transação em vez de um por um

10

Eu tenho um banco de dados do SQL Server que faz o backup dos logs de transação a cada 10 minutos, com um backup completo durante a noite.

Usando o SQL 2008 Management Studio, parece que precisamos selecionar cada log de transação, um por um. Existe alguma maneira de apontá-lo em um diretório?

Estou pensando em executar um backup diferencial várias vezes ao dia, o que pode compensar parte disso, mas passar um a um por dezenas / centenas de arquivos parece ser bastante demorado. Escrever código para tentar criar scripts parece muito fora do assunto de nossas principais competências.

Se o SQL Server Management Studio não tiver uma maneira mais rápida, talvez haja uma ferramenta de terceiros disponível

    
por aSkywalker 09.08.2010 / 10:04

4 respostas

9

Não há maneiras de especificar vários backups de log de transações (pasta oк) para restaurar no SQL Server Management Studio.

Mas você pode encontrar todas as informações sobre as operações de backup do SQL Server no banco de dados MSDB (tabela backupset e relacionadas).

Aqui está o script para gerar comandos do SQL Server para restaurar o banco de dados a partir do backup e aplicar todos os backups de logs de transações realizados a partir do último backup completo do banco de dados. Eu acho que isso deveria te ajudar.

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
    
por 09.08.2010 / 11:54
4

você só precisa de uma lista de instruções sql como ...

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

Então você pode criar um script VB que gere facilmente este SQL para você a partir de uma determinada pasta. Aqui está um exemplo de link

Depois de criar o SQL, basta verificar se ele está certo e executá-lo.

    
por 09.08.2010 / 12:04
4

Aqui está um exemplo de como você pode gerar automaticamente o script de restauração do SQL Server a partir de arquivos de backup em um diretório usando o TSQL:

Auto gerar script de restauração do SQL Server a partir de arquivos de backup em um diretório

Gerar automaticamente scripts de restauração de banco de dados do SQL Server

    
por 09.08.2010 / 17:08
1

Eu não queria usar a abordagem baseada em SQL da resposta aceita, porque não queria ativar os procedimentos armazenados estendidos. Então eu escrevi um script powershell para fazer isso.

Você aponta para uma pasta e gera um script com base no backup completo mais recente e em todos os backups de log de transação subsequentes.

    [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

    }
    
por 03.10.2016 / 15:57