千家信息网

SQLServer 理解copyonly备份操作

发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,Alwayson在添加数据库的过程中如果同步首选项选择的是"完整",那么就会在主副本上执行copyonly的完整备份和日志备份在辅助副本上执行还原操作,也正是这个操作让我对copyonly有了新的理解
千家信息网最后更新 2025年12月01日SQLServer 理解copyonly备份操作

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,bs.backup_start_date,bs.backup_finish_date,bs.backup_size,bs.recovery_modelFROM msdb.dbo.backupset bs --INNER JOIN msdb.dbo.backupfile bf ON bs.backup_set_id=bf.backup_set_idWHERE 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次日志备份

        N     ,  MOVE N  N,  MOVE N  N,  NORECOVERY,  NOUNLOAD,  STATS         N     ,  NOUNLOAD,  STATS

三、checkpoint意义

由于数据在磁盘是散列存储,如果每次修改都去修改磁盘势必会造成很多的IO,所以引入了checkpoint刷新机制,checkpoint根据某些触发条件将buffer中的脏页写入磁盘(也称作持久化操作)。比如完整备份、仅复制完整备份、差异备份、当日志的修改到达一定的比例、重启服务等都会触发checkpoint,当然checkpoint并不是sqlserver独有的功能,在其他的关系型数据库比如mysql都存在chckpoint机制;mysql中还存在每秒后台线程执行checkpoint操作,但是貌似sqlserver不会,checkpoint涉及的知识点很多这里只是稍微介绍!


备份 日志 数据 差异 数据库 序列 序列号 基准 磁盘 副本 机制 知识 知识点 查询 重要 接下来 三个 上图 中用 也就是 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 达芬奇恢复数据库初始化失败 福州美咔互联网科技有限公司 截图上传 服务器 原始时间 北京软件开发小公司有哪些 爱南宁APP软件开发 查询sql数据库所有表使用时间 理论考试系统怎么修改数据库 软件过程包括软件开发 mysql数据库中存放图片 维基解密是不是网络安全事件 西安盖世网络技术有限公司 梦幻西游三个服务器组队 网络安全二维码靠谱吗 游戏软件开发很赚钱吗 编译服务器 数据库查看数据条数 中国首家燃气网络安全管理平台 服务器如何输入密钥 关系数据库的基本概念简述 上海邦移网络技术有限公司 L根镜像服务器是什么 ps5港版怎么重建数据库 小鸟免费服务器 excel生成双色球数据库 江西凡一网络技术有限公司 西城区高科技软件开发技术规范 中国做网络安全公司 人工智能与网络安全的构想 南京千度软件开发 服务器如何返回数据
0