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 參數,然后再執行。

 

  步驟二在命令框中執行如下:
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命令行中是不支持有空格的名字的,所以把程序復制到一個簡單的路徑方便調用。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM