這裡有兩個方法,其中第一個比較繁瑣但是比較詳細,第二個較為簡單,推薦用第二個方法!
方法一:
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代碼:
,@strWeekDay VARCHAR(20)
SET @timeDateDiff= DATEDIFF(week,0,GETDATE())
SET @timeDateDiff= CASE DATEPART(WEEKDAY,GETDATE())
WHEN 1 THEN @timeDateDiff-1
+CONVERT(CHAR(8),DATEADD(week,@timeDateDiff,0),112) -- 完全備份日期
+'完全備份'
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)
SET @strSqlCmd= 'ECHO 壓縮日期: '+CONVERT(VARCHAR(20),GETDATE(),120)+' '+@strWeekDay+' >> D:\DataBase\BackData\CompressDataBase\MyDb_'+CONVERT(CHAR(6),DATEADD(week,@timeDateDiff,0),112)+'.txt'
操作如圖二:
完成後我們可以看到操作步驟的對話框,如圖三,資料完全備份的步驟:
我們對照上圖,注意兩點,第一個是步驟1“成功時”這一列的顯示,當成功的時候轉到下一步,“失敗時”當失敗的時候失敗後退出,步驟2“成功時”當成功的時候成功後退出,“失敗時”當失敗時失敗後退出。確定兩個步驟對資料操作的正常。
再執行“排程”一欄,主要實作在什麼時候執行這些作業,我們定在每周日一點的時候開始執行,如圖四:
這樣就可以建立好對資料庫的整個完全備份了。
有時我們資料在遭到破壞的時候,而在恢複到上次的整個備份時,就會産生很多丢失的資料了,這時我們就必須還得建立另外一種備份的機制—差異備份。
步驟還和上面一樣,我們建立一個作業,命名為“MyDb差異備份”,在步驟裡面同樣是建立兩個步驟,分别是差異備份和差異壓縮,步驟一在指令框中輸入内容如下:
+'差異備份'
+'_'+CONVERT(CHAR(8),GETDATE(),112) -- 差異備份日期
+'_0300' -- 差異備份時間
BACKUP DATABASE [webEIMS2008]
TO DISK = @cSqlCmd WITH INIT
,DIFFERENTIAL
,NAME = N'MyDb差異備份'
我們可以看到,差異備份除了檔案名命名格式不一樣外,就在備份執行SQL語句時增加了了下DIFFERENTIAL參數,然後再執行。
步驟二在指令框中執行如下:
View Code
SET @strSql='D:\DataBase\BackData\MyDb_' -- 備份目錄及備份的檔案頭
+'_0300' -- 差異備份時間
SET @strSqlCmd= 'RAR.EXE A -R '+@strSql+'.RAR '+@strSql+'.BAK >> D:\DataBase\BackData\CompressDataBase\MyDb_'+CONVERT(CHAR(6),DATEADD(week,@timeDateDiff,0),112)+'.txt'
SET @strSqlCmd= 'ECHO 壓縮結束日期: '+CONVERT(VARCHAR(20),GETDATE(),120)+' '+@strWeekDay+' >> D:\DataBase\BackData\CompressDataBase\MyDb_'+CONVERT(CHAR(6),DATEADD(week,@timeDateDiff,0),112)+'.txt'
這時我們已經建立好了步驟,隻是現在建立作業排程的時候有些變化,我們看圖五:
對比完全備份建立的作業排程,在這裡我們可以看到,我們選擇的時間是除了周日以外的每天夜裡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.
color a
cls
echo 歡迎來到資料庫備份壓縮批處理_dudumao
echo. ....正在自動壓縮備份資料....
echo ------------------------------------------------------------------------------
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 !!!提示:正在将備份檔案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 沒有找到已經備份好的備份檔案zsimcmis_db_%date:~0,4%%date:~5,2%%date:~8,2%1830.bak
pause
: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指令行中是不支援有空格的名字的,是以把程式複制到一個簡單的路徑友善調用