SQLServer 理解copyonly備份操做

標籤:MSSQL/日誌截斷mysql

概述  

Alwayson在添加數據庫的過程當中若是同步首選項選擇的是「完整」,那麼就會在主副本上執行copyonly的完整備份和日誌備份在輔助副本上執行還原操做,也正是這個操做讓我對copyonly有了新的理解。雖然之前也常常使用copyonly執行完整備份,
可是以前對copyonly的理解存在一點誤區。接下來詳細說明copyonly的操做。sql

 

 

1、備份測試 

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

 

2、查詢備份

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完整備份和差別備份不會截斷日誌(固然若是中間還存在完整備份一樣不會截斷日誌,你們能夠去試試sqlserver

2.僅複製完整備份不能做爲差別備份的基準備份

從中間的截框「database_backup_lsn」列能夠看到,全部的後面的備份都基於第一次完整備份做爲基準備份。測試

3.完整、差別、僅複製完整備份會觸發checkpoint

最後一個截框「checkpoint_lsn」能夠看到除了日誌備份,其它的三種備份都會觸發checkpoint,你們也經過查詢buffer查看is_modify字段是否被修改來判斷。spa

4.僅複製完整備份能夠做爲日誌備份的基準備份

這個在上面的截圖中沒有體現出來,可是能夠看到日誌備份2的lsn是涵蓋了第三次僅複製備份的lsn,僅複製完整備份其實能夠理解成數據庫在一個時間點的快照,而日誌備份是記錄全部更改的日誌操做,能夠用來執行redo。因此若是將第3次僅複製完整備份+第5第二天志備份是能夠還原全部的數據。線程

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

 

執行第3次僅複製完整備份+第5第二天志備份code

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

3、checkpoint意義

因爲數據在磁盤是散列存儲,若是每次修改都去修改磁盤勢必會形成不少的IO,因此引入了checkpoint刷新機制,checkpoint根據某些觸發條件將buffer中的髒頁寫入磁盤(也稱做持久化操做)。好比完整備份、僅複製完整備份、差別備份、當日志的修改到達必定的比例、重啓服務等都會觸發checkpoint,固然checkpoint並非sqlserver獨有的功能,在其餘的關係型數據庫好比mysql都存在chckpoint機制;mysql中還存在每秒後臺線程執行checkpoint操做,可是貌似sqlserver不會,checkpoint涉及的知識點不少這裏只是稍微介紹!server

 

總結  

其實上面的備份測試中在中間在加入一次完整備份就更加完美了,可是若是你們理解備份的原理也是同樣能夠理解的。

 

 

 

 

 

備註:

    做者:pursuer.chen

    博客:http://www.cnblogs.com/chenmh

本站點全部隨筆都是原創,歡迎你們轉載;但轉載時必須註明文章來源,且在文章開頭明顯處給明連接。

《歡迎交流討論》

相關文章
相關標籤/搜索