Toplu işlem günlüklerini tek tek yerine nasıl geri yüklerim


12

Bir günlük tam yedekleme ile her 10 dakikada bir işlem günlüklerini yedekleyen bir SQL Server veritabanı var.

SQL 2008 Management studio'yu kullanarak her bir işlem günlüğünü tek tek seçmek zorundayız. Bir dizine işaret etmenin herhangi bir yolu var mı?

Günde birkaç kez farklı bir yedekleme çalıştırmayı düşünüyorum, bu bazılarını dengeleyebilir, ancak düzinelerce / yüzlerce dosya boyunca tek tek gitmek oldukça zaman alıcı gibi görünüyor. Komut dosyası yazmak için kod yazmak, temel yetkinliklerimizden çok uzak görünüyor.

SQL Server Management Studio'nun daha hızlı bir yolu yoksa, belki de üçüncü taraf bir araç var mı?


evet, tüm olası mekanizma işe yaramazsa, SQL Günlük Kurtarma Aracı'ndan yardım almak daha iyidir sqlserverlogexplorer.com/restore
Jason Clark

Yanıtlar:


11

SQL Server Management Studio'da geri yüklenecek bir sürü işlem günlüğü yedeklemesi (oк klasörü) belirtmenin bir yolu yoktur.

Ancak SQL Server yedekleme işlemleri hakkındaki tüm bilgileri MSDB veritabanında bulabilirsiniz (tablo yedekleme kümesi ve ilgili).

İşte veritabanını yedekten geri yüklemek ve son tam veritabanı yedekten gerçekleştirilen tüm işlem günlükleri yedeklerini uygulamak için SQL Server komutları oluşturmak için komut dosyası. Sanırım sana yardımcı olmalı.

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
Bu komut dosyasını orijinal sunucuda çalıştırabilir, ancak başka bir sunucuya geri yüklemek istiyorsanız gerçekten harika çalışır!
realMarkusSchmidt


@sergey: Web'den kaldırdığınız komut dosyalarını ilişkilendirmelisiniz! : mssqltips.com/sqlservertip/1243/…
Mitch Wheat


4

sadece sql ifadelerinin bir listesine ihtiyacınız var ...

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

Böylece, belirli bir klasörden sizin için bu SQL'i kolayca üreten bir VB komut dosyası oluşturabilirsiniz. İşte bir örnek http://blogs.lessthandot.com/index.php/DataMgmt/DBAdmin/MSSQLServerAdmin/restoring-multiple-transaction-log-backu

SQL'i oluşturduktan sonra, doğru göründüğünü kontrol etmeniz ve çalıştırmanız yeterlidir.


1

Genişletilmiş saklı yordamları etkinleştirmek istemediğim için kabul edilen yanıtın SQL tabanlı yaklaşımını kullanmak istemedim. Bu yüzden bunu yapmak için bir powershell betiği yazdım.

Bir klasöre işaret edersiniz ve en son tam yedeklemeye ve sonraki tüm işlem günlüğü yedeklerine dayalı olarak bir komut dosyası oluşturur.

    [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

    }

Teşekkür ederim! Sadece sıcak bir sıcak ateş benim pastırma kurtardı ... msdb bozuk yani yedekleme yedek geri yüklemek zorunda kaldı ve günlük zinciri bilgi yoktu. Komut dosyanız beni dosya adına göre işlem günlüğü geri yükleme komut dosyalarını oluşturmak zorunda kalmadan kurtardı!
agrath

Yalnızca bir veritabanı ve tüm işlem günlükleri istiyorsanız ne olur? Senaryoda neyi değiştirmek isterdiniz?
user493592

Yaptığı bu. O zamandan beri bir veritabanı (en son) ve tüm işlem günlükleri. Tam yedeklemeden önce işlem günlüklerine bakmanın bir anlamı yoktur.
Ben Curthoys
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.