這里有兩個方法,其中第一個比較繁瑣但是比較詳細,第二個較為簡單,推薦用第二個方法!
方法一:
SQL Server代理沒有啟動,我們先把其啟動,然后新建立一個作業,名稱命名為“MyDb完全備份”,在分類下面選擇“數據庫維護”,然后新建立作業第一個步驟,步驟名為“對數據進行完全備份”,然后在命令框中輸入如下的SQL代碼:
如果
, @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
操作如圖一:

, @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



這樣就可以建立好對數據庫的整個完全備份了。
有時我們數據在遭到破壞的時候,而在恢復到上次的整個備份時,就會產生很多丟失的數據了,這時我們就必須還得建立另外一種備份的機制—差異備份。
, @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

, @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' 的使用。所以我們得恢復其執行命令:
用下面一句話就可以了解決了。
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
當SQL數據庫大於2G時XP_MAKECAB擴展存儲過程壓縮失敗,結合WINDOWS 操作系統的任務計划,建立命令行下的批處理文件(.BAT),實現每天 SQL SERVER自動壓縮,如下:
1、SQL SERVER自動備份
2、COPY WINRAR目錄到以下批處理文件所在的目錄
3、用文本編輯器建立批處理文件(.BAT),如下內容:
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%
方法二:
建立兩個步驟,第一步備份出BAK數據庫文件,第二步打包壓縮數據庫備份文件后並刪除原備份文件
執行備份的命令:
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 -- 執行備份
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 -- 執行命令
-ep參數的作用是不壓縮文件的完整路徑,也就是指壓縮指定的文件。
-df參數的作用就是壓縮后刪除源文件
后面命令的意思就是把D盤根目錄下以當天日期命名的備份文件壓縮到D盤根目錄,並命名為當天日期的rar文件