·天新网首页·加入收藏·设为首页·网站导航
数码笔记本手机摄像机相机MP3MP4GPS
硬件台式机网络服务器主板CPU硬盘显卡
办公投影打印传真
家电电视影院空调
游戏网游单机动漫
汽车新车购车试驾
下载驱动源码
学院开发设计
考试公务员高考考研
业界互联网通信探索
您真的理解了SQL SERVER的日志链了吗?
http://www.21tx.com 2014年01月17日 cnblogs 桦仔

1 2 3 4 5 6 7 8 9 10 11 下一页

先说清楚这些概念吧

SQLSERVER只有日志链,备份记录(有些人也叫备份链)本人觉得叫备份记录更合适

下面三个东西说的都是同一样东西

备份集=备份记录=备份链

备份集:比如备份的集合,比如有对一个数据库的完备1、差备、日备1、完备2、日备2,这些数据库的备份的集合就是备份集

不过我更喜欢叫备份记录

备份记录实际上指 SELECT * FROM [msdb].[dbo].[backupset]

截断日志跟日志链断裂是否是同一样东西?

截断日志跟日志链断裂不是同一样东西


什么是日志链

其实大家可以把bak文件理解成一个压缩包,完整备份差异备份的时候会把数据和日志一起带进压缩包,

日志备份的时候只会把日志带进压缩包

您真的理解了SQL SERVER的日志链了吗?

我们先从一个实验开始吧

测试环境:SQLSERVER2012 开发版

脚本

为了不产生额外的日志,所以脚本里面没有select into语句,本来想select into进去临时表再对临时表进行排序

但是因为select into会产生额外的日志,只有直接对fn_dblog进行排序了

创建数据库

USE master   
GO   
--创建数据库   
CREATE DATABASE LogChainTest;   
GO   
--改为完整恢复模式   
ALTER DATABASE LogChainTest SET RECOVERY FULL;   
GO

查看当前的事务日志

1 USE [LogChainTest]
2 GO
3 SELECT * FROM [sys].[fn_dblog](NULL,NULL) ORDER BY [Begin Time] ASC

您真的理解了SQL SERVER的日志链了吗?

进行完整备份

--第一个完整备份   
DECLARE @strbackup NVARCHAR(100)   
--改为日期加时间的   
SET @strbackup = 'C:LogChainTest_full1_'
    + REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR, GETDATE(), 120), '-', ''), ' ',   
                      ''), ':', '') + '.bak'
BACKUP DATABASE LogChainTest TO DISK =@strbackup  WITH INIT,CHECKSUM ;   
GO

查看bak文件中的事务日志

SELECT  *   
FROM    fn_dump_dblog(NULL, NULL, N'DISK', 1,   
                      N'c:LogChainTest_full1_20131206202536.bak', DEFAULT,   
                      DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,   
                      DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,   
                      DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,   
                      DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,   
                      DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,   
                      DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,   
                      DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,   
                      DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,   
                      DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,   
                      DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,   
                      DEFAULT, DEFAULT)

您真的理解了SQL SERVER的日志链了吗?

我们再查看此时的数据库事务日志

1 USE [LogChainTest]
2 GO
3 SELECT * FROM [sys].[fn_dblog](NULL,NULL) ORDER BY [Begin Time] ASC

您真的理解了SQL SERVER的日志链了吗?

发现完整备份之后事务日志比之前少了69-10=59行

我们发现bak文件中只记录AllocUnitId,而不记录表名,可能因为bak文件里的日志给SQLSERVER还原用的

而不是给用户查看事务日志用的,所以SQLSERVER干脆不记录表名了,以节省备份时间

您真的理解了SQL SERVER的日志链了吗?

您真的理解了SQL SERVER的日志链了吗?

看到这里大家会有问题了,为什麽日志会截断了?完整备份之后事务日志比之前少了69-10=59行

这里只能说明SQLSERVER把一些跟本数据库无关紧要的日志截断了,例如创建数据库时候修改master数据库的表

而不能说完整备份可以截断日志

而paul的文章给出了解释:

If you switch recovery models to FULL or BULK_LOGGED, until you take the first full backup,

you are still essentially in the SIMPLE recovery model, and so the log will truncate on checkpoint.

文章地址:

http://www.sqlskills.com/blogs/paul/misconceptions-around-the-log-and-log-backups-how-to-convince-yourself/

问题:为什麽bak文件里的日志的最后的三条记录会是

LOP_BEGIN_CKPT

LOP_XACT_CKPT

LOP_END_CKPT

我们用下图来表示吧

您真的理解了SQL SERVER的日志链了吗?

上一篇: SQL Server 跨网段(跨机房)复制
下一篇: SQL SERVER将一个文件组的数据移动到另一个文件组

1 2 3 4 5 6 7 8 9 10 11 下一页

关于我们 | 联系我们 | 加入我们 | 广告服务 | 投诉意见 | 网站导航
Copyright © 2000-2011 21tx.com, All Rights Reserved.
晨新科技 版权所有 Created by TXSite.net