发现一个关于sqlserver备份的教程连接,里面有不少很好的图mysql
https://sqlbak.com/academy/sql
本期月报是SQL Server数据库备份技术系列文章的开篇,介绍三种常见的SQL Server备份方法的工做方式、使用T-SQL语句和使用SSMS IDE建立备份集三个层面,介绍SQL Server的三种常见备份的工做原理和使用方法。三种常见的备份包括:数据库
数据库彻底备份(Full Backup)sqlserver
数据库日志备份(Transaction Log Backup)阿里云
数据库差别备份(Differential Backup)spa
Full Backup(彻底备份)是SQL Server全部备份类型中,最为简单、最基础的数据库备份方法,它提供了某个数据库在备份时间点的完整拷贝。可是,它仅支持还原到数据库备份成功结束的时间点,即不支持任意时间点还原操做。3d
以上是Full Backup是什么的解释,那么接下来,咱们经过一张图和案例来解释Full Backup的工做原理。 日志
从这张图和相应的解释分析来看,数据库彻底备份工做原理应该是很是简单的,它就是数据库在备份时间点对全部数据的一个完整拷贝。固然在现实的生产环境中,事务的操做远比这个复杂,所以,在这个图里面有两个很是重要的点没有展现出来,那就是:code
备份操做可能会致使I/O变慢:因为数据库备份是一个I/O密集型操做,因此在数据库备份过程当中,可能会致使数据库的I/O操做变慢。server
全备份过程当中,数据库的事务日志不可以被截断:对于具备大事务频繁操做的数据库,可能会致使事务日志空间一直不停频繁增加,直到占满全部的磁盘剩余空间,这个场景在阿里云RDS SQL产品中有不少的客户都遇到过。其中之一解决方法就须要依赖于咱们后面要谈到的事务日志备份技术。
使用T-SQL语句来完成数据库的彻底备份,使用BACKUP DATABASE语句便可,以下,对AdventureWorks2008R2数据库进行一个彻底备份:
USE master GO BACKUP DATABASE [AdventureWorks2008R2] TO DISK = 'C:\Temp\AdventureWorks2008R2_20171112_FULL.bak' WITH COMPRESSION, INIT, STATS = 5; GO
除了使用T-SQL语句建立数据库的彻底备份外,咱们还可使用SSMS IDE界面操做来完成,方法: 右键点击想要备份的数据库 => Tasks => Backup => 选择FULL Backup Type => 选择Disk 作为备份文件存储 => 点击Add 添加备份文件 => 选择你须要存储备份文件的目录 => 输入备份文件名,以下图两张图展现。
Back up Database设置界面
SQL Server数据库彻底备份是数据库的完整拷贝,因此备份文件空间占用相对较大,加之可能会在备份过程当中致使事务日志一直不断增加。事务日志备份能够很好的解决这个问题,由于:事务日志备份记录了数据库从上一第二天志备份到当前时间内的全部事务提交的数据变动,它能够配合数据库彻底备份和差别备份(可选)来实现时间点的还原。当日志备份操做成功之后,事务日志文件会被截断,事务日志空间将会被重复循环利用,以此来解决彻底备份过程当中事务日志文件一致不停增加的问题,所以咱们最好可以周期性对数据库进行事务日志备份,以此来控制事务日志文件的大小。可是这里须要有一个前提是数据库必须是FULL恢复模式,SIMPLE恢复模式的数据库不支持事务日志的备份,固然就没法实现时间点的还原。请使用下面的语句将数据库修改成FULL恢复模式,好比针对AdventureWorks2008R2数据库:
USE [master] GO ALTER DATABASE [AdventureWorks2008R2] SET RECOVERY FULL WITH NO_WAIT GO
事务日志备份与数据彻底备份工做方式大相径庭,它不是数据库的一个完整拷贝,而是从上一第二天志备份到当前时间内全部已提交的事务数据变动。用一张图来解释事务日志备份的工做方式:
从这张图咱们看到,每一个事务日志备份文件中包含的是已经完成的事务变动,两次事务日志备份中存放的是彻底不一样的变动数据。而每一次事务日志备份成功之后,事务日志空间能够被成功回收,重复利用,达到了解决数据库彻底备份过程当中事务日志一致不断增加的问题。
使用T-SQL语句来建立事务日志的备份方法以下:
USE Master GO BACKUP LOG [AdventureWorks2008R2] TO DISK = N'C:\temp\AdventureWorks2008R2_log_201711122201.trn' with compression,stats=1; GO BACKUP LOG [AdventureWorks2008R2] TO DISK = N'C:\temp\AdventureWorks2008R2_log_201711122202.trn' with compression,stats=1; GO BACKUP LOG [AdventureWorks2008R2] TO DISK = N'C:\temp\AdventureWorks2008R2_log_201711122203.trn' with compression,stats=1; GO
使用SSMS IDE建立事务日志备份的方法: 右键点击想要建立事务日志备份的数据库 => Tasks => Backup => 选择Transaction Log Backup Type => 选择Disk 作为备份文件存储 => 点击Add 添加备份文件 => 选择你须要存储备份文件的目录 => 输入备份文件名,以下图展现:
因为数据库彻底备份是时间点数据的完整拷贝,每一个数据库完整备份相互独立,而多个事务日志备份是经过事务日志链条链接在一块儿,事务日志链起点于彻底备份,SQL Server中的每个事务日志备份文件都拥有本身的FirstLSN和LastLSN,FirstLSN用于指向前一个事务日志备份文件的LastLSN;而LastLSN指向下一个日志的FirstLSN,以此来创建这种连接关系。这种连接关系决定了事务日志备份文件还原的前后顺序。固然,若是其中任何一个事务日志备份文件丢失或者破坏,都会致使没法恢复整个事务日志链,仅可能恢复到你拥有的事务日志链条的最后一个。事务日志备份链条的关系以下图所示:
咱们使用前面“T-SQL建立事务日志备份”建立的事务日志链,使用RESTORE HEADERONLY方法来查看事务日志链的关系:
USE Master GO RESTORE HEADERONLY FROM DISK = N'C:\temp\AdventureWorks2008R2_log_201711122201.trn'; RESTORE HEADERONLY FROM DISK = N'C:\temp\AdventureWorks2008R2_log_201711122202.trn'; RESTORE HEADERONLY FROM DISK = N'C:\temp\AdventureWorks2008R2_log_201711122203.trn';
查询结果以下:
这里有一个问题是:为了防止数据库事务日志一直不断的增加,而咱们又不想每次都对数据库作彻底备份,那么咱们就必须对数据库事务日志作周期性的日志备份,好比:5分钟甚至更短,以此来下降数据丢失的风险,以此推算天天会产生24 * 12 = 288个事务日志备份,这样势必会致使事务日志恢复链条过长,拉长恢复时间,增大了数据库还原时间(RTO)。这个问题如何解决就是咱们下面章节要分享到的差别备份技术。
事务日志备份会致使数据库还原链条过长的问题,而差别备份就是来解决事务日志备份的这个问题的。差别备份是备份从上一次数据库全量备份以来的全部变动的数据页,因此差别备份相对于数据库彻底备份而言每每数据空间占用会小不少。所以,备份的效率更高,还原的速度更快,能够大大提高咱们灾难恢复的能力。
咱们仍是从一张图来了解数据库差别备份的工做方式:
使用T-SQL语句建立差别备份的方法以下:
USE master GO BACKUP DATABASE [AdventureWorks2008R2] TO DISK = 'C:\Temp\AdventureWorks2008R2_20171112_diff.bak' WITH DIFFERENTIAL GO
使用SSMS IDE建立差别备份的方法: 右键点击想要建立事务日志备份的数据库 => Tasks => Backup => 选择Differential Backup Type => 选择Disk 作为备份文件存储 => 点击Add 添加备份文件 => 选择你须要存储备份文件的目录 => 输入备份文件名,以下图展现:
本期月报分享了SQL Server三种常见的备份技术的工做方式和备份方法。数据库彻底备份是数据库备份时间的一个完整拷贝;事务日志备份是上一第二天志备份到当前时间的事务日志变动,它解决了数据库彻底备份过程当中事务日志一直增加的问题;差别备份上一次彻底备份到当前时间的数据变动,它解决了事务日志备份链过长的问题。 将SQL Server这三种备份方式的工做方式,优缺点总结以下表格:
从这个表格,咱们知道每种备份有其各自的优缺点,那么咱们如何来制定咱们的备份和还原策略以达到快速灾难恢复的能力呢?这个话题,咱们将在下一期月报中进行分享。