web-dev-qa-db-ja.com

すべてのデータベーススクリプトの復元

SQL Server DBを新しいインスタンスに移行しています。

システムカタログの利用可能なバックアップからRESTOREスクリプトを動的に構築することが可能であると言われました。

これを行うサンプルスクリプトを知っている人はいますか?

ありがとう!

7
K09

私は個人的には、Paul Brewerのsp_restorecriptgenieを使用しています。 SCC記事がある記事へのリンクです。[手順]の下にあります

http://www.sqlservercentral.com/articles/Restore+database/9​​5839/

基本的に、ストアドプロシージャを構築したら、exec sp_restorescriptgenieを実行するだけで、スクリプトが実行され、すべてのDB(トランザクションログを含む)のすべてのバックアップが取得され、それらを生成するスクリプトが提供されます。また、復元後にDBをチェックするDBCC CHECKDBコマンドを生成します。

実際には約1時間前にこのスクリプトを使用したので、テストリストアを実行し、バックアップを検証できます。

11

以下のリンクに非常に優れたスクリプトがあります。

SQL Serverでデータベース復元スクリプトを生成する方法

そのスクリプトに基づいて、以下のストアドプロシージャを作成しました。これは、DBCC CHECKDBを生成しませんが、非常にうまく機能します。

3つのパラメーターが必要です。

@Database sysname - the database name you want to generate the restore
@MovePathLog NVARCHAR(1008) - where to move the transaction log file to
@MovePathData NVARCHAR(1008) - where to move the data file(s) to

これがコードです:

use master
go

IF OBJECT_ID('sp_genRestoreScripts') IS NOT NULL
   DROP PROCEDURE sp_genRestoreScripts
GO

create procedure sp_genRestoreScripts
@Database sysname,
@MovePathLog NVARCHAR(1008),
@MovePathData NVARCHAR(1008)
as begin

DECLARE @FullMediaSetID NVARCHAR(20)
DECLARE @BackupSetID NVARCHAR(20)
DECLARE @FullPath NVARCHAR(400)
DECLARE @FullPosition NVARCHAR(20)

DECLARE @LogMediaSetID NVARCHAR(20)
DECLARE @LogPath NVARCHAR(400)
DECLARE @LogPosition NVARCHAR(20)

DECLARE @DiffMediaSetID NVARCHAR(20)
DECLARE @DiffPath NVARCHAR(400)
DECLARE @DiffPosition NVARCHAR(20)

DECLARE @SQLMove NVARCHAR(MAX)
SET @SQLMove =''

IF ( @MovePathData <> '' OR @MovePathLog <> '')
BEGIN
    DECLARE @LogicalName NVARCHAR(200)
    DECLARE @FileID NVARCHAR(10)
    DECLARE @FileType NVARCHAR(10)
    DECLARE @ExtName NVARCHAR(20)

    DECLARE MoveCur CURSOR FOR 
    SELECT m.name
        ,m.file_id
        ,m.type 
    FROM sys.master_files m 
        INNER JOIN sys.databases d 
            ON m.database_id = d.database_id
    WHERE d.name = @Database

    OPEN MoveCur

    FETCH NEXT FROM MoveCur INTO @LogicalName,@FileID,@FileType

    WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @ExtName = CASE  
                            WHEN @FileID = 1 THEN '.mdf'
                            WHEN @FileID > 1 THEN CASE @FileType 
                                                       WHEN 0 THEN '.ndf' 
                                                       ELSE '.ldf' 
                                                  END
                       END
        SET @SQLMove = @SQLMove + CHAR(10) + '   , MOVE ' + '''' + @LogicalName + '''' 
                       + ' TO ' + '''' + 

                      CASE @FileType 
                           WHEN 0 THEN @MovePathData 
                           ELSE @MovePathLog
                      END

                       + @LogicalName + @ExtName + ''''
        FETCH NEXT FROM MoveCur INTO @LogicalName,@FileID,@FileType     
    END
    CLOSE MoveCur
    DEALLOCATE MoveCur
END


SELECT 
    @BackupSetID = backup_set_id,
    @FullMediaSetID = media_set_id, 
    @FullPosition = position
FROM msdb.dbo.backupset 
WHERE backup_set_id =
(
    SELECT MAX(backup_set_id) 
    FROM msdb.dbo.backupset 
    WHERE database_name = @Database 
        AND type='D'
    GROUP BY database_name
)

SELECT @FullPath = physical_device_name  
FROM msdb.dbo.backupmediafamily 
WHERE media_set_id = @FullMediaSetID

IF NOT EXISTS(SELECT 1 FROM msdb.dbo.backupset 
    WHERE database_name = @Database AND type IN('L','I') AND backup_set_id > @BackupSetID)
BEGIN
    PRINT REPLICATE('-',200)
    PRINT '-----------//Full backup restore only'
    PRINT REPLICATE('-',200)
    PRINT 'RESTORE DATABASE ' + @Database + CHAR(10) 
        + ' FROM DISK = ''' + @FullPath + '''' + CHAR(10) 
        + '   WITH FILE = ' + @FullPosition + ', REPLACE' + @SQLMove
END


IF EXISTS(SELECT 1 FROM msdb.dbo.backupset 
    WHERE database_name = @Database AND type='L' AND backup_set_id > @BackupSetID)
BEGIN
    PRINT REPLICATE('-',200)
    PRINT '-----------//Full backup and log backup restore '
    PRINT REPLICATE('-',200)
    PRINT 'RESTORE DATABASE ' + @Database + CHAR(10)
        + ' FROM DISK = ''' + @FullPath + '''' + CHAR(10)
        + '   WITH FILE = ' + @FullPosition + ', NORECOVERY, REPLACE ' + @SQLMove

    DECLARE log_cursor CURSOR FOR 
    SELECT media_set_id
        ,position 
    FROM msdb.dbo.backupset 
    WHERE database_name = @Database 
        AND type='L' 
        AND backup_set_id > @BackupSetID 
    ORDER BY backup_set_id

    OPEN log_cursor

    FETCH NEXT FROM log_cursor INTO @LogMediaSetID,@LogPosition

    WHILE @@FETCH_STATUS = 0
    BEGIN
        SELECT @LogPath = physical_device_name  
        FROM msdb.dbo.backupmediafamily 
        WHERE media_set_id = @LogMediaSetID

        PRINT 'RESTORE Log ' + @Database + CHAR(10) 
            + ' FROM DISK = ''' + @LogPath
            + ''' WITH FILE = ' + @LogPosition + ', NORECOVERY'
        FETCH NEXT FROM log_cursor INTO @LogMediaSetID,@LogPosition
    END
    CLOSE log_cursor
    DEALLOCATE log_cursor

    PRINT 'RESTORE DATABASE ' + @Database + ' WITH RECOVERY '
END


IF EXISTS(SELECT 1 FROM msdb.dbo.backupset 
    WHERE database_name = @Database AND type='I' AND backup_set_id > @BackupSetID)
BEGIN
    PRINT REPLICATE('-',200)
    PRINT '-----------//Full backup and differential backup restore '
    PRINT REPLICATE('-',200)
    PRINT 'RESTORE DATABASE ' + @Database + CHAR(10)  
        + ' FROM DISK = ''' + @FullPath + '''' + CHAR(10)
        + '   WITH FILE = ' + @FullPosition + ', NORECOVERY, REPLACE ' + @SQLMove

    DECLARE diff_cursor CURSOR FOR 
    SELECT media_set_id
        ,position 
    FROM msdb.dbo.backupset 
    WHERE database_name = @Database 
        AND type='I' 
        AND backup_set_id > @BackupSetID 
    ORDER BY backup_set_id

    OPEN diff_cursor

    FETCH NEXT FROM diff_cursor INTO @DiffMediaSetID,@DiffPosition

    WHILE @@FETCH_STATUS = 0
    BEGIN
        SELECT @DiffPath = physical_device_name  
        FROM msdb.dbo.backupmediafamily 
        WHERE media_set_id = @DiffMediaSetID

        PRINT 'RESTORE DATABASE ' + @Database + CHAR(10)
            + ' FROM DISK = ''' + @DiffPath 
            + ''' WITH FILE = ' + @DiffPosition + ', NORECOVERY'

        FETCH NEXT FROM diff_cursor INTO @DiffMediaSetID,@DiffPosition
    END
    CLOSE diff_cursor
    DEALLOCATE diff_cursor

    PRINT 'RESTORE DATABASE ' + @Database + ' WITH RECOVERY '
END
end 
GO

これは、単一のデータベースに対してプロシージャを実行する方法です。

use master
go
exec sp_genRestoreScripts
        @Database ='CAAltosextracts',
        @MovePathLog ='F:\logs\',
        @MovePathData ='e:\DATA\'

マルチデータベースの場合は sp_foreachdbストアドプロシージャ を使用します

     declare @db_list NVARCHAR(MAX)


     SELECT @db_list  = STUFF((
                                SELECT ', ' + name FROM sys.databases
                                WHERE name NOT IN ('DBA','TABLEBACKUPS','MASTER','MSDB','MODEL','TEMPDB')
                                FOR XML PATH(''), TYPE).value('.[1]', 'nvarchar(max)'), 1, 2, '')

     --exec sp_foreachdb @database_list = @db_list
              --       ,@command='use ?; print db_name() + char(13)'   

     exec sp_foreachdb @database_list = @db_list
                     ,@command='
                                 exec sp_genRestoreScripts
                                        @Database =[?],
                                        @MovePathLog =''F:\logs\'',
                                        @MovePathData =''E:\DATA\'' 
                               ' 
2

SQL Server DBを新しいインスタンスに移行しています。

Dbatools- Copy-DbaDatabase を使用して、1つのソースから 複数の宛先 にバックアップ/復元できます。

また、リストアdbatools- Restore-DbaDatabase -を使用すると、バックアップの場所をポイントするか、msdbバックアップ履歴を信頼してコマンドを作成し、ポイントインタイムリストアを実行することもできます。それは自動的に完全な、diffとtlogsを計算します。

Export-DbaScript を使用してファイルに復元スクリプトを生成することもできます。

注:私はdbatoolsとsp_restoreGeneの両方を使用しました-どちらも本当に良いです。 dbatoolsの利点は、サーバー管理全体に他のコマンドレットを使用できることです。

0
Kin Shah