web-dev-qa-db-fra.com

Comment puis-je restaurer un lot de journaux de transaction plutôt que d'un par un

J'ai une base de données SQL Server qui sauvegarde les journaux de transaction toutes les 10 minutes, avec une sauvegarde complète de nuit.

En utilisant SQL 2008 Management Studio, nous semblons avoir à sélectionner chaque journal de transaction un par un. Y a-t-il un moyen de le pointer dans un répertoire?

J'envisage de courir une sauvegarde différentielle plusieurs fois par jour, ce qui peut compenser une partie de cela, mais l'un à un à un par des dizaines/centaines de fichiers semble consommer peu de temps. Code d'écriture pour essayer de script, il semble trop trop loin de nos compétences essentielles.

Si SQL Server Management Studio n'a pas de manière plus rapide, peut-être un outil tiers disponible?

11
aSkywalker

Il n'y a pas de façons de spécifier des sauvegardes de journal de transaction (OК dossier) pour restaurer dans SQL Server Management Studio.

Mais vous pouvez trouver toutes les informations sur les opérations de sauvegarde SQL Server dans la base de données MSDB (BackupSet de table et associées).

Voici un script pour générer des commandes SQL Server pour restaurer la base de données à partir de la sauvegarde et l'application de toutes les sauvegardes de journaux de transaction effectuées à partir de la dernière sauvegarde de la base de données complète. Je pense que cela devrait vous aider.

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
10
Sergey

Voici un exemple sur la manière dont vous pouvez générer automatiquement le script SQL Server Restaurer des fichiers de sauvegarde dans un répertoire utilisant TSQL:

Génère automatiquement le script de restauration SQL Server à partir de fichiers de sauvegarde dans un répertoire

Génère automatiquement les scripts de restauration de la base de données SQL Server

4
DaniSQL

vous avez juste besoin d'une liste de déclarations SQL comme ...

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

Vous pouvez donc créer un script VB qui génère facilement ce SQL pour vous à partir d'un dossier donné. Voici un exemple http://blogs.lessthandot.com/index.php/datamgmt/dbadmin/msqlserveradmin/restoring-multiples-transaction-log-back

Une fois qu'il a créé le SQL, il vous suffit de vérifier qu'il a l'air correct et le gérer.

4
JamesRyan

Je ne voulais pas utiliser l'approche basée sur SQL de la réponse acceptée, car je ne voulais pas activer les procédures stockées étendues. J'ai donc écrit un script PowerShell pour le faire.

Vous le signalez dans un dossier et génère un script en fonction de la dernière sauvegarde complète et de toutes les sauvegardes de journal de transaction ultérieures.

    [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
Ben Curthoys