设为首页 加入收藏

TOP

SQL Server中的事务日志管理(1/9):事务日志概况(二)
2015-11-21 01:49:13 来源: 作者: 【 】 浏览:2
Tags:SQL Server 事务 日志 管理 1/9 概况
志文件(Virtual Log Files(VLFs)),这个会在第2篇——事务日志架构里详细讲解。
?
SQL Server的预写式日志(write-ahead logging)机制保证修改的描述(例如日志记录)会在数据本身修改写入数据文件前写入VLF。因此,一个日志记录会包含关闭(已提交)事务或打开(未提交)事务的详细信息,在数据被事务修改的不同情况下,会已经或没有写入数据文件,取决于检查点是否已发生。
?
备注:通过定期将脏页从缓存写入磁盘,数据库检查点过程控制着数据库恢复操作期间的工作量。如果SQL Server需要为大量脏页相关的提交事务前滚做出改变,恢复过程会非常长。
?
在恢复期间,和打开事务相关的任何日志记录都需要回滚操作,且总会称为所谓活动(active)VLF的一部分,在日志文件里都会保留。和关闭事务相关的日志记录也会成为活动VLF的一部分,直到到达检查点,在整个VLF里没有打开事务相关的日志记录,在这个点VLF变成不活动(inactive)。
?
在这些不活动的日志记录里本质上提供了先前已完成的数据库事务的“历史”,对这些不活动的VLFs的不同操作取决于数据库的恢复模式。我们会在第3篇到第6篇详细讨论这些恢复模式,但这里的关键点是,如果你使用完整(或大容量日志)数据库恢复模式,事务日志在不活动的VLFs保留日志记录,直到(最近不久)进行了一次日志备份。
?
通过备份事务日志,我们可以在活动日志里的所有日志文件,也包括不活动VLFs里的日志文件,捕获到备份文件。这些日志备份可以用来恢复你的数据库到先前的某个时间点;甚至很有希望恢复到”灾难“发生前的一个时间点。在灾难这样的事件里,日志备份文件可以追加到完全数据库备份的副本,在数据库恢复期间,在完整备份后发生的任何事务都会”前滚“,恢复数据库并恢复到给定的时间点,因此会最小化任何数据丢失。当然,这是假设你已经做这些日志备份,并把它们传送到一个安全的地方。如果你的日志备份文件和活动日志文件在同个硬盘,那个硬盘崩溃后,你也会丢失你的备份。
?
当数据库在简单恢复模式(在第3篇-第4篇会详细介绍),在活动VLFs里的日志记录会保留,因为它们对于回滚操作需要。但是,当检查点发生时,活动的VLFs会被清理,这就是说在这些VLFs里日志记录会被新的日志记录覆盖。这就是为什么简单恢复模式的数据库操作指的是自动截断模式,在日志里没有“历史”维护,因此它不能在日志备份里捕获,也不能作为恢复的一部分。
?
控制日志文件大小
希望刚才的介绍已经让你明白,对于大多数运行在完整恢复模式的生产数据库,进行定期的日志文件备份是必须的,这样可以让数据库恢复到特定的时间点。
?
当在完整(或大容量日志)模式下,还有一点重要的原因需要进行定期的日志文件备份,那就是控制日志文件大小。记住,在SQL Server数据库里,对于每个修改数据或对象的事务都有日志记录写入日志文件。在忙碌的 系统里,会有很多并发的事务,或者一个事务写入很多数据,事务日志文件会增长会非常快。
?
当在完整(或大容量日志)模式下,将非活动VLFs里的日志记录备份到文件,是唯一截断这些活动VLFs的方法,就是说这些被日志记录占用的空间可以被重用。
?
对于截断和事务日志大小的备注:截断日志文件有个常规误区:日志记录被删除,文件大小会变小。不是这样的:日志文件截断只是标记这些空间可以重用。截断,在不同恢复模式下的上下文里,会在接下来的文章里详细讨论。
?
因此,当在完整(或大容量日志)模式下进行定期的事务日志备份的重要原因是控制日志文件的大小。
?
事务日志备份的简单例子
为了简单演示下在这篇文章里我们已经讨论的概念,我们会举一个完整恢复模式下的数据库的事务日志备份例子。在接下来的文章里,每个流程和命令会详细讲解。
?
在1.1的代码里,我们在SQL Server 2008实例上创建一个新的TestDB数据库,使用DBCC SQLPERF(LOGSAPCE)来获得日志日志文件大小。
?
?
?1 USE master ;
?2 IF EXISTS ( SELECT ?name
?3 ? ? ? ? ? ? FROM ? ?sys.databases
?4 ? ? ? ? ? ? WHERE ? name = 'TestDB' )?
?5 ? ? DROP DATABASE TestDB ;
?6 CREATE DATABASE TestDB ON
?7 (
?8 ? NAME = TestDB_dat,
?9 ? FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\TestDB.mdf'
10 ) LOG ON
11 (
12 ? NAME = TestDB_log,
13 ? FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\TestDB.ldf'
14 ) ;
15 DBCC SQLPERF(LOGSPACE) ;
?
?
可以看到,当前日志文件大小近1MB,30%满。
?
备注:在实例上创建的用户数据库的初始大小和增长属性是由model数据库的属性决定的,默认情况下每个数据库使用的恢复模式是(完整,在这里)。我们会在第7篇——事务日志的大小和增长详细讲解这些属性的影响。
?
我们可以到本地硬盘的对应目录下确认下文件的大小。
?
现在我们对TestDB进行数据文件的备份。(你首先要创建“Backups”目录)。注意这个备份操作是在完整恢复模式下进行;在第3篇——事务日志,备份和恢复会有更多详细讲解。
?
1 -- full backup of the database
2 BACKUP DATABASE TestDB
3 TO DISK ='C:\Backups\TestDB.bak'
4 WITH INIT;
5 GO
?
备份完成后,数据文件、日志文件的大小及日志空间的使用率都没有改变,这一点也不奇怪,因为当前在数据库没有用户表和数据。我们在数据库上创建LogTest表,往表里插入100万条记录,再检查下数据库大小。不要担心代码的细节;这里最重要的是我们插入了很多行。这个代码在你电脑上可能会运行几十秒,并不是因为代码并不高效:它只是在后台运行,写入数据和日志文件。

 1 USE TestDB ;
 2 GO
 3 IF OBJECT_ID('dbo.LogTest', 'U') IS NOT NULL 
 4     DROP TABLE dbo.LogTest ;
 5 --===== AUTHOR: Jeff Moden
 6 --===== Create and populate 1,000,000 row test table.
 7 -- "SomeID" has range of 1 to 1000000 unique numbers
 8 -- "SomeInt" has range of 1 to 50000 non-unique numbers
 9 -- "Some
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇在Azure上部署Sqlserver网络访问.. 下一篇对于数据操作的SQL语句精粹(长期..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: