SQL Server DBを新しいインスタンスに移行しています。
システムカタログの利用可能なバックアップからRESTOREスクリプトを動的に構築することが可能であると言われました。
これを行うサンプルスクリプトを知っている人はいますか?
ありがとう!
私は個人的には、Paul Brewerのsp_restorecriptgenieを使用しています。 SCC記事がある記事へのリンクです。[手順]の下にあります
http://www.sqlservercentral.com/articles/Restore+database/95839/
基本的に、ストアドプロシージャを構築したら、exec sp_restorescriptgenie
を実行するだけで、スクリプトが実行され、すべてのDB(トランザクションログを含む)のすべてのバックアップが取得され、それらを生成するスクリプトが提供されます。また、復元後にDBをチェックするDBCC CHECKDBコマンドを生成します。
実際には約1時間前にこのスクリプトを使用したので、テストリストアを実行し、バックアップを検証できます。
以下のリンクに非常に優れたスクリプトがあります。
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\''
'
SQL Server DBを新しいインスタンスに移行しています。
Dbatools- Copy-DbaDatabase を使用して、1つのソースから 複数の宛先 にバックアップ/復元できます。
また、リストアdbatools- Restore-DbaDatabase -を使用すると、バックアップの場所をポイントするか、msdbバックアップ履歴を信頼してコマンドを作成し、ポイントインタイムリストアを実行することもできます。それは自動的に完全な、diffとtlogsを計算します。
Export-DbaScript を使用してファイルに復元スクリプトを生成することもできます。
注:私はdbatoolsとsp_restoreGeneの両方を使用しました-どちらも本当に良いです。 dbatoolsの利点は、サーバー管理全体に他のコマンドレットを使用できることです。