Come ripristinare un batch di registri delle transazioni anziché uno per uno


11

Ho un database SQL Server che esegue il backup dei registri delle transazioni ogni 10 minuti, con un backup completo durante la notte.

Utilizzando SQL 2008 Management Studio sembra che dobbiamo selezionare ogni registro delle transazioni uno alla volta. C'è un modo per indicarlo in una directory?

Sto prendendo in considerazione l'esecuzione di un backup differenziale più volte al giorno, il che potrebbe compensare alcuni di questi, ma passare uno alla volta attraverso dozzine / centinaia di file sembra richiedere molto tempo. Scrivere codice per provare a scrivere sembra troppo fuori tema rispetto alle nostre competenze chiave.

Se SQL Server Management Studio non ha un modo più veloce, forse è disponibile uno strumento di terze parti?


sì, se tutto il possibile meccanismo non funziona, è meglio richiedere aiuto dallo strumento di recupero log SQL sqlserverlogexplorer.com/restore
Jason Clark,

Risposte:


10

Non è possibile specificare un gruppo di backup del registro delle transazioni (cartella oк) da ripristinare in SQL Server Management Studio.

Ma puoi trovare tutte le informazioni sulle operazioni di backup di SQL Server nel database MSDB (set di backup della tabella e relativi).

Ecco lo script per generare i comandi di SQL Server per ripristinare il database dal backup e applicare tutti i backup dei registri delle transazioni eseguiti dall'ultimo backup completo del database. Penso che dovrebbe aiutarti.

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
Funziona davvero bene se puoi eseguire questo script sul server originale ma vuoi ripristinarlo su un altro server!
realMarkus Schmidt,

2
La sceneggiatura proviene da qui mssqltips.com/sqlservertip/1243/…
Andrew Savinykh

@sergey: dovresti attribuire gli script che sollevi dal web! : mssqltips.com/sqlservertip/1243/…
Mitch Wheat

4

hai solo bisogno di un elenco di istruzioni sql come ...

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

Quindi puoi creare uno script VB che genera facilmente questo SQL per te da una determinata cartella. Ecco un esempio http://blogs.lessthandot.com/index.php/DataMgmt/DBAdmin/MSSQLServerAdmin/restoring-multiple-transaction-log-backu

Una volta creato l'SQL, è sufficiente verificare che appaia corretto ed eseguirlo.



1

Non volevo usare l'approccio basato su SQL della risposta accettata, perché non volevo abilitare le stored procedure estese. Quindi ho scritto uno script PowerShell per farlo.

Lo si punta su una cartella e genera uno script basato sul backup completo più recente e su tutti i successivi backup del registro delle transazioni.

    [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

    }

Grazie! Hai appena salvato il mio bacon da un fuoco caldo caldo ... msdb era corrotto, quindi ho dovuto ripristinarlo dal backup e non aveva le informazioni sulla catena di registro. Il tuo script mi ​​ha evitato di dover costruire manualmente gli script di ripristino del registro delle transazioni in base al nome file!
Agrath

Cosa succede se si desidera solo un database e tutti i registri delle transazioni? Cosa avresti bisogno di cambiare nella sceneggiatura?
user493592,

Questo è quello che fa. Un database (il più recente) e tutti i registri delle transazioni da allora. Non ha senso guardare i registri delle transazioni prima del backup completo.
Ben Curthoys,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.