web-dev-qa-db-ja.com

多数のトランザクションログを復元する

SQL Server 2008 R2を使用していて、36個の.trnログをデータベースに復元する必要があります。 SSMSのトランザクションログ復元機能を使用して最初の4つを復元しました(データベースを右クリック>タスク>復元>トランザクションログ)。

このツールまたはスクリプトを使用してすべてを復元する方法はありますか? .trnファイルは、リモートサーバー上のフォルダーにあります。フォルダ内のすべてのファイルを復元する必要はありません。特定の日付の間のファイルのみを復元します。

これを自動化する方法を探しているので、個々のログを手動で復元する必要はありません。

以下のようなアドレスを使用してファイルにアクセスします。

\\リモートサーバーIP\SQL_Backup\LMSQL02\TLog\file.trn

5
Sadie

Restore Gene:Automating SQL Server Database Restores を使用することをお勧めします Paul Brewer によって作成されました

Restore Geneストアドプロシージャは、必要に応じて、DBCC CHECKDBコマンドを含む、必要な復元スクリプトを生成します。それ自体が便利なツールです。災害復旧状況では、数秒で復元スクリプトを作成できます。オプションで、ターゲットデータベースの名前のオーバーライドオプションと、データ、ログファイルの場所のWITH MOVEオーバーライドが含まれます。これらは、データベースの一時バージョンを同じインスタンスに復元することにより、失われたデータを回復するのに役立ちます。

自動化のために [〜#〜] tsql [〜#〜]PowerShell の両方のバージョンがあります。

5
Kin Shah

これは、xp_cmdshellを使用して、ログファイルのファイルシステムを調べます。よろしければ….

DECLARE @databaseName AS VARCHAR(100)
DECLARE @restoreName AS VARCHAR(100)
SET @databaseName = 'OriginalDBName' 
SET @restoreName = 'RestoredDBName' 

CREATE TABLE #dirList (
  id int identity(1,1),
  line nvarchar(1000)
  )

DECLARE @cmdShellStatement VARCHAR(2000)
--Modify this file path if the backup files are not located in the standard backup directory.
SET @cmdShellStatement = 'DIR "C:\Program'+' '+'Files\Microsoft'+' '+'SQL'+'     '+'Server\MSSQL10_50.MSSQLSERVER\MSSQL\Backup\' + @databaseName + '\"'
INSERT INTO #dirList (line) EXEC master..xp_cmdshell @cmdShellStatement
SELECT SUBSTRING(line,0,21) AS 'DateTime'
--Modify this file path if the backup files are not located in the standard backup directory.
,'RESTORE DATABASE ' + @restoreName + ' FROM DISK = ''C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Backup\' + @databaseName     + '\' +   SUBSTRING(line,40,100) + ''' WITH REPLACE, NORECOVERY' as 'Script'
FROM #dirList
WHERE line like '%.bak'
ORDER BY CAST(SUBSTRING(line,0,21) AS DateTime)

SELECT SUBSTRING(line,0,21) AS 'DateTime'
--Modify this file path if the backup files are not located in the standard backup directory.
,'RESTORE LOG ' + @restoreName + ' FROM DISK = ''C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Backup\' + @databaseName + '\' +   SUBSTRING(line,40,100) + ''' WITH NORECOVERY' as 'Script'
FROM #dirList
WHERE line like '%.trn'
ORDER BY CAST(SUBSTRING(line,0,21) AS DateTime)

DROP TABLE #dirList
1
tpet

以下のスクリプトは、問題が発生したときに here から複数のtranログを順番に復元するシナリオがある場合に便利です。

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

また、お読みになることをお勧めします トランザクションログのバックアップと復元シーケンス:神話と真実

0
KASQLDBA