SQLServer 理解copyonly備份操作

2021-09-20 17:27:23 字數 3589 閱讀 4889

alwayson在新增資料庫的過程中如果同步首選項選擇的是「完整」,那麼就會在主副本上執行copyonly的完整備份和日誌備份在輔助副本上執行還原操作,也正是這個操作讓我對copyonly有了新的理解。雖然以前也經常使用copyonly執行完整備份,

但是之前對copyonly的理解存在一點誤區。接下來詳細說明copyonly的操作。

create database city;gocreate table city.dbo.test(id int);---執行完整備份backup database [city] to  disk = n'd:\backup\city_full_20170613.bak' with noformat, noinit,  name = n'city-完整 資料庫 備份', skip, norewind, nounload,  stats = 10go--插入1條記錄insert into city.dbo.test values(1);--執行日誌備份1backup log [city] to  disk = n'd:\backup\city_log1_20170613.trn' with noformat, noinit,  name = n'city-日誌備份1 備份', skip, norewind, nounload,  stats = 10goinsert into city.dbo.test values(2);go--執行完整copy only備份backup database [city] to  disk = n'd:\backup\city_full_copyonly_20170613.bak' with  copy_only, noformat, noinit,  name = n'city-完整copyonly 資料庫 備份', skip, norewind, nounload,  stats = 10goinsert into city.dbo.test values(3);--執行差異備份backup database [city] to  disk = n'd:\backup\city_diff_20170613.bak' with  differential , noformat, noinit,  name = n'city-差異 資料庫 備份', skip, norewind, nounload,  stats = 10goinsert into city.dbo.test values(4);go--執行日誌備份2backup log [city] to  disk = n'd:\backup\city_log2_20170613.trn' with noformat, noinit,  name = n'city-日誌備份2 備份', skip, norewind, nounload,  stats = 10go

select bs.database_name,

bs.name as backupname,

bs.first_lsn,--備份集中最早的一條日誌記錄的日誌序列號bs.last_lsn, --備份集下一條日誌記錄的日誌序列號bs.database_backup_lsn, --最近的資料庫完整備份的日誌序列號bs.checkpoint_lsn,  --重做日誌開始的日誌序列號bs.is_copy_only,case bs.type when 'd' then 'fullback' when 'l' then 'logback' when 'i' then 'diffback' else  bs.type end as backuptype,

上圖中用三種顏色的框框出了三個比較重要的知識點:

從最左邊的紅框標誌的兩次日誌備份的first_lsn和last_lsn可以看到整個兩次日誌備份的lsn是連續的從『45000000016800179』-『45000000038400001』,兩次日誌備份的lsn涵蓋了所有備份的lsn。也就是中間的copyonly完整備份和差異備份不會截斷日誌(當然如果中間還存在完整備份同樣不會截斷日誌,大家可以去試試)

從中間的截框「database_backup_lsn」列可以看到,所有的後面的備份都基於第一次完整備份作為基準備份。

最後乙個截框「checkpoint_lsn」可以看到除了日誌備份,其它的三種備份都會觸發checkpoint,大家也通過查詢buffer檢視is_modify欄位是否被修改來判斷。

4.僅複製完整備份可以作為日誌備份的基準備份

這個在上面的截圖中沒有體現出來,但是可以看到日誌備份2的lsn是涵蓋了第三次僅複製備份的lsn,僅複製完整備份其實可以理解成資料庫在乙個時間點的快照,而日誌備份是記錄所有更改的日誌操作,可以用來執行redo。所以如果將第3次僅複製完整備份+第5次日誌備份是可以還原所有的資料。

第3次僅複製完整備份+第5次日誌備份它=(第1次完整備份+第4次差異備份+第5次日誌備份)=(第1次完整備份+第2次日誌備份+第5次日誌備份)

執行第3次僅複製完整備份+第5次日誌備份

由於資料在磁碟是雜湊儲存,如果每次修改都去修改磁碟勢必會造成很多的io,所以引入了checkpoint重新整理機制,checkpoint根據某些觸發條件將buffer中的髒頁寫入磁碟(也稱作持久化操作)。比如完整備份、僅複製完整備份、差異備份、當日誌的修改到達一定的比例、重啟服務等都會觸發checkpoint,當然checkpoint並不是sqlserver獨有的功能,在其他的關係型資料庫比如mysql都存在chckpoint機制;mysql中還存在每秒後台執行緒執行checkpoint操作,但是貌似sqlserver不會,checkpoint涉及的知識點很多這裡只是稍微介紹!

其實上面的備份測試中在中間在加入一次完整備份就更加完美了,但是如果大家理解備份的原理也是一樣可以理解的。

深淺Copy的理解

在python裡對物件進行拷貝有三個,即賦值,深拷貝,淺拷貝。而物件又分為兩種,一種是不可變物件 字串 元組 數字 一種是可變物件 列表 字典 而深淺拷貝有三種情況 拷貝的是不可變物件 拷貝的是可變物件 拷貝的可變物件裡面還有子物件 import copy list0 hello,world lis...

python的copy模組理解

首先直接上結論 我們尋常意義的複製就是深複製,即將被複製物件完全再複製一遍作為獨立的新個體單獨存在。所以改變原有被複製物件不會對已經複製出來的新物件產生影響。而淺複製並不會產生乙個獨立的物件單獨存在,他只是將原有的資料塊打上乙個新標籤,所以當其中乙個標籤被改變的時候,資料塊就會發生變化,另乙個標籤也...

iOS 中copy的簡單理解

乙個物件的準確型別是在分配記憶體空間的時候指定 程式設計師指定的型別只是讓該物件有該型別的方法。能否使用指定類的方法取決於執行時,這個物件的型別是否正確。理解這兩句句話很重要 有可變不可變之分時 可變 不可變 copy 可變 可變 mutablecopy 不可變 可變 mutablecopy 不可變...