SQL Server自动备份并压缩

  这里有两个方法,其中第一个比较繁琐但是比较详细,第二个较为简单,推荐用第二个方法!

 方法一: 

SQL Server代理没有启动,我们先把其启动,然后新建立一个作业,名称命名为“MyDb完全备份,在分类下面选择数据库维护,然后新建立作业第一个步骤,步骤名为对数据进行完全备份,然后在命令框中输入如下的SQL代码:

如果

DECLARE  @strSql    VARCHAR( 1000)
 , @strSqlCmd  VARCHAR( 1000)
 , @timeDateDiff  INT
SET  @timeDateDiff  =  DATEDIFF(week, 0, GETDATE())
SET  @timeDateDiff  =  CASE  DATEPART(WEEKDAY, GETDATE())
  WHEN  1  THEN  @timeDateDiff  - 1
  ELSE  @timeDateDiff  END
SET  @strSql = ' D:\DataBase\BackData\MyDb_ '   --  备份目录及备份的文件头
  + CONVERT( CHAR( 8), DATEADD(week,  @timeDateDiff, 0), 112)   --  完全备份日期
  + ' _0100 '     --  完全备份时间
  + ' 完全备份 ' 
SET  @strSqlCmd =  @strSql + ' .BAK '     -- 备份文件的扩展名 
BACKUP  DATABASE  [ MyDb ] 
  TO   DISK  =  @strSqlCmd  WITH INIT 
 ,NOUNLOAD 
 ,NAME  = N ' MyDb 备份 '
 ,NOSKIP 
 ,STATS  =  10
 ,NOFORMAT

 

   操作如图一: 

 
  然后开始执行对数据库的压缩,在步骤中再新建一个作业,步骤名为 压缩数据库 ,然后在命令框中输入如下的 SQL 代码:
DECLARE  @strSql    VARCHAR( 1000)
 , @strSqlCmd  VARCHAR( 1000)
 , @timeDateDiff  INT
 , @strWeekDay  VARCHAR( 20
SET  @timeDateDiff =  DATEDIFF(week, 0, GETDATE())
SET  @timeDateDiff =  CASE  DATEPART(WEEKDAY, GETDATE())
  WHEN  1  THEN  @timeDateDiff - 1
  ELSE  @timeDateDiff  END
SET  @strSql = ' D:\DataBase\BackData\MyDb_ '   --  备份目录及备份的文件头
  + CONVERT( CHAR( 8), DATEADD(week, @timeDateDiff, 0), 112)   --  完全备份日期
  + ' _0100 '     --  完全备份时间
  + ' 完全备份 '
SET  @strWeekDay =  CASE  DATEPART(WEEKDAY, GETDATE())  WHEN  1  THEN  ' 星期天 ' 
   WHEN  2  THEN  ' 星期一 ' 
   WHEN  3  THEN  ' 星期二 ' 
   WHEN  4  THEN  ' 星期三 ' 
   WHEN  5  THEN  ' 星期四 ' 
   WHEN  6  THEN  ' 星期五 ' 
   WHEN  7  THEN  ' 星期六 '  END
SET  @strSqlCmd =  ' ECHO 压缩开始日期:  ' + CONVERT( VARCHAR( 20), GETDATE(), 120) + '   ' + @strWeekDay + '   >> D:\DataBase\BackData\CompressDataBase\MyDb_ ' + CONVERT( CHAR( 6), DATEADD(week, @timeDateDiff, 0), 112) + ' .txt '
EXEC master.dbo.XP_CMDSHELL  @strSqlCmd,NO_OUTPUT
SET  @strSqlCmd =  ' RAR.EXE A -R  ' + @strSql + ' .RAR  ' + @strSql + ' .BAK >> D:\DataBase\BackData\CompressDataBase\MyDb__ ' + CONVERT( CHAR( 6), DATEADD(week, @timeDateDiff, 0), 112) + ' .txt '
PRINT  LEN( @strSqlCmd)
PRINT ( @strSqlCmd)
EXEC master.dbo.XP_CMDSHELL  @strSqlCmd,NO_OUTPUT
SET  @strSqlCmd =  ' ECHO 压缩日期:  ' + CONVERT( VARCHAR( 20), GETDATE(), 120) + '   ' + @strWeekDay + '   >> D:\DataBase\BackData\CompressDataBase\MyDb_ ' + CONVERT( CHAR( 6), DATEADD(week, @timeDateDiff, 0), 112) + ' .txt '
EXEC master.dbo.XP_CMDSHELL  @strSqlCmd,NO_OUTPUT
 
  操作如图二:
 
  完成后我们可以看到操作步骤的对话框,如图三,数据完全备份的步骤
 
  我们对照上图,注意两点,第一个是步骤 1“ 成功时 这一列的显示,当成功的时候转到下一步, 失败时 当失败的时候失败后退出,步骤 2“ 成功时 当成功的时候成功后退出, 失败时 当失败时失败后退出。确保两个步骤对数据操作的正常。
  再执行调度一栏,主要实现在什么时候执行这些作业,我们定在每周日一点的时候开始执行,如图四:
 

这样就可以建立好对数据库的整个完全备份了。

  有时我们数据在遭到破坏的时候,而在恢复到上次的整个备份时,就会产生很多丢失的数据了,这时我们就必须还得建立另外一种备份的机制差异备份。

  步骤还和上面一样,我们建立一个作业,命名为 “MyDb 差异备份 ,在步骤里面同样是建立两个步骤,分别是差异备份和差异压缩,步骤一在命令框中输入内容如下:
DECLARE  @strSql    VARCHAR( 1000)
 , @strSqlCmd  VARCHAR( 1000)
 , @timeDateDiff  INT
SET  @timeDateDiff  =  DATEDIFF(week, 0, GETDATE())
SET  @timeDateDiff  =  CASE  DATEPART(WEEKDAY, GETDATE())
  WHEN  1  THEN  @timeDateDiff  - 1
  ELSE  @timeDateDiff  END
SET  @strSql = ' D:\DataBase\BackData\MyDb_ '   --  备份目录及备份的文件头
  + CONVERT( CHAR( 8), DATEADD(week,  @timeDateDiff, 0), 112)   --  完全备份日期
  + ' _0100 '     --  完全备份时间
  + ' 差异备份 '
  + ' _ ' + CONVERT( CHAR( 8), GETDATE(), 112--  差异备份日期
  + ' _0300 '     --  差异备份时间 
SET  @strSqlCmd =  @strSql + ' .BAK '     -- 备份文件的扩展名 
BACKUP  DATABASE  [ webEIMS2008 ] 
  TO   DISK  =  @cSqlCmd  WITH INIT 
 ,NOUNLOAD 
 ,DIFFERENTIAL 
 ,NAME  = N ' MyDb差异备份 '
 ,NOSKIP 
 ,STATS  =  10
 ,NOFORMAT

 

  我们可以看到,差异备份除了文件名命名格式不一样外,就在备份执行 SQL 语句时增加了了下 DIFFERENTIAL 参数,然后再执行。

 

  步骤二在命令框中执行如下:
ExpandedBlockStart.gif View Code
DECLARE  @strSql    VARCHAR( 1000)
 , @strSqlCmd  VARCHAR( 1000)
 , @timeDateDiff  INT
 , @strWeekDay  VARCHAR( 20
SET  @timeDateDiff =  DATEDIFF(week, 0, GETDATE())
SET  @timeDateDiff =  CASE  DATEPART(WEEKDAY, GETDATE())
  WHEN  1  THEN  @timeDateDiff - 1
  ELSE  @timeDateDiff  END
SET  @strSql = ' D:\DataBase\BackData\MyDb_ '    --  备份目录及备份的文件头
  + CONVERT( CHAR( 8), DATEADD(week, @timeDateDiff, 0), 112)   --  完全备份日期
  + ' _0100 '     --  完全备份时间
  + ' 差异备份 '
  + ' _ ' + CONVERT( CHAR( 8), GETDATE(), 112--  差异备份日期
  + ' _0300 '     --  差异备份时间

SET  @strWeekDay =  CASE  DATEPART(WEEKDAY, GETDATE())  WHEN  1  THEN  ' 星期天 ' 
   WHEN  2  THEN  ' 星期一 ' 
   WHEN  3  THEN  ' 星期二 ' 
   WHEN  4  THEN  ' 星期三 ' 
   WHEN  5  THEN  ' 星期四 ' 
   WHEN  6  THEN  ' 星期五 ' 
   WHEN  7  THEN  ' 星期六 '  END
SET  @strSqlCmd =  ' ECHO 压缩开始日期:  ' + CONVERT( VARCHAR( 20), GETDATE(), 120) + '   ' + @strWeekDay + '   >> D:\DataBase\BackData\CompressDataBase\MyDb_ ' + CONVERT( CHAR( 6), DATEADD(week, @timeDateDiff, 0), 112) + ' .txt '
EXEC master.dbo.XP_CMDSHELL  @strSqlCmd,NO_OUTPUT
SET  @strSqlCmd =  ' RAR.EXE A -R  ' + @strSql + ' .RAR  ' + @strSql + ' .BAK >> D:\DataBase\BackData\CompressDataBase\MyDb_ ' + CONVERT( CHAR( 6), DATEADD(week, @timeDateDiff, 0), 112) + ' .txt '
PRINT  LEN( @strSqlCmd)
PRINT ( @strSqlCmd)
EXEC master.dbo.XP_CMDSHELL  @strSqlCmd,NO_OUTPUT
SET  @strSqlCmd =  ' ECHO 压缩结束日期:  ' + CONVERT( VARCHAR( 20), GETDATE(), 120) + '   ' + @strWeekDay + '   >> D:\DataBase\BackData\CompressDataBase\MyDb_ ' + CONVERT( CHAR( 6), DATEADD(week, @timeDateDiff, 0), 112) + ' .txt '
EXEC master.dbo.XP_CMDSHELL  @strSqlCmd,NO_OUTPUT

 

  这时我们已经建立好了步骤,只是现在建立作业调度的时候有些变化,我们看图五:

 

 

对比完全备份建立的作业调度,在这里我们可以看到,我们选择的时间是除了周日以外的每天夜里3点的时候,自动执行此次调度。

  当然时间是自己灵活分配的,如数据发生的变化比较大,我们可以选择每天,然后频率选择发生周期性短一点,这样我们数据在遭到破坏的时候,我们就可以及时的恢复了。

  如果在SQL Server2000中,我们可以建立如上的作业就可以对数据进行备份了,而对于SQL Server2005,还有一点细微的变化,因为它默认是不支持xp_cmdshell执行命令的,SQL Server 已封锁元件 'xp_cmdshell' 程序 'sys.xp_cmdshell' 之存取,因为此元件已经由此伺服器的安全性组态关闭。系统管理员可以使用sp_configure来启用 'xp_cmdshell' 的使用。所以我们得恢复其执行命令:

  用下面一句话就可以了解决了。

EXEC sp_configure  ' show advanced options '1;

RECONFIGURE;

EXEC sp_configure 'xp_cmdshell'1;

RECONFIGURE;

 

 

利用自动压缩 WINRAR 实现 SQL SERVER
  面为您介绍的方法可以实现SQL SERVER自动压缩,有了SQL SERVER自动压缩,就不必每天再浪费时间进行手动的压缩了。
  当SQL数据库大于2G时XP_MAKECAB扩展存储过程压缩失败,结合WINDOWS 操作系统的任务计划,建立命令行下的批处理文件(.BAT),实现每天 SQL SERVER自动压缩,如下:
  1、SQL SERVER自动备份
  2、COPY WINRAR目录到以下批处理文件所在的目录
  3、用文本编辑器建立批处理文件(.BAT),如下内容:
@echo off
echo.
echo.
color a
cls
@echo off
echo.
echo                 欢迎来到数据库备份压缩批处理_dudumao
echo.
echo.
echo.
echo.                    ....正在自动压缩备份数据....
echo ------------------------------------------------------------------------------
echo.
echo.
echo.
echo.
echo.
@echo off
if not exist zsimcmis_db_%date:~0,4%%date:~5,2%%date:~8,2%1830.bak goto existfile   --检查是否存在未被压缩数据库备份文件
goto backup
:backup
echo 已经找到备份好的备份文件zsimcmis_db_%date:~0,4%%date:~5,2%%date:~8,2%1830.bak
echo .
echo !!!提示:正在压缩备份文件....!!!
echo .
echo !!!提示:正在将备份文件zsimcmis_db_%date:~0,4%%date:~5,2%%date:~8,2%1830.bak压缩到G:\Cabfiles\zsimcmis_db_%date:~0,4%%date:~5,2%%date:~8,2%2000.RAR文件中.......   --只是显示屏幕而已,中间的文件名没实际用处
WinRAR\winrar a -as -ibck G:\Cabfiles\zsimcmis_db_.rar -m3 -agyyyymmddhhmmss zsimcmis_db_%date:~0,4%%date:~5,2%%date:~8,2%1830.bak      --什么不知道意思,WINRAR命令行的参数参考一下。
goto end
:existfile
echo.
echo !!!备份失败!!!
echo 没有找到已经备份好的备份文件zsimcmis_db_%date:~0,4%%date:~5,2%%date:~8,2%1830.bak
echo.
echo.
echo.
pause
goto end
:end
echo 操作完毕

 

  其中:XP   system c:\> md   d:\%Date:~0,4%%Date:~5,2%%Date:~8,2%

     2k   system c:\> md   d:\%Date:~4,4%%Date:~9,2%%Date:~12,2%
 
  4、在WIN的任务计划中,建立运行计划,命令就是运行上以批处理文件就是OK!不必每天手工压缩了。。。

 

方法二

  建立两个步骤,第一步备份出BAK数据库文件,第二步打包压缩数据库备份文件后并删除原备份文件

  执行备份的命令:

declare  @filename  varchar( 200)
set  @filename = ' D:\ ' + convert( char( 10), getdate(), 120)+'.bak'   -- 设置备份文件的路径和文件名
print  @filename
backup  database [ DatabaseName ]  to  disk = @filename  with NOINIT,NOUNLOAD,NAME = ' backup ',NOSKIP,STATS = 10,NOFORMAT   -- 执行备份

 

  压缩并删除源文件的命令:
declare  @file  varchar( 200)
set  @file = ' c:\winrar.exe a -ep -df D:\ DatebaseName_' + convert( char( 10), getdate(), 120) + ' .rar D:\ ' + convert( char( 10), getdate(), 120)+'.bak'  -- 将压缩备份文件并删除源文件的winrar命令行命令
exec master..xp_cmdshell  @file   -- 执行命令

 

   winrar命令行的压缩命令是:[winrar路径] a [参数] [压缩后的路径] [需要压缩的文件路径],这是本文需要用到的命令格式。
  a就是winrar压缩文件的命令参数
  -ep参数的作用是不压缩文件的完整路径,也就是指压缩指定的文件。
  -df参数的作用就是压缩后删除源文件
  后面命令的意思就是把D盘根目录下以当天日期命名的备份文件压缩到D盘根目录,并命名为当天日期的rar文件
   一般默认下winrar的程序都是安装在C:\Program Files\WinRAR下的,但是由于其中的Program Files目录名中有空格,CMD命令行中是不支持有空格的名字的,所以把程序复制到一个简单的路径方便调用。


转载于:https://www.cnblogs.com/dudumao/archive/2012/02/27/2369510.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值