SQLServer三种常见备份
发现⼀个关于sqlserver备份的教程链接,⾥⾯有很多很好的图
摘要
本期⽉报是SQL Server数据库备份技术系列⽂章的开篇,介绍三种常见的SQL Server备份⽅法的⼯作⽅式、使⽤T-SQL语句和使⽤SSMS IDE创建备份集三个层⾯,介绍SQL Server的三种常见备份的⼯作原理和使⽤⽅法。三种常见的备份包括:
数据库完全备份(Full Backup)
数据库⽇志备份(Transaction Log Backup)
数据库差异备份(Differential Backup)
Full Backup
Full Backup(完全备份)是SQL Server所有备份类型中,最为简单、最基础的数据库备份⽅法,它提供了某个数据库在备份时间点的完整拷贝。但是,它仅⽀持还原到数据库备份成功结束的时间点,即不⽀持任意时间点还原操作。
Full Backup⼯作⽅式
以上是Full Backup是什么的解释,那么接下来,我们通过⼀张图和案例来解释Full Backup的⼯作原理。
从这张图和相应的解释分析来看,数据库完全备份⼯作原理应该是⾮常简单的,它就是数据库在备份时间点对所有数据的⼀个完整拷贝。当然在现实的⽣产环境中,事务的操作远⽐这个复杂,因此,在这个图⾥⾯有两个⾮常重要的点没有展⽰出来,那就是:
备份操作可能会导致I/O变慢:由于数据库备份是⼀个I/O密集型操作,所以在数据库备份过程中,可能会导致数据库的I/O操作变慢。
全备份过程中,数据库的事务⽇志不能够被截断:对于具有⼤事务频繁操作的数据库,可能会导致事务⽇志空间⼀直不停频繁增长,直到占满所有的磁盘剩余空间,这个场景在阿⾥云RDS SQL产品中有很多的客户都遇到过。其中之⼀解决⽅法就需要依赖于我们后⾯要谈到的事务⽇志备份技术。
T-SQL创建Full Backup
使⽤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
SSMS IDE创建Full Backup
除了使⽤T-SQL语句创建数据库的完全备份外,我们还可以使⽤SSMS IDE界⾯操作来完成,⽅法: 右键点击想要备份的数据库 => Tasks => Backup => 选择FULL Backup Type => 选择Disk 做为备份⽂件存储 => 点击Add 添加备份⽂件 => 选择你需要存储备份⽂件的⽬录=> 输⼊备份⽂件名,如下图两张图展⽰。
Back up Database设置界⾯
Transaction Log Backup
SQL Server数据库完全备份是数据库的完整拷贝,所以备份⽂件空间占⽤相对较⼤,加之可能会在备份过程中导致事务⽇志⼀直不断增长。事务⽇志备份可以很好的解决这个问题,因为:事务⽇志备份记录了数据库从上⼀次⽇志备份到当前时间内的所有事务提交的数据变更,它可以配合数据库完全备份和差异备份(可选)来实现时间点的还原。当⽇志备份操作成功以后,事务⽇志⽂件会被截断,事务⽇志空间将会被重复循环利⽤,以此来解决完全备份过程中事务⽇志⽂件⼀致不停增长的问题,因此我们最好能够周期性对数据库进⾏事务⽇志备份,以此来控制事务⽇志⽂件的⼤⼩。但是这⾥需要有⼀个前提是数据库必须是FULL恢复模式,SIMPLE恢复模式的数据库不⽀持事务⽇志的备份,当然就⽆法实现时间点的还原。请使⽤下⾯的语句将数据库修改为FULL恢复模式,⽐如针对AdventureWorks2008R2数据库:
USE [master]
GO
ALTER DATABASE [AdventureWorks2008R2] SET RECOVERY FULL WITH NO_WAIT
GO
Transaction Log Backup⼯作⽅式
事务⽇志备份与数据完全备份⼯作⽅式截然不同,它不是数据库的⼀个完整拷贝,⽽是从上⼀次⽇志备份到当前时间内所有已提交的事务数据变更。⽤⼀张图来解释事务⽇志备份的⼯作⽅式:
从这张图我们看到,每个事务⽇志备份⽂件中包含的是已经完成的事务变更,两次事务⽇志备份中存放的是完全不同的变更数据。⽽每⼀次事务⽇志备份成功以后,事务⽇志空间可以被成功回收,重复利⽤,达到了解决数据库完全备份过程中事务⽇志⼀致不断增长的问题。
T-SQL创建事务⽇志备份
使⽤T-SQL语句来创建事务⽇志的备份⽅法如下:
USE Master
GO
BACKUP LOG [AdventureWorks2008R2]
TO DISK = N'C:\temp\AdventureWorks2008R2_' with compression,stats=1;
GO
BACKUP LOG [AdventureWorks2008R2]
TO DISK = N'C:\temp\AdventureWorks2008R2_' with compression,stats=1;
GO
BACKUP LOG [AdventureWorks2008R2]
TO DISK = N'C:\temp\AdventureWorks2008R2_' with compression,stats=1;
GO
SSMS IDE创建事务⽇志备份
使⽤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_';
RESTORE HEADERONLY FROM DISK = N'C:\temp\AdventureWorks2008R2_';
RESTORE HEADERONLY FROM DISK = N'C:\temp\AdventureWorks2008R2_';
查询结果如下:
这⾥有⼀个问题是:为了防⽌数据库事务⽇志⼀直不断的增长,⽽我们⼜不想每次都对数据库做完全备份,那么我们就必须对数据库事务⽇志做周期性的⽇志备份,⽐如:5分钟甚⾄更短,以此来降低数据丢失的风险,以此推算每天会产⽣24 * 12 = 288个事务⽇志备份,这样势必会导致事务⽇志恢复链条过长,拉长恢复时间,增⼤了数据库还原时间(RTO)。这个问题如何解决就是我们下⾯章节要分享到的差异备份技术。
Differential Backup
事务⽇志备份会导致数据库还原链条过长的问题,⽽差异备份就是来解决事务⽇志备份的这个问题的。差异备份是备份从上⼀次数据库全量备份以来的所有变更的数据页,所以差异备份相对于数据库完全备份⽽⾔往往数据空间占⽤会⼩很多。因此,备份的效率更⾼,还原的速度更快,可以⼤⼤提升我们灾难恢复的能⼒。
Differential Backup⼯作⽅式
我们还是从⼀张图来了解数据库差异备份的⼯作⽅式:
sqlserver备份表语句T-SQL创建差异备份
使⽤T-SQL语句创建差异备份的⽅法如下:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论