跨服务器 backup

USE MASTER
GO
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE WITH OVERRIDE;
GO
EXEC MASTER ..xp_cmdshell 'net use \\firstshare.cn\Share\FaciShareDataBackup\SQLBackupData01 "123456789" /user:FirstShare\FSSvc9999'
GO


-- =============================================
-- Author:		ZHAOWENZHONG
-- Create date: 2015-03-31
-- Description:	Database Backup
-- =============================================
CREATE PROCEDURE [dbo].[PRO_BACKUP_DB]
(
@Instance nvarchar(128)=NULL,
@DB_NAME SYSNAME,
@TYPE  VARCHAR(12), --FULL DIFF LOG
@BACK_PATH VARCHAR(512)
)
WITH ENCRYPTION
AS
--version1.1
BEGIN
	SET NOCOUNT ON

	DECLARE @BACKUP_FULL_SQL NVARCHAR(1280)
	DECLARE @BACKUP_DIFF_SQL NVARCHAR(1280)
	DECLARE @BACKUP_LOG_SQL NVARCHAR(1280)
	DECLARE @DATE_SERIAL_NUMBER NVARCHAR(16)

	IF @Instance IS NULL
	BEGIN
		SET @Instance=@@SERVICENAME
	END
	SET @DATE_SERIAL_NUMBER='_'+''+CONVERT(varchar(8), GETDATE(), 112)+ replace(convert(char(5), getdate(), 108), ':', '')+'' 
	IF @DB_NAME IS NULL
	BEGIN
		PRINT 'Database Does not Exist'
		RETURN	1;
	END
	IF NOT EXISTS(SELECT NAME FROM MASTER.SYS.DATABASES WHERE NAME=@DB_NAME)
	BEGIN
		PRINT '[' + @DB_NAME + '] is not a valid database name!'
		RETURN 1;
	END

	IF @TYPE NOT IN ('FULL','DIFF','LOG')
	BEGIN
		PRINT 'Database backup type must be [full], [log] or [diff]!'
		RETURN 1;
	END

	DECLARE @EXISTS_INSTANCE_SQL NVARCHAR(512)
	DECLARE @EXISTS_INSTANCE_FOLDER TABLE(COL NVARCHAR(512))
	DECLARE @EXISTS_FOLDER TABLE(COL NVARCHAR(512))
	DECLARE @EXISTS_SQL NVARCHAR(512)
	DECLARE @EXISTS_SHAREFLODER_SQL NVARCHAR(512)
	DECLARE @MKDIR_SQL NVARCHAR(512)
	DECLARE @MKDIR_INSTANCE_SQL NVARCHAR(512)

	SET @EXISTS_SHAREFLODER_SQL=N'EXEC MASTER..XP_CMDSHELL ''DIR'+CHAR(9)+''+@BACK_PATH+''''
	SET @EXISTS_INSTANCE_SQL=N'EXEC MASTER..XP_CMDSHELL ''DIR'+CHAR(9)+''+@BACK_PATH+'\'+@Instance+''''
	SET @EXISTS_SQL=N'EXEC MASTER..XP_CMDSHELL ''DIR'+CHAR(9)+''+@BACK_PATH+'\'+@Instance+'\'+@DB_NAME+''''
	SET @MKDIR_INSTANCE_SQL=N'EXEC MASTER..XP_CMDSHELL ''MKDIR'+CHAR(9)+''+@BACK_PATH+'\'+@Instance+''', NO_OUTPUT'
	SET @MKDIR_SQL=N'EXEC MASTER..XP_CMDSHELL ''MKDIR'+CHAR(9)+''+@BACK_PATH+'\'+@Instance+'\'+@DB_NAME+''', NO_OUTPUT'

	INSERT INTO @EXISTS_FOLDER EXEC SP_EXECUTESQL @EXISTS_SHAREFLODER_SQL,N'@BACK_PATH NVARCHAR(128)',@BACK_PATH
	IF EXISTS (SELECT 1 FROM @EXISTS_FOLDER WHERE COL LIKE '%File Not Found%')
	BEGIN
		PRINT '['+@BACK_PATH+'] is not a valid !'
		RETURN 2;
	END
	INSERT INTO @EXISTS_INSTANCE_FOLDER EXEC SP_EXECUTESQL @EXISTS_INSTANCE_SQL,N'@BACK_PATH NVARCHAR(128),@Instance NVARCHAR(128)',@BACK_PATH,@Instance
	IF EXISTS (SELECT 1 FROM @EXISTS_INSTANCE_FOLDER WHERE COL LIKE '%File Not Found%')
	BEGIN
		EXEC SP_EXECUTESQL @MKDIR_INSTANCE_SQL,N'@BACK_PATH NVARCHAR(128),@Instance NVARCHAR(128)',@BACK_PATH,@Instance
	END
	INSERT INTO @EXISTS_FOLDER EXEC SP_EXECUTESQL @EXISTS_SQL,N'@BACK_PATH NVARCHAR(128),@Instance NVARCHAR(128),@DB_NAME NVARCHAR(128)',@BACK_PATH,@Instance,@DB_NAME
	IF EXISTS(SELECT 1 FROM @EXISTS_FOLDER WHERE COL LIKE '%File Not Found%')
	BEGIN
		EXEC SP_EXECUTESQL @MKDIR_SQL,N'@BACK_PATH NVARCHAR(128),@Instance NVARCHAR(128),@DB_NAME NVARCHAR(128)',@BACK_PATH,@Instance,@DB_NAME
	END
	IF RIGHT(@BACK_PATH,1)='\'
	BEGIN
		SET @BACK_PATH=LEFT(@BACK_PATH,LEN(@BACK_PATH)-1)
	END


	DECLARE @ERROR INT
	DECLARE @BACKUP_FILENAME VARCHAR(512)
	DECLARE @BACKUP_BEGIN DATETIME
		IF @TYPE='FULL'
		BEGIN
			SET @BACKUP_FULL_SQL=N'BACKUP DATABASE'+CHAR(9)+'['+@DB_NAME+']'+CHAR(9)
								+'TO DISK= '''+@BACK_PATH+'\'+@Instance+'\'+@DB_NAME+'\'+@DB_NAME+@DATE_SERIAL_NUMBER+'.BAK'''+CHAR(9)+'WITH NOFORMAT, NOINIT,'
								+'NAME=N'''+@DB_NAME+'-FULL Database Backup'', SKIP, NOREWIND, NOUNLOAD,  STATS = 10'
			SET @BACKUP_FILENAME=@DB_NAME+@DATE_SERIAL_NUMBER+'.BAK'
			--EXEC (@BACKUP_FULL_SQL)
			SET @BACKUP_BEGIN=GETDATE()
			EXEC SP_EXECUTESQL @BACKUP_FULL_SQL,N'@DB_NAME NVARCHAR(128),@BACK_PATH NVARCHAR(128),@Instance NVARCHAR(128),@DATE_SERIAL_NUMBER NVARCHAR(16)',@DB_NAME,@BACK_PATH,@Instance,@DATE_SERIAL_NUMBER
			SET @ERROR=@@ERROR
		END
		IF @TYPE='DIFF'
		BEGIN
			SET @BACKUP_DIFF_SQL=N'BACKUP DATABASE'+CHAR(9)+'['+@DB_NAME+']'+CHAR(9)
								+'TO DISK= '''+@BACK_PATH+'\'+@Instance+'\'+@DB_NAME+'\'+@DB_NAME+@DATE_SERIAL_NUMBER+'.DIFF'''+CHAR(9)+'WITH  DIFFERENTIAL , NOFORMAT, NOINIT,'
								+'NAME=N'''+@DB_NAME+'-Differential Database Backup'', SKIP, NOREWIND, NOUNLOAD,  STATS = 10'
			SET @BACKUP_FILENAME=@DB_NAME+@DATE_SERIAL_NUMBER+'.DIFF'
			--EXEC (@BACKUP_DIFF_SQL)
			SET @BACKUP_BEGIN=GETDATE()
			EXEC SP_EXECUTESQL @BACKUP_DIFF_SQL,N'@DB_NAME NVARCHAR(128),@BACK_PATH NVARCHAR(128),@Instance NVARCHAR(128),@DATE_SERIAL_NUMBER NVARCHAR(16)',@DB_NAME,@BACK_PATH,@Instance,@DATE_SERIAL_NUMBER
			SET @ERROR=@@ERROR
		END
		IF @TYPE='LOG'
		BEGIN
			SET @BACKUP_LOG_SQL=N'BACKUP LOG'+CHAR(9)+'['+@DB_NAME+']'+CHAR(9)
								+'TO DISK= '''+@BACK_PATH+'\'+@Instance+'\'+@DB_NAME+'\'+@DB_NAME+@DATE_SERIAL_NUMBER+'.TRN'''+CHAR(9)+'WITH NOFORMAT, NOINIT,'
								+'NAME=N'''+@DB_NAME+'-Transaction Log Backup'', SKIP, NOREWIND, NOUNLOAD,  STATS = 10'
			SET @BACKUP_FILENAME=@DB_NAME+@DATE_SERIAL_NUMBER+'.TRN'
			--EXEC (@BACKUP_LOG_SQL)
			SET @BACKUP_BEGIN=GETDATE()
			EXEC SP_EXECUTESQL @BACKUP_LOG_SQL,N'@DB_NAME NVARCHAR(128),@BACK_PATH NVARCHAR(128),@Instance NVARCHAR(128),@DATE_SERIAL_NUMBER NVARCHAR(16)',@DB_NAME,@BACK_PATH,@Instance,@DATE_SERIAL_NUMBER
			SET @ERROR=@@ERROR
		END
		IF @ERROR=0
		BEGIN
			--INSERT INTO DBA_Maintenance.dbo.db_backup_record select @DB_NAME,@BACKUP_BEGIN,getdate(), @BACK_PATH+'\'+@Instance+'\'+@DB_NAME,@TYPE,@BACKUP_FILENAME,0  --version 1.0
			INSERT INTO DBA_Maintenance.dbo.db_backup_record select @DB_NAME,@BACKUP_BEGIN,getdate(), @BACK_PATH+'\'+@Instance+'\'+@DB_NAME+'\'+@BACKUP_FILENAME,@TYPE,0  --version 1.1
		END

	SET NOCOUNT OFF
END

GO


你可能感兴趣的:(跨服务器 backup)