원격 전체 데이터베이스 백업을 위한 솔루션
--exec BackUPDatabase_MaJiatao 'pubs','\XZ154ABC$','16:50:00.000',1,'XZ154MaJiatao','MaJiatao'/ ** *************************************************설명하다 :데이터베이스 전체 백업 및 증분 백업 작성자: Ma Jiatao 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)=''--
/*********************************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'
* **** **********************************/
으로 암호화된 원격 서버 로그인 비밀번호--다음과 같은 경우 백업 기록을 설정합니다. 존재하지 않음(id = object_id(N'backup_recorder') 및 OBJECTPROPERTY(id, N'IsUserTable') = 1인 dbo.sysobjects에서 * 선택) 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) null이 아님 기본값 0,file_is_exists char(1) null이 아님 기본값 0)')elsebeginif 존재하지 않음(name='file_is_exists' 및 ID= object_id인 syscolumns에서 * 선택) (N'backup_recorder'))begindrop 테이블 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) null이 아님 기본값 0)')endend
declare @backup_set_full sysname,@backup_set sysname,--백업 파일 이름 @backup_name sysname
declare @Return_Int intdeclare @CommandText nvarchar(4000) 선언 @DelFilePathName nvarchar(4000)
@physical_backup_device_name_now nvarchar(4000) 선언
@physical_backup_device_namebackup nvarchar(4000)
if isnull(@database_name,'')=' ' 선언 또는 rtrim(@database_name)=''--데이터베이스 이름이 비어 있습니다. set @database_name=db_name()--현재 데이터베이스를 백업합니다.
if isnull(@physical_backup_device_name,'')='' 또는 rtrim (@ Physical_backup_device_name)=''--백업 디렉터리가 비어 있습니다. 시스템 기본 디렉터리를 사용하십시오. startSELECT @physical_backup_device_name=ltrim(rtrim(reverse(filename))) FROM master.dbo.sysdatabases 여기서 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:' +@UserNameexec master..xp_cmdshell @CommandText,no_outputend
--디렉토리가 존재하는지 확인 @CommandText='dir '+@physical_backup_device_name+'전체 백업'exec @Return_Int=master를 선택합니다. ..xp_cmdshell @CommandText, no_outputif @ Return_Int<>0 --디렉토리가 존재하지 않습니다. 생성 startselect @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 --디렉토리가 존재하지 않습니다. Beginselect @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'
--전체 백업이 있는지 확인 @CommandText='dir '+@physical_backup_device_name+'Full backup*.bak'exec @Return_Int=master..xp_cmdshell @CommandText, no_output
if @Return_Int< >0 --전체 백업 파일이 없습니다. 전체 백업을 수행합니다. startselect @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 FORMAT ,NAME = @backup_set_fullif @@error=0--백업 성공, 당일 전체 백업 전에 모든 기록 백업 파일 삭제 시작--backup_recorder(backup_datetime)에 백업 로그 삽입 쓰기 , backup_name,backup_path,is_all_backup,file_is_exists)값(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)backup_datetime,backup_name,backup 선택 _경로 , is_all_backup,file_is_existsfrom backup_recorder여기서 backup_name<>@physical_backup_device_name_now and is_all_backup='1' and file_is_exists='1'endendelsebegin--전체 백업이 있습니다. 전체 백업이 전날 지정된 시간 이후인지 확인하십시오--@ 선택 all_backup_datetime=REPLACE(REPLACE( @all_backup_datetime,':',''),'.','')if right(left(right(@physical_backup_device_name_now,21),17),9) 사이 REPLACE(REPLACE(@all_backup_datetime, ':','' ),'.','') 및 REPLACE(REPLACE(substring(convert(char(23),dateadd(hh,@IntDistance,@all_backup_datetime),21),12,12),': ',''), '.','')--전체 백업 수행 Beginselect @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 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)에 삽입된 기록 백업 파일 찾기backup_datetime,backup_name,backup_path,is_all_backup,file_is_existsfrom backup_recorderwhere _이름<> ;@physical_backup_device_name_now 및 is_all_backup= '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 )backup_datetime,backup_name,backup_path,is_all_backup,file_is_existsfrom backup_recorder여기서 backup_name<>@physical_backup_device_name_now 및 is_all_backup='0' file_is_exists='1'endendend
DE CLARE DelFilePathName 커서 FORWARD_ONLY FOR select backup_path From # backup_recorder OPEN DelFilePathNameFETCH NEXT FROM DelFilePathName into @DelFilePathNameWHILE @@FETCH_STATUS = 0beginif exists(select *from backup_recorder where backup_path=@DelFilePathName and backup_name<>@physical_backup_device_name_now)beginselect @CommandText='del '+@DelFilePathNameexecute @Return_Int= master..xp_cmdshell @Com mandText-- ,no_outputif @Return_Int=0 startupdate backup_recorder set file_is_exists=0 여기서 backup_path=@DelFilePathNameendendFETCH NEXT FROM DelFilePathName into @DelFilePathNameendCLOSE DelFilePathNameDEALLOCATE DelFilePathName
if object_id('tempdb..#backup_recorder) ' )는 nulldrop 테이블이 아닙니다 #backup_recorder
left(@physical_backup_device_name,2)='\' 및 ltrim(rtrim(@UserName))<>'' 및 ltrim(rtrim(@Password))< ;>''beginselect @CommandText= 'net share '+@physical_backup_device_name+' /delete'exec master..xp_cmdshell @CommandText,no_outputend
위는 원격 전체 데이터베이스 백업을 위한 솔루션입니다. , PHP 중국어 웹사이트(m.sbmmt.com)를 주목해주세요!