实战:sqlserver 2008 R2容灾方案:另一种思路-1

实战:sqlserver 2008 R2容灾方案:另一种思路-1,第1张

概述自己的定义的容灾方案,可以根据自己的需要自己定义. 1.源数据库备份数据   说明:  使用方法:exec master.dbo.fullbackup1 's:\backup','suzhou','full'  0.备份类型只能是full、diff或log,数据库名不能为空 1.通过新建一个历史表记录每次备份内容 2.检查数据库版本是否为2005以上 3.检查当前用户是否有权限完成备份  4.会自

自己的定义的容灾方案,可以根据自己的需要自己定义.

1.源数据库备份数据

 

说明:
 使用方法:exec master.dbo.fullbackup1 's:\backup','suzhou','full'


 0.备份类型只能是full、diff或log,数据库名不能为空

1.通过新建一个历史表记录每次备份内容

2.检查数据库版本是否为2005以上

3.检查当前用户是否有权限完成备份


 4.会自动检查指定盘符是否存在

5.检查指定格式是否为s:\

6.如果指定的备份目录不存在proc将自动新建,根据备份类型为full、diff或log

7.检查备份数据库名suzhou是否存在并联机

8.检查备份数据库名suzhou不能是临时数据库

9.如果备份类型为差异备份则检查是否有完全备份存在并且备份的这个文件存在于指定的目录下,
 如果备份历史表有记录但是该备份文件不存在将终止备份

10.如果备份类型为日志备份,先检查数据库恢复模式是否为完整,否则将停止备份;
 将进一步检查备份历史表和备份文件,必须存在完全备份或差异备份,否则终止备份

 


 USE [msdb]
 GO
 if OBJECT_ID('backuphistory')is not null
 drop table backuphistory
 go
 CREATE table [dbo].[backuphistory](
  [sID] [int] IDENTITY(1,1) NOT NulL primary key,
  [dbname] [sysname] NOT NulL,
  [backtype] [char](2) NOT NulL,
  [lastbackup] [datetime] NOT NulL,
  [backupdesc] [varchar](20) NOT NulL,
  [backupfilename] [nvarchar](max) NulL,
 )
 GO

use master
 go
 create PROCEDURE [dbo].[fullbackup1]
 (
 @backupPath varchar(500),
 @dbname sysname,
 @backuptype varchar(100)
 )
 with encryption
 as

declare @currentuser sysname
 declare @role varchar(30)
 select   @currentuser=system_user

DECLARE @Version numeric(18,10)
 DECLARE @Error int
 declare @Directory nvarchar(100)
 DECLARE @CheckDirectory nvarchar(4000)
 DECLARE @DirectoryInfo table (fileExists bit,
                                 fileIsADirectory bit,
                                 ParentDirectoryExists bit)
 DECLARE @ErrorMessage nvarchar(max)
 DECLARE @backupPath2 nvarchar(500)
 DECLARE @DirTree table (subdirectory nvarchar(255),depth INT)
 DECLARE @FullPath varchar(1000)
 declare @backupPath3 nvarchar(500)
 declare @recovery_model_desc varchar(20)
 declare @backtype varchar(100)
 declare @backupdesc varchar(20)
 declare @backupfilename varchar(max)

-----new
 DECLARE @tmp table (backupfilename varchar(3000),
                                 backuptime datetime)
 declare @fullbafile varchar(3000)
 declare @result int
 declare @log_start int


 set nocount on

--检查用户权限
 select @role=srvrole from
 (
 select SrvRole = g.name,Membername = u.name
   from sys.server_principals u,sys.server_principals g,sys.server_role_members m
  where g.principal_ID = m.role_principal_ID
    and u.principal_ID = m.member_principal_ID
    and u.name=@currentuser
    ) c
   --order by 1,2
 if @role !='sysadmin' or @role is null or @role=''
 begin
   RAISERROR('当前用户没有需要的权限完成备份!',16,1)
   print '你可能是越权 *** 作或其它!'+char(13)+'请联系DBA!'
   SET @Error = @@ERROR
   return
 end


 --检查服务器版本
 SET @Error = 0
 SET @Version = CAST(left(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max)),
 CHARINDEX('.',CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max))) - 1) + '.'
 + REPLACE(RIGHT(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max)),
 LEN(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max))) - CHARINDEX('.',
 CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max)))),'.','') AS numeric(18,10))
 IF @Version < 9
 BEGIN
   RAISERROR('该备份方案仅支持 sql Server 2005,sql Server 2008和sql Server 2008 R2.',1)
   SET @Error = @@ERROR
   return
 END

 

set @Directory=@backupPath

--判断路径&#26684;式
   IF NOT (@Directory liKE '[a-z]:\%' )
   BEGIN
     SET @ErrorMessage = '输入的目录'&#43;@Directory&#43;'&#26684;式'&#43; '不支持!.'&#43;' 参考类型如: s:\backup' &#43; CHAR(13) &#43; CHAR(10)
     RAISERROR(@ErrorMessage,1) WITH NowAIT
     SET @Error = @@ERROR
     return
   END

--判断输入的数据库名是否存在

  IF @dbname not in(select name from sys.databases)
   BEGIN
     SET @ErrorMessage = '数据库名: '&#43;@dbname&#43;' 不存在!.' &#43; CHAR(13) &#43; CHAR(10)
     RAISERROR(@ErrorMessage,1) WITH NowAIT
     SET @Error = @@ERROR
     return
   END


 --判断输入的盘符是否存在和是否新建目录
 --检查指定盘符是否存在

SET @CheckDirectory = substring(@Directory,1,3)
 INSERT INTO @DirectoryInfo (fileExists,fileIsADirectory,ParentDirectoryExists)
 EXECUTE [master].dbo.xp_fileexist @CheckDirectory
 IF NOT EXISTS (SELECT * FROM @DirectoryInfo WHERE fileExists = 0 AND fileIsADirectory = 1 AND ParentDirectoryExists = 1)
   BEGIN
     SET @ErrorMessage = '服务器上不存在指定的盘符:'&#43;upper(substring(@CheckDirectory,1)&#43; CHAR(13) &#43; CHAR(10))
     RAISERROR(@ErrorMessage,1) WITH NowAIT
     SET @Error = @@ERROR
     return
  END

 

--判断是否输入备份数据库名
 IF @dbname IS NulL OR @dbname = ''
   BEGIN
     SET @ErrorMessage = '未输入任何备份数据库名.' &#43; CHAR(13) &#43; CHAR(10)&#43;'备份进程已终止!'
     RAISERROR(@ErrorMessage,1) WITH NowAIT
     SET @Error = @@ERROR
     return
   END

else if (@dbname='tempdb' or @dbname='TEMPDB')
  begin
  SET @ErrorMessage = '临时数据库不需要备份.' &#43; CHAR(13) &#43; CHAR(10)&#43;'备份进程已终止!'
     RAISERROR(@ErrorMessage,1) WITH NowAIT
     SET @Error = @@ERROR
     return
  end
 else if (@dbname  in ( select name from sys.databases where state_desc='OFFliNE' or state_desc='offline'))
  begin
  SET @ErrorMessage = '脱机的数据库'&#43;@dbname&#43;'不需要备份.' &#43; CHAR(13) &#43; CHAR(10)&#43;'备份进程已终止!'
     RAISERROR(@ErrorMessage,1) WITH NowAIT
     SET @Error = @@ERROR
     return
  end

--判断输入类型
 if  @backuptype not in ('full','diff','log')
 begin
  print '#########################严重警告###############严重警告#################################'
  print '不支持类型'&#43;@backuptype&#43;'!   只能输入(full:完全备份; diff:差异备份; log:日志备份)                        '
  print '有问题请联系ocpyang!'
  print '#########################严重警告###############严重警告###################################'
  return
 end

 

--判断目录是否存在
 SET @backupPath2=@backupPath&#43;'\'&#43;@dbname
 INSERT INTO @DirTree(subdirectory,depth)
 EXEC master.sys.xp_dirtree @backupPath
 IF NOT EXISTS (SELECT 1 FROM @DirTree WHERE subdirectory = @DBname)
 begin
  print '系统将新建目录:'&#43;@backupPath2&#43;' ............' 
    EXEC master.dbo.xp_create_subdir @backupPath2
    print '目录:'&#43;@backupPath2&#43;'新建成功!'
    print '         '
    delete from  @DirTree
 end
 else
 begin
  print '----------------------------------------------------------------------- '
  print '目录:'&#43;@backupPath2&#43;'已经存在!'
  print '                                                                        '&#43;char(13)&#43;'备份运行中$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'
  print '----------------------------------------------------------------------- '
  delete from  @DirTree
 end


 --开始完全备份
 if @backuptype='full'
 begin
 print '.............................................................................'
 print '开始完全备份.....请稍等'
 print '.............................................................................'
 --隐藏检查目录
 set @backupPath3=@backupPath2&#43;'\'&#43;'full'
 INSERT INTO @DirTree(subdirectory,depth)
 EXEC master.sys.xp_dirtree @backupPath3
 IF NOT EXISTS (SELECT 1 FROM @DirTree WHERE subdirectory = @backupPath3)
 EXEC master.dbo.xp_create_subdir @backupPath3
 delete from @DirTree
 set @FullPath = @backuppath3&#43;'\'&#43;@dbname&#43;'_'&#43;@backuptype&#43;'_'&#43;replace(replace(replace(convert(varchar,getdate(),20),'-',''),' ',':','')&#43; '.bak'
 backup database @dbname to disk=@FullPath
 WITH buffercount = 20,maxtransfersize = 2097152,
 COMPRESSION,RETAINDAYS=15,NOFORMAT,NOINIT,
 name=N'完整备份',SKIP,norEWIND,
 NOUNLOAD,STATS=10

set @backtype='D'
 set @backupdesc='完全备份'
 set @backupfilename=@FullPath
 insert into msdb.dbo.backuphistory
 (dbname,backtype,lastbackup,backupdesc,backupfilename)
 values(@dbname,@backtype,GETDATE(),@backupdesc,@backupfilename)
     SET @Error = @@ERROR
     if @Error !=0
     begin
     SET @ErrorMessage = '数据库'&#43;@dbname&#43;'完全备份未顺利完成!: ' &#43; CHAR(13) &#43; CHAR(10)
     RAISERROR(@ErrorMessage,1) WITH NowAIT
     return
     end
   
 print '                                                                    '
 print '----------------------------------------------------------------------- '
 print @dbname&#43;'完全备份 '&#43;@FullPath&#43;' 已经完成!'
 print '----------------------------------------------------------------------- '
 return
 end

--开始差异备份
 else if @backuptype='diff'
 begin
  print '                                                                             '
  print '.............................................................................'
     print '开始差异备份.....请稍等'
     print '.............................................................................'
     --检查是否有完全备份并存在
  insert into @tmp                        
  select top 1  a.backupfilename,
  MAX(a.lastbackup)  as backuptime from msdb.dbo.backuphistory a
  where a.dbname=@dbname and a.backtype='D'
  group by backupfilename
  order by a.backupfilename desc
  if not exists (select top 1 1 from @tmp )
     begin
     SET @ErrorMessage = '数据库'&#43;@dbname&#43;'没有完全备份历史记录!!' &#43; CHAR(13) &#43; CHAR(10)
     RAISERROR(@ErrorMessage,1) WITH NowAIT
     return
     end
  else
  begin 
      select @fullbafile=backupfilename from @tmp
      exec xp_fileexist @fullbafile,@result output
   if (@result=0 )
   begin
   SET @ErrorMessage = '数据库'&#43;@dbname&#43;'完全备份文件不存在!做差异备份无意义!' &#43; CHAR(13) &#43; CHAR(10)
   RAISERROR(@ErrorMessage,1) WITH NowAIT
   return
   end
      end


     --隐藏检查目录
  set @backupPath3=@backupPath2&#43;'\'&#43;'diff'
  INSERT INTO @DirTree(subdirectory,depth)
  EXEC master.sys.xp_dirtree @backupPath3
  IF NOT EXISTS (SELECT 1 FROM @DirTree WHERE subdirectory = @backupPath3)
  EXEC master.dbo.xp_create_subdir @backupPath3
  delete from @DirTree
  set @FullPath = @backuppath3&#43;'\'&#43;@dbname&#43;'_'&#43;@backuptype&#43;'_'&#43;replace(replace(replace(convert(varchar,'')&#43; '.diff'
  backup database @dbname to disk=@FullPath
  WITH buffercount = 30,
  COMPRESSION,DIFFERENTIAL,RETAINDAYS=8,
  name=N'差异备份',
  NOUNLOAD,STATS=10
  
  set @backtype='I'
  set @backupdesc='差异备份'
  set @backupfilename=@FullPath
  insert into msdb.dbo.backuphistory
  (dbname,backupfilename)
  values(@dbname,@backupfilename)
     SET @Error = @@ERROR
     if @Error !=0
     begin
     SET @ErrorMessage = '数据库'&#43;@dbname&#43;'差异备份未顺利完成!: ' &#43; CHAR(13) &#43; CHAR(10)
     RAISERROR(@ErrorMessage,1) WITH NowAIT
     return
     end
  
  
  print '                                                                    '
    print '----------------------------------------------------------------------- '
    print @dbname&#43;'差异备份 '&#43;@FullPath&#43;' 已经完成!'
   print '----------------------------------------------------------------------- '
   return
 end
  
  
 --开始日志备份
 else  if @backuptype='log'
 begin
  print '                                                                        '
     print '检查环境.....请稍等..'
     print '                                                                        '
     --检查数据库恢复模式
  select @recovery_model_desc=recovery_model_desc from sys.databases
  where name=@dbname
  if @recovery_model_desc not in ('full')
  begin
  print '########错误信息######################################################'
  print '                                                                         '&#43;char(13)&#43;'请检查数据库'&#43;@dbname&#43;'的恢复模式!'&#43;char(13)&#43; '使用命令ALTER DATABASE'&#43;@dbname&#43;' SET RECOVERY FulL WITH NO_WAIT修改!'
  print '                                                                         '
  print '########错误信息######################################################'
  print '                                                                         '&#43;char(13)&#43;'日志备份已终止!'
  return
  end
     print '.........................................................................'
  print '                                                                         '
     print '开始日志备份.....请稍等'
     print '                                                                         '
     print '.........................................................................'
    
     --检查是否有完全备份或差异备份
    -------------------------------------------------------------------------
    
         --检查是否有完全备份并存在
    

set  @log_start=0  
 insert into @tmp                        
 select top 1  a.backupfilename,
 MAX(a.lastbackup)  as backuptime from msdb.dbo.backuphistory a
 where a.dbname=@dbname and a.backtype='D'
 group by backupfilename
 order by a.backupfilename desc
 if not exists (select top 1 1 from @tmp)
     begin
   set  @log_start=1
     end
 else
  begin 
     select @fullbafile=backupfilename from @tmp
     exec xp_fileexist @fullbafile,@result output
   if (@result=0 )
   begin
    set  @log_start=2
   end

  end
  
   --检查是否有差异备份并存在
 insert into @tmp                        
 select top 1  a.backupfilename,
 MAX(a.lastbackup)  as backuptime from msdb.dbo.backuphistory a
 where a.dbname=@dbname and a.backtype='I'
 group by backupfilename
 order by a.backupfilename desc
 if not exists (select top 1 1 from @tmp)
     begin
  set  @log_start=3
     end
 else
  begin 
     select @fullbafile=backupfilename from @tmp
     exec xp_fileexist @fullbafile,@result output
   if (@result=0 )
   begin
    set  @log_start=4
   end
  end

if @log_start !=0
 begin
     SET @ErrorMessage = '数据库'&#43;@dbname&#43;'没有完全备份或差异备份!: ' &#43; CHAR(13) &#43; CHAR(10)
     RAISERROR(@ErrorMessage,1) WITH NowAIT
     return
 end


    
    
    
    
    
     ------------------------------------------------------------------------------
    
     --隐藏检查目录
     set @backupPath3=@backupPath2&#43;'\'&#43;'log'
     INSERT INTO @DirTree(subdirectory,depth)
  EXEC master.sys.xp_dirtree @backupPath3
  IF NOT EXISTS (SELECT 1 FROM @DirTree WHERE subdirectory = @backupPath3)
  EXEC master.dbo.xp_create_subdir @backupPath3
  delete from @DirTree
  --开始备份
  set @FullPath = @backuppath3&#43;'\'&#43;@dbname&#43;'_'&#43;@backuptype&#43;'_'&#43;replace(replace(replace(convert(varchar,'')&#43; '.trn'
  backup log @dbname to disk=@FullPath WITH COMPRESSION,RETAINDAYS=3,
  name=N'日志备份',STATS=10
  
  set @backtype='L'
  set @backupdesc='日志备份'
  set @backupfilename=@FullPath
  insert into msdb.dbo.backuphistory
  (dbname,@backupfilename)
     SET @Error = @@ERROR
     if @Error !=0
     begin
     SET @ErrorMessage = '数据库'&#43;@dbname&#43;'日志备份未顺利完成!: ' &#43; CHAR(13) &#43; CHAR(10)
     RAISERROR(@ErrorMessage,1) WITH NowAIT
     return
     end
  
  
   print '                                                                    '
    print '-------------------------------------------------------------------------'
    print @dbname&#43;'日志备份 '&#43;@FullPath&#43;' 已经完成!'    print '---------------------------------------------------------------------------'    return  end  set nocount off  GO  

总结

以上是内存溢出为你收集整理的实战:sqlserver 2008 R2容灾方案:另一种思路-1全部内容,希望文章能够帮你解决实战:sqlserver 2008 R2容灾方案:另一种思路-1所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1178773.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存