ホームページ  >  記事  >  データベース  >  データベースのリモート完全バックアップのソリューション

データベースのリモート完全バックアップのソリューション

黄舟
黄舟オリジナル
2016-12-15 16:01:331063ブラウズ

リモート完全データベースバックアップのためのソリューション

--exec BackUPDatabase_MaJiatao 'pubs','\XZ154ABC$','16:50:00.000',1,'XZ154MaJiatao','MaJiatao'/***************************************************説明する:データベースのフル バックアップと増分バックアップ 作成者: Ma Jiatao 修正者: 2014-02-12: 1. ローカル パスとリモート パスを選択するためのバックアップ パスを追加しました。 2. 履歴バックアップ レコードを保存する方法を変更し、バックアップ レコードを保存する必要がなくなりました。ローカルハードディスク 記憶媒体として使用するファイル上のテキストファイル*********************************** ******* *********** /if object_id('BackUPDatabase_MaJiatao') は nulldrop PRoc BackUPDatabase_MaJiatao

GO

alter proc BackUPDatabase_MaJiatao@database_name sysname,--バックアップするデータベースの名前@physical_backup_device_name sysname,--バックアップ ファイルの格納ディレクトリ@all_backup_datetime char(17) )=' 20:00:00.000',--完全なバックアップ時間@IntDistance int=1,--完全なバックアップ時間範囲 (時間)@UserName varchar(100),--リモート サーバーのログイン名@PassWord varchar(100)= ' '--ENCRYPTION を使用したリモート サーバーのログイン パスワード as

/**********************************declare @database_name sysname,--バックアップするデータベースの名前 @physical_backup_device_name sysname ,--backup ファイル格納ディレクトリ @all_backup_datetime char(17)select @database_name='test',@physical_backup_device_name='E:バックアップファイルクエリサーバー',@all_backup_datetime='16:00:00.000'

***** ***** *****************************/

--バックアップ履歴が存在しない場合は作成します (select * from dbo.sysobjects where id = object_id(N'backup_recorder') および OBJECTPROPERTY (id, N'IsUserTable') = 1) exec('CREATE TABLE Backup_recorder (backup_datetime datetime not null,backup_name varchar (500) PRIMARY KEY,backup_path varchar (500) NOT NULL ,is_all_backup char(1) not null デフォルト 0,file_is_exists char(1) not null デフォルト 0)')elsebeginif not存在(select * from syscolumns where name='file_is_exists' and ID=object_id(N'backup_recorder'))begindrop table backup_recorderexec('CREATE TABLE Backup_recorder (backup_datetime datetime not null, backup_name varchar (500) PRIMARY KEY,backup_path varchar (500) NOT NULL 、is_all_backup char(1) not null デフォルト 0,file_is_exists char(1) not null デフォルト 0)')endend

declare @backup_set_full sysname,@backup_set sysname, --バックアップ ファイル名 @backup_name sysname

declare @Return_Int intdeclare @CommandText nvarchar(4000)declare @DelFilePathName nvarchar(4000)

declare @physical_backup_device_name_now nvarchar(4000)

debackclare @physical_device_name backn varchar(4000)

nullの場合( @database_name,'')='' または rtrim(@database_name)='' -- データベース名は空です set @database_name=db_name() -- 現在のデータベースをバックアップします

if isnull(@physical_backup_device_name,'' )='' または rtrim(@physical_backup_device_name)='' -- バックアップ ディレクトリが空です。システムのデフォルト ディレクトリを使用します beginSELECT @physical_backup_device_name=ltrim(rtrim(reverse(filename))) FROM master.dbo.sysdatabases where name=@ Database_nameset @physical_backup_device_name=reverse( substring(@physical_backup_device_name,charindex('',@physical_backup_device_name)+5,260))+'backup'end

-- パスがネットワーク パスであるか、残っている場合はローカル パスであるかを判断します(@physical_backup_device_name, 2)='\' および ltrim( rtrim(@UserName))<>'' および ltrim(rtrim(@Password))<>''beginselect @CommandText='net use '+@physical_backup_device_name+' "' +@Password+'" /user:' + @UserName exec master.. 0 -- ディレクトリが存在しません。作成開始選択 @CommandText='Mkdir '+@physical_backup_device_name+'フル バックアップ'exec @Return_Int=master..xp_cmdshell @CommandText , no_outputend

select @CommandText='dir '+@physical_backup_device_name+'差分バックアップ' exec @Return_Int=master..xp_cmdshell @CommandText, no_outputif @Return_Int<>0 --ディレクトリが存在しません。作成開始elect @CommandText=' Mkdir '+@physical_backup_device_name+'差分バックアップ'exec @Return_Int=master..xp_cmdshell @CommandText, no_outputend

select @physical_backup_device_name_now=@database_name+'_'+ltrim(rtrim(REPLACE(REPLACE(REPLACE(REPLACE(convert(char(23) ),getdate(),21),'-',''),':' ,''),'.',''),' ','')))+'.bak'

if object_id ('tempdb..#backup_recorder') は null ではありませんdrop table #backup_recorderCREATE TABLE #backup_recorder (backup_datetime datetime not null,backup_name varchar (500) PRIMARY KEY,backup_path varchar (500) NOT NULL 、is_all_backup char(1) not null デフォルト 0、 file_is_exists char(1) not null デフォルト 0)

--完全バックアップが存在するかどうかを確認します select @CommandText='dir '+@physical_backup_device_name+'Full Backup*.bak'exec @Return_Int=master..xp_cmdshell @CommandText, no_output

if @Return_Int<>0 --いいえ完全バックアップ ファイルが存在します。完全バックアップを実行します。 beginselect @backup_set_full='full backup'+@database_nameselect @physical_backup_device_namebackup=@physical_backup_device_name+'full backup'+@physical_backup_device_name_now

--完全バックアップ、メディア ヘッダー BACKUP DATABASE @database_name を DISK に書き換えます=@ Physical_backup_device_namebackup WITH FORMAT ,NAME = @backup_set_fullif @@error=0--バックアップは成功しました。その日の完全バックアップが開始される前にすべての履歴バックアップ ファイルを削除します--backup_recorder にバックアップ ログを書き込みます(backup_datetime,backup_name,backup_path,is_all_backup, file_is_exists)values(getdate(),@physical_backup_device_name_now,@physical_backup_device_namebackup,'1','1')insert into #backup_recorder(backup_datetime,backup_name,backup_path,is_all_backup,file_is_exists)selectbackup_datetime,backup_name,backup_path,is_all_backup,file_is_exists frombackup_recorderwhere バックアップ名< &g t;@physical_backup_device_name_now および is_all_backup='1' および file_is_exists='1'endendelsebegin--完全バックアップがある場合は、その完全バックアップが前日の指定された時刻であるかどうかを確認します--select @all_backup_datetime=REPLACE(REPLACE( @all_backup_datetime,':','') ,'.','')if right(left(right(@physical_backup_device_name_now,21),17),9) between REPLACE(REPLACE(@all_backup_datetime,':','') ),'.','') および REPLACE(REPLACE(substring(convert(char(23),dateadd(hh,@IntDistance,@all_backup_datetime),21),12,12),':',''), '.','')--続行 完全バックアップを開始しますelect @backup_set_full='完全バックアップ'+@database_nameselect @physical_backup_device_namebackup=@physical_backup_device_name+'完全バックアップ'+@physical_backup_device_name_now--完全バックアップ、メディア ヘッダーを書き換えます BACKUP DATABASE @database_name を DISK に書き込みます=@physical_backup_device_namebackup WITH FORMAT ,NAME = @backup_set_fullif @@error=0--バックアップ成功開始--backup_recorder(backup_datetime,backup_name,backup_path,is_all_backup,file_is_exists)values(getdate(),@physical_backup_device_name_now,@physical_backup_device_namebackup にバックアップ ログを書き込みます,'1','1')- -履歴バックアップ ファイルを検索#backup_recorder(backup_datetime,backup_name,backup_path,is_all_backup,file_is_exists)selectbackup_recorderwherebackup_name<>@physical_backup_device_name_now および_バックアップ=' 1' および file_is_exists=' 1'endendelse -- 現在のバックアップ時間が指定された完全バックアップ時間未満であるため、差分バックアップを実行します

select @backup_set_full='増分バックアップ'+@database_nameselect @physical_backup_device_namebackup=@physical_backup_device_name+'差分バックアップ' +@physical_backup_device_name_now--差分バックアップ、メディアを追加します BACKUP DATABASE @database_name to DISK=@physical_backup_device_namebackup WITH NOINIT, DIFFERENTIAL,NAME = @backup_setif @@error=0--バックアップ成功の開始--backup_recorder(backup_datetime,backup_name) にバックアップ ログを書き込みます,backup_path,is_all_backup,file_is_exists)values(getdate( ),@physical_backup_device_name_now,@physical_backup_device_namebackup,'0','1') -- #backup_recorder に挿入される履歴バックアップ ファイルを検索します(backup_datetime,backup_name,backup_path,is_all_backup,file_is_exists)selectbackup_datetime ,backup_name,backup_path,is_all_backup,file_is_existsfrombackup_recorderwherebackup_name>@physical_backup_device_name_now and is_all_backup='0' and file_is_exists='1'endendend

DECLARE DelFilePathName CURSOR FORWARD_ONLY FOR select Backup_path From #backup_recorder OPEN Del FilePathNameFETCH NEXT FROM DelFilePathName into @DelFilePathNameWHILE @@ fetch_status = 0beginifが存在する(backup_recorderからbackup_path = @delfilepathname&lt;&gt; @physical_backup_device_name_now) = 0 beginupdate Backup_recorder set file_is_exists=0 where backup_path=@DelFilePathNameendendFETCH NEXT FROM DelFilePathName into @DelFilePathNameendCLOSE DelFilePathNameDEALLOCATE DelFilePathName

if object_id('tempdb..#backup_recorder') is not nulldrop table #backup_recorder

if left(@physical_backup_デバイス名,2)=' \' および ltrim(rtrim(@UserName))<>'' および ltrim(rtrim(@Password))<>''@CommandText='ネット共有 '+@physical_backup_device_name+' /delete'exec マスターの選択を開始します。 .xp_cmdshell @CommandText,no_outputend

上記はデータベース リモート完全バックアップのソリューションです。その他の関連記事については、PHP 中国語 Web サイト (www.php.cn) に注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。