当前位置: 首页 > news >正文

SQLServer 理解copyonly备份操作

标签: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

本站点所有随笔都是原创,欢迎大家转载;但转载时必须注明文章来源,且在文章开头明显处给明链接。

《欢迎交流讨论》

相关文章:

  • pycharm2016序列号失效问题解决办法
  • ASP.NET Core DI 手动获取注入对象
  • 深入浅出 spring-data-elasticsearch - 基本案例详解(三)
  • 远程桌面无法复制粘贴的解决方法
  • 《vSphere性能设计:性能密集场景下CPU、内存、存储及网络的最佳设计实践》一1.2.1 CPU基础设施基准...
  • “智能云”战略新品震撼发布,开发者如何快速上手?
  • 对于startActivity的使用改进
  • [设计模式][c++]状态切换模式
  • POJ2117-Electricity
  • HTML/CSS 知识点
  • java并发编程之:线程共享数据的方式
  • 《2017年全球数据库安全市场趋势》
  • 聊聊运维(1)证明你是坏运维的七个迹象,不要做CPR运维
  • 怎样制作C#安装程序
  • Sqoop_具体总结 使用Sqoop将HDFS/Hive/HBase与MySQL/Oracle中的数据相互导入、导出
  • 《剑指offer》分解让复杂问题更简单
  • ES6系统学习----从Apollo Client看解构赋值
  • Java小白进阶笔记(3)-初级面向对象
  • ViewService——一种保证客户端与服务端同步的方法
  • windows下如何用phpstorm同步测试服务器
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 目录与文件属性:编写ls
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 试着探索高并发下的系统架构面貌
  • 探索 JS 中的模块化
  • 微服务核心架构梳理
  • 异步
  • 在weex里面使用chart图表
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 从如何停掉 Promise 链说起
  • 第二十章:异步和文件I/O.(二十三)
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • # 安徽锐锋科技IDMS系统简介
  • #传输# #传输数据判断#
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (2020)Java后端开发----(面试题和笔试题)
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (九十四)函数和二维数组
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (三)c52学习之旅-点亮LED灯
  • (转)甲方乙方——赵民谈找工作
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .htaccess 强制https 单独排除某个目录
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .net6Api后台+uniapp导出Excel
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境