資料庫備份是資料庫管理的一項重要工作,是資料安全保障的一部分,是以資料庫備份是資料庫日常管理的一項必需任務,那麼怎麼做這項任務呢?在做這個項任務之前,需要先了資料庫備份的一次基礎知識:
1.資料庫恢複模式,包括完整、簡單、大容量日志等;
2.資料庫備份類型,包括完整、日志、差異等;
了解了它們之間的特點,才能更好的制定備份還原方案,好的備份還原方案能最大化的減少災難或失誤帶來的損失,是以備份還原方案也是很重要的。
常用的備份還原方案有:
- .完整備份,備份方案比較單一,隻能還原到備份時的狀态
- .完整備份 + 差異備份,隻能還原到備份時的狀态,但是相比完整備份,可以節省磁盤空間
- .完整備份 + 日志備份,節省磁盤空間,通過日志備份鍊還原到中完整備份與最後日志備份之間的任意時間點,當日志備份比較多,還原過程可能比較長。
- .完整備份 + 差異備份 + 日志備份,該方案是上面2、3方案的折中方案,可以加速還原,但是比較2、3方案,磁盤空間消耗多點,但是相比單一的完整備份要好很多。
從以上方案來看,完整備份是必須要做的,差異備份和日志備份是可以取舍的
通過什麼方式來備份資料庫呢?
1.手動備份
2.維護計劃
3.作業
方式1每次都要手動操作,太過繁瑣,日常維護不太适用;
方式2、3是自動化操作,相對智能,方式2有圖形界面,相對比較簡單;方式3雖然也有圖形界面,但是需要寫代碼或調用ssis包,相對比較複雜。
那就以簡單的方式2為例,看看如何備份資料庫吧
1.建立維護計劃
2.添加備份任務
輕按兩下“備份資料庫”任務
3.建立清除曆史檔案任務
4.建立”清除曆史記錄“任務,即清除msdb庫中備份記錄
5.備份計劃規則
6.維護計劃的執行使用者
該使用者一定要具體相應的權限
至此,一個簡單的完整備份計劃任務建立完成,以同樣的方法建立差異備份、日志備份等備份計劃
我們來看看維護計劃的原理
1.備份資料庫
實際上它也是調用T-SQL語句去執行的
2.清除維護”務
它是調用了存儲過程xp_delete_file
那麼看看xp_delete_file裡面是怎麼删除的
發現居然是直接使用動态庫來實作,删除檔案是作業系統級的,畢竟sqlserver擅長的,本身也并不能直接删除檔案,隻能通過外部調用來實作,間接的通過動态庫也實作不失一種很好辦法。
有關于xp_delete_file資訊有限,在msdn中不存在任何文檔,并且不存在非Microsoft參考文檔中的任何文檔。
xp_delete_file有五個參數:
- 備份檔案的檔案類型 = 0或報告檔案的檔案類型 = 1。
- Folder Path =要删除檔案的檔案夾。路徑必須以反斜杠“\”結尾。
- 檔案擴充名 =這可能是'BAK'或'TRN'或您通常使用的任何内容。
- Date =需要删除哪些檔案的截止日期。
- Subfolder = 0忽略子檔案夾,1删除子檔案夾中的檔案(目錄遞歸)。
隻有擁有sysadmin角色才有權限執行xp_delete_file
3.清除曆史記錄
它是調用兩個存儲過程msdb.dbo.sp_purge_jobhistory、msdb..sp_maintplan_delete_log
看看這兩個存儲是什麼鬼
它主要是删除msdb庫中的某些表的一些曆史記錄而已
這裡測試需要注意的是sp_helptext這個存儲過程有點特殊,調用時是原本是sp_helptext '存儲過程名'
如果存儲過程名無特殊符号,直接使用sp_helptext 存儲過程名 也是可以的,但是如果遇到特殊符号就不行了,比如例中
是以很多時候,在使用sp_helptext存儲過程時,盡量帶在存儲過程名兩端帶上單引号還有一個問題需要注意
兩行語句都是正常語句,而且單獨執行都沒有問題,但是一同執行就出現了上面的問題
在 SSMS 中,執行多個存儲過程時需要使用 GO 指令進行分隔。這是因為每個存儲過程都是一個單獨的 T-SQL 執行上下文環境,而在每個批處理之間使用 GO 指令可以確定每個存儲過程都有自己的獨立執行上下文環境。
如果不使用 GO 指令分隔多個存儲過程,則可能會導緻以下問題:
- 錯誤:由于不同的存儲過程可能具有相同的變量或參數名稱,是以在多個存儲過程之間共享變量或參數可能會導緻意外的行為或錯誤。
- 性能問題:在執行一個存儲過程時,SQL Server 會對它進行編譯,并将執行計劃存儲在緩存中以便下次調用。如果多個存儲過程放在同一個腳本中,那麼 SQL Server 可能會多次編譯每個存儲過程,進而降低性能。
是以,為了保證每個存儲過程都有自己的獨立執行上下文環境,并且避免潛在的錯誤和性能問題,我們需要在每個存儲過程之間使用 GO 指令進行分隔。Go指令隻能在 SSMS、sqlcmd 和其他支援分批處理的工具中使用,并不能在存儲過程、觸發器或其他 T-SQL 對象中使用。
維護計劃的原理大概弄明白了,那麼通過作業來實作備份與删除的功能就并不難了,稍有一點T-SQL功底的都可以實作,用作業自己寫代碼會比較靈活一點,維護計劃相當于已經定好了模闆,隻能按模闆來執行。