SQL SERVER 事务日志 解析
1 基本介绍
每个数据库都具有事务日志,用于记录所有事物以及每个事物对数据库所作的操作。
日志的记录形式需要根据数据库的恢复模式来确定,数据库恢复模式有三种:
- 完整模式,完全记录事物日志,需要定期进行日志备份。
- 大容量日志模式,适用于批量操作的数据库,可以以更压缩的方式处理日志,需要定期进行日志备份。
- 简单模式,也有日志文件,只是该模式下可以通过 checkpoint 自动重用 virtual log file,所以日志文件会处于一直重复使用的过程,保持一定大小,但是,如果有一个事务启动,很久没有 commit,那么从这个事务开始到最后 commit 的时间段内的事务日志存储空间都无法 checpoint 自动重用,这时,你很可能看到一个很大的日志文件;注意,简单模式下是无法进行日志备份。
数据库里边,任何对数据库的读写都是在内存页中找到对应的数据也,再做修改,如果内存页中不存在数据页,则从磁盘加载如内存中。当一个修改操作发生时,修改的将是内存页中对应的数据页面,同时也会实时记录到日后文件 ldf 中。那么,什么时候数据会被同步到 mdf 文件呢,只有以下三种情况:
- 做 checkpoint 时,后续会专门整理 checkpoint 的相应文章;
- Lazy write 运行时,即内存出现压力,需要把内存中的数据页写入到磁盘,腾出内存空间;
- eager write 时,即发生 bulk insert 和 select into 操作时。
DB 中的事务日志记录,可以给我们带来很多好处,它可以支持以下操作:
- 恢复个别的事务。
- 在 SQL Server 启动时恢复所有未完成的事务。
- 将还原的数据库、文件、文件组或页前滚至故障点。
- 支持事务复制。
- 支持高可用性和灾难恢复解决方案:AlwaysOn 可用性组、数据库镜像和日志传送。
2 对数据库启动的影响
当数据库重启或者还原到最后的时候,数据库都会进入 recovery 状态,正常情况下,这个状态持续时间在几十秒间,但是特殊情况下,它会花费非常长的时间,甚至几个小时,如果这个步骤失败,数据库则进入到挂起 suspect 状态,无法正常提供使用。 那么,当数据库进入 recovery 的时候,它在操作些什么呢? SQL SERVER 日志会记录所有修改记录(数据的修改情况,不包含 SQL 语句),包括 Begin Transaction 和 Commit / Rollback Transaction 操作。由于对事务日志的修改,要比数据文件的修改要快,所有会出现,数据修改更新到了日志文件,但是还没有落盘到数据文件,那么这个时候数据库就处于 recovery 状态,同时对事务日志最近的一个 checkpoint 点以后的所有数据修改记录做以下检查:
所有检查结束后,则会对数据库做一个 checkpoint 的表示,并写入事务日志中,表明日志文件跟数据文件已经同步结束,完成了 recovery 过程,数据库可正常提供使用。这里需要注意一点,如果你数据库最近一次 checkpoint 到现在的修改操作足够多,那么将会耗费相对较长时间来检查,同时也能够在 error log 中看到百分比标识的 recovery 完成进展,避免漫无目的的等待。
Error Log 的检查,可以通过图形界面(见下图)查看当前日志,也可以运行 xp_readerrorlog 查询。
- 1
- /*
- 2 xp_readerrorlog参数说明
- 3 1. 存档编号
- 4 2. 日志类型(1为SQL Server日志,2为SQL Agent日志)
- 5 3. 查询包含的字符串
- 6 4. 查询包含的字符串
- 7 5. LogDate开始时间
- 8 6. LogDate结束时间
- 9 7. 结果排序,按LogDate排序(可以为降序"Desc" Or 升序"Asc"),默认升序
- 10 */
- 11 12 Exec xp_readerrorlog 0,
- 1,
- Null,
- Null,
- '2017-02-16 10:53:32.300',
- '2017-02-16 12:53:32.300'
来源: http://www.cnblogs.com/xinysu/p/6494977.html