sql >> データベース >  >> RDS >> Database

デフォルトの方法で自動データベースのバックアップと復元を実装する

    はじめに

    データベースをバックアップおよび復元する方法に関する多くのガイドを見つけることができます。これでは、デフォルトのMSSQLServerの手段を使用してこれを行う方法を示します。

    この例では、データベースをバックアップする前にデータベースの整合性をチェックすることから、以前に作成したバックアップコピーからデータベースを復元することまで、さまざまなアプローチについて説明します。

    ソリューション

    まず、データベースのバックアップに使用する全体的なアルゴリズムを見てみましょう。

    1)バックアップする必要のあるデータベースの定義
    2)選択したデータベースの整合性の確認
    3)選択したデータベースごとにバックアップ(完全、差分、またはトランザクションログコピー)を作成する
    4)作成されたバックアップコピーの確認
    5)トランザクションログの圧縮(必要な場合)

    以下に、このアルゴリズムの実装例を示します。

    バックアップする必要のあるデータベースを定義するために、次の表を作成します。

     USE [DB_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv]。[BackupSettings]([DBID] [int] NOT NULL、[FullPathBackup] [nvarchar](255)NOT NULL、[DiffPathBackup] [nvarchar](255 )NULL、[LogPathBackup] [nvarchar](255)NULL、[InsertUTCDate] [datetime] NOT NULL、CONSTRAINT [PK_BackupSettings] PRIMARY KEY CLUSTERED([DBID] ASC)WITH(PAD_INDEX =OFF、STATISTICS_NORECOMPUTE =OFF、IGNORE_DUP_KEY =OFF、 ALLOW_ROW_LOCKS =ON、ALLOW_PAGE_LOCKS =ON)ON [PRIMARY])ON [PRIMARY]; GOALTERTABLE[srv]。[BackupSettings]ADDCONSTRAINT [DF_BackupSettings_InsertUTCDate] DEFAULT(getutcdate())FOR [InsertUTCDate]; GO 

    データベース識別子は最初の列にあり、「FullPathBackup」には完全バックアップコピーを作成するためのパスが含まれ(たとえば、「disk:\…\」)、DiffPathBackupとLogPathBackupには差分およびトランザクションログコピーを作成するためのフルパスが含まれますそれぞれ。 DiffPathBackupまたはLogPathBackup列が空の場合、このデータベースの差分および/またはトランザクションログのコピーは作成されません。

    このテーブルに基づいて表現を作成することもできます:

     USE [DB_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATEview[srv]。[vBackupSettings]asSELECT[DBID]、DB_Name([DBID])as [DBName]、[FullPathBackup]、[DiffPathBackup]、[LogPathBackup]、[InsertUTCD ]FROM[srv]。[BackupSettings];GO

    この表現により、バックアッププロセスに参加しているデータベースを効果的に確認できます。

    それでは、sys.master_filesシステム表現からデータベースファイル情報を表示する表現を作成しましょう。

     USE [DB_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATEview[inf]。[ServerDBFileInfo]asSELECT@@ Servername AS Server、File_id、--DBファイル識別子。 file_idの基本値は1です。Type_desc、--タイプファイルの説明Name as [FileName]、--DB論理ファイル名LEFT(Physical_Name、1)AS Drive、--DBファイルの場所のドライブフラグPhysical_Name、--Full file OSの名前RIGHT(physical_name、3)AS Ext、--ファイル拡張子Size as CountPage、-8Kbページの現在のファイルサイズround((cast(Size * 8 as float))/ 1024,3)as SizeMb、- -Mbラウンドのファイルサイズ((cast(Size * 8 as float))/ 1024 / 1024,3)as SizeGb、--is_percent_growth=0の場合はGbの場合のファイルサイズ。 is_percent_growth =0 then round((cast(Growth * 8 as float))/ 1024,3)end as GrowthMb、--is_percent_growth =0 then round((cast(Growth * 8 as float))/ 1024 / 1024,3)end as GrowthGb、--is_percent_growth =1の場合はGbの場合のファイルの成長、それ以外の場合はGrowthPercentとしてのファイルの成長、DB_ Name(database_id)as [DB_Name]、State、--ファイル状態state_desc as StateDesc、--ファイル状態の説明is_media_read_only as IsMediaReadOnly、--ファイルはドライブ上に読み取り専用(0-および書き込み用)として配置されていますis_read_only as IsReadOnly 、--ファイルは読み取り専用(0-および書き込み用)としてフラグが立てられますis_sparseはIsSpaceとして、--スパースファイルis_name_reservedはIsNameReservedとして---1-リモートファイル名、使用可能にアクセス可能。 --新しいファイルに同じ名前(nameまたはphysical_name引数)を再度使用する前に、ログのバックアップを取得する必要があります-0 --Filename、CreateLsnとしてcreate_lsnを使用するにはアクセスできません--ログ内のトランザクション登録番号(LSN)これは、ファイルdrop_lsnをDropLsnとして作成するために使用されました。--LSNは、ファイルread_only_lsnをReadOnlyLsnとして削除するために使用されました。--LSNは、ファイルを含むファイルグループが「読み取りおよび書き込み」タイプを「読み取り」に変更するために使用されました。 -only "(最新の変更)read_write_lsn as ReadWriteLsn、--「読み取り専用」タイプを「読み取りと書き込み」(最新の変更)differential_base_lsn as DifferentialBaseLsnに変更するためにファイルを含むファイルグループによって使用されたLSN、- -差分バックアップコピーのベース。 LSNの後に変更されたデータエクステントは、差分バックアップに含まれます。 DifferentialBaseGuidとしてのdifferential_base_guid、--差分コピーの作成に使用されるベースバックアップコピーの一意の識別子。 Differential_base_time as DifferentialBaseTime、--differential_base_lsn redo_start_lsn asRedoStartLsnに対応する時間--次のREDOの開始を決定するために使用されるLSN--state=RESTORINGまたはstate=RECOVERY_PENDING redo_start_fork_guid as RedoStartForkGuidの場合を除き、NULLです- -復元フォークポイントの一意の識別子--次に復元されるバックアップコピーのfirst_fork_guid引数値は、RedoTargetLsnとしてこの値redo_target_lsnと等しくなければなりません。--このファイルで「オンライン」モードREDOの停止ポイントとして機能するLSN--状態=RESTORINGまたは状態=RECOVERY_PENDINGredo_target_fork_guid as RedoTargetForkGuidの場合を除いて、NULLです。--コンテナを復元できる復元フォーク。 redo_target_lsnbackup_lsnとともにBackupLsn--最新データのLSNまたはファイルの差分バックアップcopyFROMsys.master_files--database_files;GO
    として使用されます。

    完全バックアップコピーを作成するには、次のストアドプロシージャを実装しましょう。

    [expand title =”コード 「]

     USE [DB_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTERPROCEDURE[srv]。[RunFullBackupDB]@ClearLogbit=1--トランザクションログサイズを縮小するかどうかを指定しますASBEGIN/*完全なDBバックアップコピーを作成し、DBの整合性をチェックします事前に*/SET NOCOUNT ON; @dt datetime =getdate();を宣言します。 @year int =YEAR(@dt);を宣言します。 @monthを宣言しますint=MONTH(@dt); @day int =DAY(@dt);を宣言します。 @hour int =DatePart(hour、@dt);を宣言します。 @minuteを宣言しますint=DatePart(minute、@dt); @secondを宣言しますint=DatePart(second、@dt); @pathBackup nvarchar(255);を宣言します。 @pathstr nvarchar(255);を宣言します。 @DBName nvarchar(255);を宣言します。 @backupName nvarchar(255);を宣言します。 @sql nvarchar(max);を宣言します。 @backupSetIdをintとして宣言します。 @FileNameLog nvarchar(255);を宣言します。 @tbllogテーブルを宣言します([DBName] [nvarchar](255)NOT NULL、[FileNameLog] [nvarchar](255)NOT NULL); @tblテーブルを宣言します([DBName] [nvarchar](255)NOT NULL、[FullPathBackup] [nvarchar](255)NOT NULL); --フルバックアップコピーを作成するためのDB名とフルパスを取得します@tbl([DBName]、[FullPathBackup])select DB_NAME([DBID])、[FullPathBackup]from[srv]。[BackupSettings]; --DB名と対応するトランザクションログの名前を取得する(1つのDBが複数のログを持つことができるため)@tbllog([DBName]、[FileNameLog])に挿入するselect t。[DBName]、tt。[FileName] as [FileNameLog ] from @tbl as t innerjoin[inf]。[ServerDBFileInfo]asttont。[DBName]=DB_NAME(tt。[database_id])wherett。[Type_desc]='LOG'; --以前に取得した各DBを順次処理しますwhile(exists(select top(1)1 from @tbl))begin set @ backupSetId =NULL; @tblからtop(1)@ DBName =[DBName]、@ pathBackup=[FullPathBackup]を選択します。 set @ example @ sqldat.com + N'_Full_backup _'+ cast(@year as nvarchar(255))+ N'_' + cast(@month as nvarchar(255))+ N'_'+ cast(@day as nvarchar(255))--+ N'_'-+ cast(@hour as nvarchar(255))+ N'_'+ cast(@minute as nvarchar(255))+ N'_'+ cast(@ nvarchar(255)として2番目); set @ example @ sqldat.comexample @ sqldat.com + N'.bak'; --DBの整合性セットをチェックします@sql=N'DBCC CHECKDB(N'+ N''''[email protected]+N'''' + N')WITH NO_INFOMSGS'; exec(@sql); --バックアップコピー作成手順セットの実行@sql=N'BACKUP DATABASE ['[email protected]+N'] TO DISK =N'+ N''''[email protected]+N'''' + N'WITH NOFORMAT、NOINIT、NAME =N'+ N'''' [email protected] + N'''' + N'、CHECKSUM、STOP_ON_ERROR、SKIP、REWIND、COMPRESSION、STATS =10;'; exec(@sql); --作成したバックアップコピーを確認しますselect@backupSetId=position from msdb..backupset where [email protected] and backup_set_id =(select max(backup_set_id)from msdb..backupset where [email protected]); set @ sql =N'検証エラー。 "'[email protected]+'"データベースのバックアップコピー情報が見つかりません。'; @backupSetIdがnullの場合beginraiserror(@sql、16、1)end else begin set @ sql =N'RESTORE VERIFYONLY FROM DISK =N'+'''' [email protected]+N'''' + N ' WITH FILE ='+ cast(@backupSetId as nvarchar(255)); exec(@sql); end --DBトランザクションログの圧縮if(@ ClearLog =1)begin while(exists(select top(1)1 from @tbllog where [DBName] [email protected]))begin select top(1)@ FileNameLog =FileNameLog @tbllogから[email protected]; set @ sql =N'USE ['[email protected]+N'];' + N'DBCC SHRINKFILE(N' + N'''' [email protected]+N'''' + N'、0 、TRUNCATEONLY)'; exec(@sql); @tbllogから削除します。[email protected]および[email protected]; end end@tblから削除します。ここで[DBName][email protected]; endENDGO 

    [/エキスパンド]

    コードによると、この手順はバックアップコピー作成アルゴリズムの残りのステップの解決策を提供することがわかります。

    差分コピーとトランザクションログコピーを作成する手順は、同様の方法で実装されます。

    [expand title =”コード 「]

     USE [DB_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTERPROCEDURE[srv]。[RunDiffBackupDB]@ClearLogbit=1-トランザクションログサイズを縮小するかどうかを指定しますASBEGIN/*差分DBバックアップコピーの作成*/SET NOCOUNT ON; @dt datetime =getdate();を宣言します。 @year int =YEAR(@dt);を宣言します。 @monthを宣言しますint=MONTH(@dt); @day int =DAY(@dt);を宣言します。 @hour int =DatePart(hour、@dt);を宣言します。 @minuteを宣言しますint=DatePart(minute、@dt); @secondを宣言しますint=DatePart(second、@dt); @pathBackup nvarchar(255);を宣言します。 @pathstr nvarchar(255);を宣言します。 @DBName nvarchar(255);を宣言します。 @backupName nvarchar(255);を宣言します。 @sql nvarchar(max);を宣言します。 @backupSetIdをintとして宣言します。 @FileNameLog nvarchar(255);を宣言します。 @tblテーブルを宣言します([DBName] [nvarchar](255)NOT NULL、[DiffPathBackup] [nvarchar](255)NOT NULL); @tbllogテーブルを宣言します([DBName] [nvarchar](255)NOT NULL、[FileNameLog] [nvarchar](255)NOT NULL); --差分バックアップコピーを作成するためのDB名とフルパスを取得すると、@ tbl([DBName]、[DiffPathBackup])select DB_NAME([DBID])、[DiffPathBackup]from[srv]。[BackupSettings]where[DiffPathBackup] nullではありません。 --DB名とそれに応じたトランザクションログファイルのフルネームを取得する(1つのDBが複数のログを持つことができるため)@tbllog([DBName]、[FileNameLog])に挿入するselect t。[DBName]、tt。[FileName] as [FileNameLog] from @tbl as t innerjoin[inf]。[ServerDBFileInfo]asttont。[DBName]=DB_NAME(tt。[database_id])wherett。[Type_desc]='LOG'; --以前に取得した各DBを順次処理しますwhile(exists(select top(1)1 from @tbl))begin set @ backupSetId =NULL; @tblからtop(1)@ DBName =[DBName]、@ pathBackup=[DiffPathBackup]を選択します。 set @ example @ sqldat.com + N'_Diff_backup _'+ cast(@year as nvarchar(255))+ N'_' + cast(@month as nvarchar(255))+ N'_'+ cast(@day as nvarchar(255))+ N'_'+ cast(@hour as nvarchar(255))+ N'_'+ cast(@minute as nvarchar(255))+ N'_'+ cast(@second as nvarchar( 255)); set @ example @ sqldat.comexample @ sqldat.com + N'.bak'; --DBの整合性セットをチェックします@sql=N'DBCC CHECKDB(N'+ N''''[email protected]+N'''' + N')WITH NO_INFOMSGS'; exec(@sql); --バックアップ手順セットの実行@sql=N'BACKUP DATABASE ['[email protected]+N'] TO DISK =N'+ N'''' [email protected]+N'''' + N ' WITH DIFFERENTIAL、NOFORMAT、NOINIT、NAME =N'+ N''''[email protected]+N''''+ N'、CHECKSUM、STOP_ON_ERROR、SKIP、REWIND、COMPRESSION、STATS =10;'; exec(@sql); -作成したバックアップコピーを確認しますselect@backupSetId=position from msdb..backupset where [email protected] and backup_set_id =(select max(backup_set_id)from msdb..backupset where [email protected]); set @ sql =N'検証エラー。 "'[email protected]+'"データベースのバックアップコピー情報が見つかりません。'; @backupSetIdがnullの場合beginraiserror(@sql、16、1)end else begin set @ sql =N'RESTORE VERIFYONLY FROM DISK =N'+'''' [email protected]+N'''' + N ' WITH FILE ='+ cast(@backupSetId as nvarchar(255)); exec(@sql); end --DBトランザクションログの圧縮if(@ ClearLog =1)begin while(exists(select top(1)1 from @tbllog where [DBName] [email protected]))begin select top(1)@ FileNameLog =FileNameLog @tbllogから[email protected]; set @ sql =N'USE ['[email protected]+N'];' + N'DBCC SHRINKFILE(N' + N'''' [email protected]+N'''' + N'、0 、TRUNCATEONLY)'; exec(@sql); @tbllogから削除します。[email protected]および[email protected]; end end@tblから削除します。ここで[DBName][email protected]; endENDGO 

    [/エキスパンド]

    データベースの整合性をチェックするには多くのリソースが必要になるため、差分バックアップコピーを作成する際にそれを省略できます。

    [expand title =”コード 「]

     USE [DB_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTERPROCEDURE[srv]。[RunLogBackupDB]@ClearLogbit=1--トランザクションログサイズを縮小するかどうかを指定しますASBEGIN/*DBトランザクションログのバックアップ*/SET NOCOUNT ON; @dt datetime =getdate();を宣言します。 @year int =YEAR(@dt);を宣言します。 @monthを宣言しますint=MONTH(@dt); @day int =DAY(@dt);を宣言します。 @hour int =DatePart(hour、@dt);を宣言します。 @minuteを宣言しますint=DatePart(minute、@dt); @secondを宣言しますint=DatePart(second、@dt); @pathBackup nvarchar(255);を宣言します。 @pathstr nvarchar(255);を宣言します。 @DBName nvarchar(255);を宣言します。 @backupName nvarchar(255);を宣言します。 @sql nvarchar(max);を宣言します。 @backupSetIdをintとして宣言します。 @FileNameLog nvarchar(255);を宣言します。 @tblテーブルを宣言します([DBName] [nvarchar](255)NOT NULL、[LogPathBackup] [nvarchar](255)NOT NULL); @tbllogテーブルを宣言します([DBName] [nvarchar](255)NOT NULL、[FileNameLog] [nvarchar](255)NOT NULL); --非単純リカバリモデル(フルログまたはバルクログ)を使用してトランザクションログのバックアップコピーを作成するためのDB名とフルパスを取得します。システムDBも除外されます@tblへの挿入([DBName]、[LogPathBackup])select DB_NAME(b。[DBID])、b。[LogPathBackup]from[srv]。[BackupSettings]asb internal join sys.databases as d onb。[DBID]=d。[database_id]ここで、d.recovery_model <3およびDB_NAME([DBID])は(N'master'、N'tempdb'、N'model'、N'msdb'、N'にありませんReportServer'、N'ReportServerTempDB')および[LogPathBackup]はnullではありません。 --DB名とそれに応じたトランザクションログファイルのフルネームを取得する(1つのDBが複数のログを持つことができるため)@tbllog([DBName]、[FileNameLog])に挿入するselect t。[DBName]、tt。[FileName] as [FileNameLog] from @tbl as t innerjoin[inf]。[ServerDBFileInfo]asttont。[DBName]=DB_NAME(tt。[database_id])wherett。[Type_desc]='LOG'; --以前に取得した各DBを順次処理しますwhile(exists(select top(1)1 from @tbl))begin set @ backupSetId =NULL; @tblからtop(1)@ DBName =[DBName]、@ pathBackup=[LogPathBackup]を選択します。 set @ example @ sqldat.com + N'_Log_backup _'+ cast(@year as nvarchar(255))+ N'_' + cast(@month as nvarchar(255))+ N'_'+ cast(@day as nvarchar(255))+ N'_'+ cast(@hour as nvarchar(255))+ N'_'+ cast(@minute as nvarchar(255))+ N'_'+ cast(@second as nvarchar( 255)); set @ example @ sqldat.comexample @ sqldat.com + N'.trn'; --バックアップ手順セットの実行@sql=N'BACKUP LOG ['[email protected]+N'] TO DISK =N'+ N'''' [email protected]+N'''' + N ' WITH NOFORMAT、NOINIT、NAME =N'+ N''''[email protected]+N''''+ N'、CHECKSUM、STOP_ON_ERROR、SKIP、REWIND、COMPRESSION、STATS =10;'; exec(@sql); -作成したトランザクションログのバックアップコピーを確認しますselect@backupSetId=position from msdb..backupset where [email protected] and backup_set_id =(select max(backup_set_id)from msdb..backupset where [email protected]); set @ sql =N'検証エラー。 "'[email protected]+'"データベースのバックアップコピー情報が見つかりません。'; @backupSetIdがnullの場合beginraiserror(@sql、16、1)end else begin set @ sql =N'RESTORE VERIFYONLY FROM DISK =N'+'''' [email protected]+N'''' + N ' WITH FILE ='+ cast(@backupSetId as nvarchar(255)); exec(@sql); end --DBトランザクションログの圧縮if(@ ClearLog =1)begin while(exists(select top(1)1 from @tbllog where [DBName] [email protected]))begin select top(1)@ FileNameLog =FileNameLog @tbllogから[email protected]; set @ sql =N'USE ['[email protected]+N'];' + N'DBCC SHRINKFILE(N' + N'''' [email protected]+N'''' + N'、0 、TRUNCATEONLY)'; exec(@sql); @tbllogから削除します。[email protected]および[email protected]; end end@tblから削除します。ここで[DBName][email protected]; endENDGO 

    [/エキスパンド]

    上記のように、データベースの整合性をチェックすることは、リソースを大量に消費するタスクです。通常、トランザクションログのバックアップコピーを頻繁に作成する必要があるという事実と相まって、トランザクションログのコピーを作成する際に整合性チェックを省略する理由があります。

    また、「master」、「msdb」、および「model」データベースの完全バックアップコピーを定期的に実行する必要があることにも注意してください。

    バックアップコピーの作成プロセスを自動化するには、以前に実装した手順をWindowsタスクスケジューラ、エージェントジョブ、または同様の利用可能なサービスに呼び出すだけです。

    負荷のピーク、アクティビティのプラトーなどに基づいて、これらの各手順の呼び出し頻度を個別に設定する必要があります。

    基本的なアプローチは次のとおりです。

    1)1日1回の完全バックアップコピーの作成
    2)2〜4時間ごとの差分バックアップコピーの作成
    3)5〜60分ごとのトランザクションログバックアップコピーの作成

    通常、データベースはフェイルセーフでクイックアクセスシステムに参加していることに注意してください。また、後でトランザクションログのバックアップコピーを使用する場合は、手順に干渉しないことが非常に重要です。具体的には、これは、トランザクションログのコピーを複数の異なるプロセスで作成しないことを意味します。これが発生すると、これらのコピーからのバックアップシーケンスが失われます。

    ここでは、各データベースが一度に1つずつ順番に処理される例を見てきました。ただし、実稼働環境では並列処理を実現できます。これにより、複数のバックアップコピーを同時に作成できます。これには、いくつかの異なる方法でアプローチできます。たとえば、次のストアドプロシージャを呼び出します。

     USE [DB_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [inf]。[RunAsyncExecute](@sql nvarchar(max)、@jobname nvarchar(57)=null、@database nvarchar(128)=null、@owner nvarchar( 128)=null)AS BEGIN/*エージェントのジョブを介した非同期パッケージ実行RunAsyncExecute-T-SQLコマンドまたは保存されたプロシージャの非同期実行2012AntoninFoller、Motobit Software、www.motobit.com http://www.motobit.com/ Tips / detpg_async-execute-sql / * / SET NOCOUNT ON; @iduniqueidentifierを宣言します。 --名前が指定されていない場合は一意のジョブ名を作成しますif(@jobname is null)set @ jobname =''; set @jobname =@jobname +'_async_' + convert(varchar(64)、NEWID()); if(@owner is null)set @owner ='sa'; --新しいジョブを作成し、ジョブIDを取得します。msdb..sp_add_job@ jobname、@ example @ sqldat.com、@ [email protected]を実行します。出力; --ジョブ実行用のジョブサーバーを指定しますmsdb..sp_add_jobserver@[email protected]; -ジョブの最初のステップを指定します-SQLコマンド-(@ on_success_action =3 ...次のステップに進みます)msdb..sp_add_jobstep @ example @ sqldat.com、@ step_name ='Step1'、@command=を実行します@ sql、@ database_name =@ database、@ on_success_action =3; -ジョブの次のステップを指定します-ジョブを削除しますdeclare@deletecommandvarchar(200); set @deletecommand ='execute msdb..sp_delete_job @ job_name =''' [email protected] +''''; msdb..sp_add_jobstep @ example @ sqldat.com、@ step_name ='Step2'、@ command=@deletecommand;を実行します。 -ジョブを開始します。msdb..sp_start_job@[email protected]を実行します。 END GO 

    ここで、非同期は、エージェントジョブを動的に作成し、後で実行および削除することで実現されます。

    次に、別の/テスト環境で以前に作成されたバックアップコピーからデータベースを復元するための一般的なアルゴリズムを見てみましょう。

    1)復元するデータベースとそのバックアップコピーの場所を定義する
    2)データベースを復元する
    3)復元されたデータベースの整合性を確認する

    次に、完全バックアップコピーからデータベースを復元するアルゴリズムの実装について説明します。差分コピーの場合、手順は似ています。唯一の違いは、完全バックアップコピーを直接復元してから、差分コピーを復元する必要があることです。

    復元するデータベースとそのバックアップコピーの場所を定義するために、以下に示すように2つのテーブルを作成しましょう。

     USE [DB_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv]。[RestoreSettings]([DBName] [nvarchar](255)NOT NULL、[FullPathRestore] [nvarchar](255)NOT NULL、[DiffPathRestore] [nvarchar ](255)NOT NULL、[LogPathRestore] [nvarchar](255)NOT NULL、[InsertUTCDate] [datetime] NOT NULL、CONSTRAINT [PK_RestoreSettings] PRIMARY KEY CLUSTERED([DBName] ASC)WITH(PAD_INDEX =OFF、STATISTICS_NORECOMPUTE =OFF 、IGNORE_DUP_KEY =OFF、ALLOW_ROW_LOCKS =ON、ALLOW_PAGE_LOCKS =ON)ON [PRIMARY])ON [PRIMARY]; GOALTERTABLE[srv]。[RestoreSettings]ADDCONSTRAINT [DF_RestoreSettings_InsertUTCDate] DEFAULT(getutcdate())FOR [Insert / pre> 

    ここで、列の目的は[srv]。[BackupSettings]テーブルの列の目的と似ています。唯一の違いは、フルパスが復元用のバックアップコピーの検索に使用され、新しいコピーの作成には使用されないことです。

     USE [DB_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv]。[RestoreSettingsDetail]([Row_GUID] [uniqueidentifier] NOT NULL、[DBName] [nvarchar](255)NOT NULL、[SourcePathRestore] [nvarchar](255 )NOT NULL、TargetPathRestore [nvarchar](255)NOT NULL、[Ext] [nvarchar](255)NOT NULL、[InsertUTCDate] [datetime] NOT NULL、CONSTRAINT [PK_RestoreSettingsDetail] PRIMARY KEY CLUSTERED([Row_GUID] ASC)WITH( PAD_INDEX =OFF、STATISTICS_NORECOMPUTE =OFF、IGNORE_DUP_KEY =OFF、ALLOW_ROW_LOCKS =ON、ALLOW_PAGE_LOCKS =ON)ON [PRIMARY])ON [PRIMARY]; GOALTER TABLE[srv]。[RestoreSettingsDetail]ADDCONSTRAINT [DF_RestoreSettingsDetail_Row_ FOR [Row_GUID]; GOALTERTABLE[srv]。[RestoreSettingsDetail]ADDCONSTRAINT [DF_RestoreSettingsDetail_InsertUTCDate] DEFAULT(getutcdate())FOR [InsertUTCDate]; GO 

    このテーブルは、復元されるデータベースの完全なファイル名を定義するために必要であり、その後の転送に使用されます(たとえば、[SourcePathRestore] ='論理ファイル名'および[TargetPathRestore]='disk:\…\物理ファイル名'、while [Ext] ='ファイル拡張子')

    実際には、次のクエリを使用してデータベースファイルの論理名を定義できます。

     RESTORE FILELISTONLY FROM DISK ='disk:\ ... \ backup copy.BAK'; 

    ファイルにあるバックアップコピーに関する情報の取得は、次の方法で実行できます。

     RESTORE HEADERONLYFROM DISK ='disk:\ ... \ backup copy.BAK'; 

    次に、完全バックアップコピーからデータベースを復元し、データの整合性をチェックするために使用されるストアドプロシージャの実装があります。

    [expand title =”コード 「]

     USE [DB_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTERPROCEDURE[srv]。[RunFullRestoreDB]ASBEGIN/ *完全バックアップコピーからDBをリカバリし、DBの整合性をチェックします* / SET NOCOUNT ON; @dt datetime =DateAdd(day、-2、getdate());を宣言します。 @year int =YEAR(@dt);を宣言します。 @monthを宣言しますint=MONTH(@dt); @day int =DAY(@dt);を宣言します。 @hour int =DatePart(hour、@dt);を宣言します。 @minuteを宣言しますint=DatePart(minute、@dt); @secondを宣言しますint=DatePart(second、@dt); @pathBackup nvarchar(255);を宣言します。 @pathstr nvarchar(255);を宣言します。 @DBName nvarchar(255);を宣言します。 @backupName nvarchar(255);を宣言します。 @sql nvarchar(max);を宣言します。 @backupSetIdをintとして宣言します。 @FileNameLog nvarchar(255);を宣言します。 @SourcePathRestore nvarchar(255);を宣言します。 @TargetPathRestore nvarchar(255);を宣言します。 @Ext nvarchar(255);を宣言します。 @tblテーブルを宣言します([DBName] [nvarchar](255)NOT NULL、[FullPathRestore] [nvarchar](255)NOT NULL); @tbl_filesテーブルを宣言します([DBName] [nvarchar](255)NOT NULL、[SourcePathRestore] [nvarchar](255)NOT NULL、[TargetPathRestore] [nvarchar](255)NOT NULL、[Ext] [nvarchar](255) NOT NULL); --DB名のリストと完全バックアップコピーへのパスを取得して@tblに挿入します([DBName]、[FullPathRestore])select [DBName]、[FullPathRestore]from[srv]。[RestoreSettings]; --新しいDBファイルの場所に関する詳細情報を取得して@tbl_filesに挿入([DBName]、[SourcePathRestore]、[TargetPathRestore]、[Ext])select [DBName]、[SourcePathRestore]、[TargetPathRestore]、[Ext] from [ srv]。[RestoreSettingsDetail]; --以前に取得した各DBを処理しますwhile(exists(select top(1)1 from @tbl))begin set @ backupSetId =NULL; @tblからtop(1)@ DBName =[DBName]、@ pathBackup=[FullPathRestore]を選択します。 set @ example @ sqldat.com + N'_Full_backup _'+ cast(@year as nvarchar(255))+ N'_' + cast(@month as nvarchar(255))+ N'_'+ cast(@day as nvarchar(255))--+ N'_'-+ cast(@hour as nvarchar(255))+ N'_'+ cast(@minute as nvarchar(255))+ N'_'+ cast(@ nvarchar(255)として2番目); set @ example @ sqldat.comexample @ sqldat.com + N'.bak'; --バックアップクエリを作成して実行しますset@sql =N'RESTORE DATABASE ['[email protected]+N'_Restore] FROM DISK =N'+ N''''[email protected]+N''' '+ N'WITH FILE =1、'; while(exists(select top(1)1 from @tbl_files where [DBName] [email protected]))begin select top(1)@ SourcePathRestore =[SourcePathRestore]、@ TargetPathRestore =[TargetPathRestore]、@ Ext =[Ext] @tbl_filesから[DBName][email protected]; set @ example @ sqldat.com + N'MOVE N'+ N'''' [email protected] + N'''' + N'TO N'+ N'''' [email protected] + N ' _Restore.'[email protected] + N'''' + N'、'; @tbl_filesから削除します。ここで[DBName][email protected]および[SourcePathRestore][email protected]および[Ext][email protected];終了セット@example@ sqldat.com + N'NOUNLOAD、REPLACE、STATS =5'; exec(@sql); --DBの整合性セットをチェックします@sql=N'DBCC CHECKDB(N'+ N''''[email protected] +'_ Restore' + N'''' + N')WITH NO_INFOMSGS'; exec(@sql); @tblから削除します。ここで[DBName][email protected]; endEND 

    [/エキスパンド]

    復元に使用する完全バックアップコピーを指定するには、特別に構造化されたファイル名を使用します。

    _Full_backup_ _ _ .bak

    このデータベース復元プロセスを自動化するには、実装したストアドプロシージャの呼び出しを、Windowsタスクスケジューラ、エージェントジョブ、または同様の利用可能なサービスに配置する必要があります。

    次の表現を使用して、最新のデータベースバックアップコピーを確認できます。

     USE [DB_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATEVIEW[inf]。[vServerLastBackupDB]aswithbackup_cte as(selectbs。[database_name]、backup_type =casebs。[type]when'D'then'database' when'L 'then' log'when' I'then'differential'else' other'end、bs。[first_lsn]、bs。[last_lsn]、bs。[backup_start_date]、bs。[backup_finish_date]、cast(bs。[backup_size] as decimal(18,3))/ 1024/1024 as BackupSizeMb、rownum =row_number()over(partition by bs。[database_name]、type order bybs。[backup_finish_date]desc)、LogicalDeviceName =bmf。[​​logical_device_name]、PhysicalDeviceName =bmf。[​​physical_device_name]、bs。[server_name]、bs。[user_name] FROM msdb.dbo.backupset bs INNER JOIN msdb.dbo.backupmediafamily bmfON[bs]。[media_set_id]=[media_set_id]) [server_name]を次のように選択します[ServerName]、[database_name] as [DBName]、[user_name] as [USerName]、[backup_type] as [BackupType]、[backup_start_date] as [BackupStartDate]、[backup_finish_date] as [BackupFinishDate]、[BackupSizeMb]、-非圧縮サイズ[LogicalDeviceName]、[PhysicalDeviceName]、[first_lsn] as [FirstLSN]、[last_lsn] as [LastLSN] from backup_ctewhere rownum =1; 

    結果

    このガイドでは、あるサーバーでの自動バックアッププロセスの実装と、その結果として別のサーバー(たとえば、テストサーバー)での復元について説明しました。

    この方法により、バックアップコピーの作成プロセスを自動化し、バックアップコピーを復元して確認し、上記のプロセスを微調整することができます。

    出典:

    バックアップ
    復元
    バックアップセット
    CHECKDB
    SHRINKFILE
    sys.master_files


    1. PostgreSQL一時テーブル

    2. 旅行ウェブサイトデータベースを設計する方法

    3. postgresクレートを使用してクエリによって返されるオプションの値を処理するにはどうすればよいですか?

    4. MySQLでRBACのデータベースを設計するためのガイド