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?
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
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 les scripts de restauration de la base de données SQL Server
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.
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
}