(2.19)备份与还原--备份的原理与总结
備份T-SQL操作參考:https://www.cnblogs.com/gered/p/9178924.html
?一、完整備份
完整備份包含了數(shù)據(jù)庫(kù)中的所有數(shù)據(jù),以及可以恢復(fù)這些數(shù)據(jù)的足夠的日志(以便恢復(fù)到該備份的結(jié)尾)。
1. 備份的過(guò)程
(1)鎖定數(shù)據(jù)庫(kù),阻塞所有的事務(wù)。
(2)在事務(wù)日志中放置一個(gè)標(biāo)志1。
(3)釋放數(shù)據(jù)庫(kù)鎖。
(4)提取數(shù)據(jù)文件的所有包含數(shù)據(jù)的數(shù)據(jù)頁(yè)面,把它們寫入備份設(shè)備。不包含數(shù)據(jù)的數(shù)據(jù)頁(yè)面被跳過(guò),因此備份的文件大小永遠(yuǎn)不會(huì)大于該數(shù)據(jù)庫(kù)的數(shù)據(jù)文件。
(5)鎖定數(shù)據(jù)庫(kù),阻塞所有事務(wù)。
(6)在事務(wù)日志中放置一個(gè)標(biāo)志2。
(7)釋放數(shù)據(jù)庫(kù)鎖。
(8)提取標(biāo)志1與標(biāo)志2之間的所有事務(wù),把它們追加到備份中。
2.多線程
為了提升性能,發(fā)起一次備份時(shí),備份引擎以最快的速度從數(shù)據(jù)文件中獲取數(shù)據(jù)頁(yè)面,這個(gè)過(guò)程不考慮頁(yè)面的順序。根據(jù)這個(gè)機(jī)制,可以用多個(gè)線程向備份設(shè)備寫入數(shù)據(jù)頁(yè)面。
3. 完整備份中包含了少量的事務(wù)日志
這是因?yàn)樵趥浞葸^(guò)程中可能還在不停地產(chǎn)生“臟頁(yè)”,在恢復(fù)時(shí)就需要利用這些少量日志進(jìn)行“重做”(把“臟頁(yè)”回寫到磁盤的數(shù)據(jù)頁(yè)面),這樣就可以恢復(fù)到備份完成時(shí)的那個(gè)時(shí)間點(diǎn)。
二、差異備份
1. 差異備份的“基準(zhǔn)”
差異備份基于數(shù)據(jù)庫(kù)的最新完整備份。也就是說(shuō),上一個(gè)完整備份就是這些“差異”的“基準(zhǔn)”,要想使用差異備份,必須存在一個(gè)完整備份。
差異備份只包含自“基準(zhǔn)”后發(fā)生更改的數(shù)據(jù)頁(yè)面(以區(qū)為單位)。
差異備份不是增量備份。差異備份的“基準(zhǔn)”是上一個(gè)完整備份。可以認(rèn)為多個(gè)差異備份之間沒(méi)有直接的關(guān)聯(lián)關(guān)系。增量備份的“基準(zhǔn)”是上一個(gè)增量備份。事務(wù)日志備份就屬于增量備份。
2. 差異備份的工作原理
在數(shù)據(jù)庫(kù)中有一些特殊的數(shù)據(jù)頁(yè)面,稱為DCM(差異變更映射表),類似于Windows的文件分配表。DCM記錄了數(shù)據(jù)庫(kù)的區(qū)(8個(gè)連續(xù)的8KB數(shù)據(jù)頁(yè)面)的變化情況。
在執(zhí)行了完整備份之后,DCM的內(nèi)容被清零。如果某個(gè)區(qū)發(fā)生了變化,DCM中對(duì)應(yīng)的位將被設(shè)為1。
執(zhí)行差異備份時(shí),備份引擎讀取DCM,然后捕獲自上一次完整備份以來(lái)發(fā)生變化的所有區(qū),并將那些區(qū)包括在差異備份中。
三、事務(wù)日志備份
每個(gè)日志備份都包括創(chuàng)建備份時(shí)處于活動(dòng)狀態(tài)的部分事務(wù)日志,以及先前日志備份中未備份的所有日志記錄。
注意:只有在完整恢復(fù)模式或者大容量日志恢復(fù)模式時(shí),才可以執(zhí)行事務(wù)日志備份。
1. 完整恢復(fù)模式的事務(wù)日志備份
在日志備份時(shí),備份引擎掃描所有的VLF,查找自上一次事務(wù)日志備份后被新增的日志記錄,并將這些日志記錄包括在備份文件中。
2. 大容量日志恢復(fù)模式的日志備份
在數(shù)據(jù)頁(yè)面中有一個(gè)BCM(大容量變更映射表)頁(yè),記錄了自上一次日志備份后被大容量日志記錄操作(例如批量插入)修改的區(qū)。BCM存在于任何恢復(fù)模式的數(shù)據(jù)庫(kù)中,但僅在大容量恢復(fù)日志時(shí)才使用BCM。
上一次日志備份后,BCM已經(jīng)被清零。然后,如果某個(gè)區(qū)的數(shù)據(jù)被大容量日志記錄操作修改,就在BCM中將對(duì)應(yīng)的位修改為1。
在日志備份時(shí),備份引擎掃描所有的BCM頁(yè),查找已經(jīng)修改的區(qū),并將那些區(qū)包括在日志備份的前部。
?
3.結(jié)尾日志備份
在最后一次事務(wù)日志備份之后,數(shù)據(jù)庫(kù)繼續(xù)執(zhí)行新的事務(wù),這樣就會(huì)在事務(wù)日志中還存在著尚未備份的日志記錄,這部分“新”日志就稱為“結(jié)尾日志”。
(1)結(jié)尾日志備份
“結(jié)尾日志備份”就是用來(lái)捕獲事務(wù)日志的“尾部”(即尚未備份的那部分日志記錄),而且可以備份到最后一個(gè)事務(wù),從而形成一個(gè)完好無(wú)損的日志鏈。
通過(guò)結(jié)尾日志備份,可以將數(shù)據(jù)庫(kù)恢復(fù)到最后一個(gè)時(shí)間點(diǎn)的最后一個(gè)事務(wù),以防丟失所做的工作。
結(jié)尾日志備份將是數(shù)據(jù)庫(kù)還原計(jì)劃中相關(guān)的最后一個(gè)備份。結(jié)尾日志完成后,數(shù)據(jù)庫(kù)處于“正在恢復(fù)”狀態(tài),不可以訪問(wèn)。
1. T-SQL
示例
2.SSMS
(2)結(jié)尾日志備份的場(chǎng)景
1. With NoRecovery選項(xiàng)
如果數(shù)據(jù)庫(kù)處于聯(lián)機(jī)狀態(tài)并且您計(jì)劃對(duì)數(shù)據(jù)庫(kù)執(zhí)行還原操作,則從備份日志結(jié)尾開始。 若要避免聯(lián)機(jī)數(shù)據(jù)庫(kù)錯(cuò)誤,必須使用 BACKUP Transact-SQL 語(yǔ)句的 … WITH NORECOVERY 選項(xiàng)。
如果數(shù)據(jù)庫(kù)處于脫機(jī)狀態(tài)而無(wú)法啟動(dòng),則需要還原數(shù)據(jù)庫(kù),從備份日志結(jié)尾開始。 由于此時(shí)不會(huì)發(fā)生任何事務(wù),因此 WITH NORECOVERY 是可選的。
2. 數(shù)據(jù)庫(kù)置疑時(shí)
如果數(shù)據(jù)庫(kù)的數(shù)據(jù)文件損壞,數(shù)據(jù)庫(kù)的狀態(tài)為“可疑”,則立即嘗試使用 BACKUP 語(yǔ)句的 WITH CONTINUE_AFTER_ERROR 選項(xiàng)執(zhí)行結(jié)尾日志備份。
?
?
在損壞的數(shù)據(jù)庫(kù)上,僅當(dāng)日志文件未受損、數(shù)據(jù)庫(kù)處于支持結(jié)尾日志備份的狀態(tài)并且數(shù)據(jù)庫(kù)不包含任何大容量日志更改時(shí),日志結(jié)尾備份才會(huì)成功。 如果無(wú)法創(chuàng)建結(jié)尾日志備份,則最新日志備份后提交的任何事務(wù)都將丟失。
(3).不需要結(jié)尾備份日志的場(chǎng)景
并非所有的數(shù)據(jù)庫(kù)恢復(fù)方案都要求執(zhí)行結(jié)尾日志備份。
1. 如果恢復(fù)點(diǎn)包含在較早的日志備份中,則無(wú)需結(jié)尾日志備份。
2. 如果準(zhǔn)備移動(dòng)或替換(覆蓋)數(shù)據(jù)庫(kù),并且在最新備份后不需要將該數(shù)據(jù)庫(kù)還原到某一時(shí)間點(diǎn),則不需要結(jié)尾日志備份。
?
轉(zhuǎn)載于:https://www.cnblogs.com/gered/p/9204827.html
總結(jié)
以上是生活随笔為你收集整理的(2.19)备份与还原--备份的原理与总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 5分钟了解Zigbee的前世今生
- 下一篇: bzoj1854 [Scoi2010]游