標籤:MSSQL/日誌截斷
概述
Alwayson在新增資料庫的過程中如果同步首選項選擇的是“完整”,那麼就會在主副本上執行copyonly的完整備份和日誌備份在輔助副本上執行還原操作,也正是這個操作讓我對copyonly有了新的理解。雖然以前也經常使用copyonly執行完整備份,
但是之前對copyonly的理解存在一點誤區。接下來詳細說明copyonly的操作。
一、備份測試
CREATE DATABASE city; GO CREATE 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 = 10 GO --插入1條記錄 INSERT INTO city.dbo.test VALUES(1); --執行日誌備份1 BACKUP LOG [city] TO DISK = N'D:\backup\city_log1_20170613.trn' WITH NOFORMAT, NOINIT, NAME = N'city-日誌備份1 備份', SKIP, NOREWIND, NOUNLOAD, STATS = 10 GO INSERT 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 = 10 GO INSERT 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 = 10 GO INSERT INTO city.dbo.test VALUES(4); GO --執行日誌備份2 BACKUP LOG [city] TO DISK = N'D:\backup\city_log2_20170613.trn' WITH NOFORMAT, NOINIT, NAME = N'city-日誌備份2 備份', SKIP, NOREWIND, NOUNLOAD, STATS = 10 GO
二、查詢備份
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, bs.backup_start_date, bs.backup_finish_date, bs.backup_size, bs.recovery_model FROM msdb.dbo.backupset bs --INNER JOIN msdb.dbo.backupfile bf ON bs.backup_set_id=bf.backup_set_id WHERE bs.database_name='city'
上圖中用三種顏色的框框出了四個比較重要的知識點:
1.日誌備份以外的備份不會截斷日誌
從最左邊的紅框標誌的兩次日誌備份的first_lsn和last_lsn可以看到整個兩次日誌備份的lsn是連續的從‘45000000016800179’-‘45000000038400001’,兩次日誌備份的lsn涵蓋了所有備份的lsn。也就是中間的copyonly完整備份和差異備份不會截斷日誌(當然如果中間還存在完整備份同樣不會截斷日誌,大家可以去試試)
2.僅複製完整備份不能作為差異備份的基準備份
從中間的截框“database_backup_lsn”列可以看到,所有的後面的備份都基於第一次完整備份作為基準備份。
3.完整、差異、僅複製完整備份會觸發checkpoint
最後一個截框“checkpoint_lsn”可以看到除了日誌備份,其它的三種備份都會觸發checkpoint,大家也通過查詢buffer檢視is_modify欄位是否被修改來判斷。
4.僅複製完整備份可以作為日誌備份的基準備份
這個在上面的截圖中沒有體現出來,但是可以看到日誌備份2的lsn是涵蓋了第三次僅複製備份的lsn,僅複製完整備份其實可以理解成資料庫在一個時間點的快照,而日誌備份是記錄所有更改的日誌操作,可以用來執行redo。所以如果將第3次僅複製完整備份+第5次日誌備份是可以還原所有的資料。
第3次僅複製完整備份+第5次日誌備份它=(第1次完整備份+第4次差異備份+第5次日誌備份)=(第1次完整備份+第2次日誌備份+第5次日誌備份)
執行第3次僅複製完整備份+第5次日誌備份
USE [master] RESTORE DATABASE [city_copyolny] FROM DISK = N'D:\backup\city_full_copyonly_20170613.bak' WITH FILE = 1,
MOVE N'city' TO N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\city_copyolny.mdf',
MOVE N'city_log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\city_copyolny_log.ldf', NORECOVERY, NOUNLOAD, STATS = 5 RESTORE LOG [city_copyolny] FROM DISK = N'D:\backup\city_log2_20170613.trn' WITH FILE = 1, NOUNLOAD, STATS = 5 GO
三、checkpoint意義
由於資料在磁碟是雜湊儲存,如果每次修改都去修改磁碟勢必會造成很多的IO,所以引入了checkpoint重新整理機制,checkpoint根據某些觸發條件將buffer中的髒頁寫入磁碟(也稱作持久化操作)。比如完整備份、僅複製完整備份、差異備份、當日志的修改到達一定的比例、重啟服務等都會觸發checkpoint,當然checkpoint並不是sqlserver獨有的功能,在其他的關係型資料庫比如mysql都存在chckpoint機制;mysql中還存在每秒後臺執行緒執行checkpoint操作,但是貌似sqlserver不會,checkpoint涉及的知識點很多這裡只是稍微介紹!
總結
其實上面的備份測試中在中間在加入一次完整備份就更加完美了,但是如果大家理解備份的原理也是一樣可以理解的。
備註: 作者:pursuer.chen 部落格:http://www.cnblogs.com/chenmh 本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須註明文章來源,且在文章開頭明顯處給明連結。 《歡迎交流討論》 |