原文:SQL Server中tempdb的管理

资料来自:

http://blogs.msdn.com/b/sqlserverstorageengine/archive/tags/tempdb/

http://blogs.msdn.com/b/sqlserverstorageengine/archive/2008/12/21/tempdb-basics.aspx

我们推出了一系列的关于TempDB基础,监控和问题调试的博文,也建议大家阅读有开发和测试部门给出的白皮书http://www.microsoft.com/technet/prodtechnol/sql/2005/workingwithtempdb.mspx

Ø  TempDB基础

TempDB和其他用户数据库一样以Model数据库为模板创建,并且可以创建和查询表格。与其他用户数据库不同的是,TempDB在每次SQL Server启动的时候都会被重新创建。这就意味着:

l  TempDB不需要恢复。因此它不必使用全备份或者大容量日志记录恢复模型。事实上,TempDB是配置成简单恢复模型并且不能改变的。

l  虽然TempDB不需要被恢复,但不是说TempDB上的操作没有日志记录。SQL Server中每个操作都是在显式或隐式(每个语句都是一个独立的事务)的事务中完成,这个事务也包含了在TempDB对象上的操作。如果更新全局临时表中的行然后回滚事务,是无法撤销此更改的,除非我们记录了更新之前的值。不过,也没有必要记录更新后的值,因为只有数据库恢复过程中需要重做事务时这个值才有用。像我之前提到的一样,TempDB是不需要恢复的,于是没有理由记录更新后的值。再举一个例子让我们看看插入操作。在一个全局临时表中的插入一行,实际值不会被记录。因为SQL
Server不需要这个行值来完成撤消操作,仅仅需要适当地设置页面中的偏移量,或者这个插入造成页面被分配或者取消分配。总结起来,我们只需要记录可能被撤销的信息而不需要记录可能被重做的信息。这一点关于日志记录文件的变化是由SQLServer 2005开始的。更复杂的情况是,并不是TempDB中所有对象都被日志文件记录。后文会详细叙述。现在我们来看一个例子说明这一点

use tempdb

go

---------------

-- SETUP

---------------

drop table ##t_tempdblog

go

-- create a global temp table. Notice, each row is

-- greater than > 1000. I did this so that we can easily

-- identify if the row is indeed logged.

create table ##t_tempdblog (c1 int, c2 char(1000))

go

-- load 10 rows into this table

declare @i int

select @i = 0

while (@i < 10)

begin

insert into ##t_tempdblog values

(@i, replicate (cast ('a' as varchar), 1000))

select @i = @i+1

end

--Now run the following command to see the log records

select top 10 operation,context,

[log record fixed length],

[log record length]

from fn_dblog(null, null)

where allocunitname='dbo.##t_tempdblog'

order by [Log Record Length] Desc

这是上述查询的输出。您将注意到的所有日志记录都 < 100 字节,显然插入的行没有被记录。

operation       context    log record fixed length    log record length

-----------------------------------------------------------------------

LOP_MODIFY_ROW  LCX_IAM            62                      88

LOP_MODIFY_ROW  LCX_IAM            62                      88

LOP_FORMAT_PAGE LCX_HEAP           80                      84

LOP_FORMAT_PAGE LCX_IAM            80                      84

LOP_FORMAT_PAGE LCX_HEAP           80                      84

LOP_MODIFY_ROW  LCX_PFS            62                      80

LOP_MODIFY_ROW  LCX_PFS            62                      80

LOP_INSERT_ROWS LCX_HEAP           62                      72

LOP_INSERT_ROWS LCX_HEAP           62                      72

LOP_INSERT_ROWS LCX_HEAP           62                      72

于是,这就证明了TempDB的日志和其他用户数据库不同。将上面同样的例子操作应用于用户数据库,日志记录会成为这个样子:

operation             context   log record fixed length log record length

----------------------------------------------------------------------

LOP_INSERT_ROWS      LCX_HEAP          62                      1104

LOP_INSERT_ROWS      LCX_HEAP          62                      1104

LOP_INSERT_ROWS      LCX_HEAP          62                      1104

LOP_INSERT_ROWS      LCX_HEAP          62                      1104

LOP_INSERT_ROWS      LCX_HEAP          62                      1104

LOP_INSERT_ROWS      LCX_HEAP          62                      1104

LOP_INSERT_ROWS      LCX_HEAP          62                      1104

LOP_INSERT_ROWS      LCX_HEAP          62                      1104

LOP_INSERT_ROWS      LCX_HEAP          62                      1101

LOP_INSERT_ROWS      LCX_HEAP          62                      1104

这就证明了,撤销确实会被日志记录。实验时做了以下操作:

update ##t_tempdblog set c2 =

replicate (cast ('b' as varchar), 1000)

之后,做这样的查询:

select top 10 operation,context,

[log record fixed length], [log record length]

from fn_dblog(null, null)

where allocunitname='dbo.##t_tempdblog'

order by [Log Record Length] Desc

以下是输出内容,你会发现日志的长度超过1000字节,事实上列C2更新之前的值被记录了。

operation          context    log record fixed length log record length

-----------------------------------------------------------------------

LOP_MODIFY_ROW     LCX_HEAP       62                      1072

LOP_MODIFY_ROW     LCX_HEAP       62                      1072

LOP_MODIFY_ROW     LCX_HEAP       62                      1072

LOP_MODIFY_ROW     LCX_HEAP       62                      1072

LOP_MODIFY_ROW     LCX_HEAP       62                      1072

LOP_MODIFY_ROW     LCX_HEAP       62                      1072

LOP_MODIFY_ROW     LCX_HEAP       62                      1072

LOP_MODIFY_ROW     LCX_HEAP       62                      1072

LOP_MODIFY_ROW     LCX_HEAP       62                      1072

LOP_MODIFY_ROW     LCX_HEAP       62                      1072

SQL Server中tempdb的管理的更多相关文章

  1. SQL Server中TempDB管理(version store的逻辑结构)

    原文:SQL Server中TempDB管理(version store的逻辑结构) 原文来自: http://blogs.msdn.com/b/sqlserverstorageengine/arch ...

  2. SQL Server中TempDB管理(版本存储区的一个example)

    原文:SQL Server中TempDB管理(版本存储区的一个example) 原文来自: http://blogs.msdn.com/b/sqlserverstorageengine/archive ...

  3. SQL Server中tempdb的management

    对<SQL Server中tempdb的management>的一些更正和补充   对<SQL Server中tempdb的management>的一些更正和补充 前几天看了这 ...

  4. 第十七周翻译-SQL Server中事务日志管理的阶梯,级别5:以完全恢复模式管理日志

    SQL Server中事务日志管理的阶梯,级别5:以完全恢复模式管理日志 作者:Tony Davis,2012/01/27 翻译:赖慧芳 译文: 该系列   本文是Stairway系列的一部分:SQL ...

  5. SQL Server中事务日志管理的步骤,第5级:完全恢复模式管理日志(译)

    SQL Server中事务日志管理的步骤,第5级:完全恢复模式管理日志 作者:Tony Davis,2012/01/27 系列 本文是进阶系列的一部分:SQL Server中事务日志管理的步骤 当事情 ...

  6. 对《SQL Server中tempdb的management》的一些更正和补充

    对<SQL Server中tempdb的management>的一些更正和补充 前几天看了这篇文章:SQL Server中tempdb的management 发现里面有些内容不是很准确 文 ...

  7. [转]如何监测谁用了SQL Server的Tempdb空间

    Tempdb 系统数据库是一个全局资源,供连接到 SQL Server 实例的所有用户使用.在现在的SQL Server里,其使用频率可能会超过用户的想象.如果Tempdb空间耗尽,许多操作将不能完成 ...

  8. SQL Server中的TempDB管理——TempDB基本知识(为什么需要版本存储区)

    原文:SQL Server中的TempDB管理--TempDB基本知识(为什么需要版本存储区) 参考资料来自: http://blogs.msdn.com/b/sqlserverstorageengi ...

  9. SQL Server 中如何移动tempdb到新的位置

    操作步骤:1.检查tempdb的逻辑名字和它的存在位置.可以使用下面语句: SELECT name, physical_name FROM sys.master_files WHERE databas ...

随机推荐

  1. BZOJ 1038 ZJOI2008 瞭望塔 半平面交

    题目大意及模拟退火题解:见 http://blog.csdn.net/popoqqq/article/details/39340759 这次用半平面交写了一遍--求出半平面交之后.枚举原图和半平面交的 ...

  2. 阐述php(四) 流量控制

    一个.选择结构 1. 单路分支 <? php if(条件){ 运行一条语句; } ?> 2. 双路分支 <?php if(条件) 运行一条语句; }else 运行一条语句; } ?& ...

  3. AC automation 模板

    /* 1.对n个字符串构造tire树 insertWord(node *root, char *word); 2.bfs构造fail指针 makeFail(node *root); 3.基于以上两点的 ...

  4. ArcGIS SDE 10.1 for Postgresql 服务连接配置

    去年写了ArcGIS 10.1 如何连接Postgresql 数据库(http://blog.csdn.net/arcgis_all/article/details/8202709)当时采用的也是Ar ...

  5. 《Head First 设计模式》学习笔记——迭代模式 + 组合模式

    迭代模式设置共生死亡,一般来说.我们只是想实现一个集,我们需要的同时提供这个集合的迭代器,喜欢java中间Collection.List.Set.Map等,这些集合都有自己的迭代器.假如我们要实现一个 ...

  6. MVC Razor视图引擎控件

    0.日期转化

  7. SharePoint 2010 BCS - 概要

    博客地址 http://blog.csdn.net/foxdave SharePoint 2010首次引入了BCS的概念 - Business Connectivity Service.即业务连接服务 ...

  8. Sliverlight实例之 绘制扇形和环形图

    一,1道几何题 已知两点坐标确定一条直线,直线上存在一个未知点,起始点与未知点的距离已知 求:未知点坐标 思路,如下: 求AB长度,可以根据两点距离公式 二,写个C#类 定义一个Point类,代表坐标 ...

  9. 安装nodejs搭建ghost个人博客

    记录一下今天在linux下折腾nodejs的过程,相互学习: (不知道为什么用源代码安装,调用npm的时候老是会出现找不到npmlog的 错误,后来换用下了个二进制 来搞,假设那个牛牛知道为什么.希望 ...

  10. ProgressBar样式总结与自己主动填充方法(代码)

    有时候开发的时候须要用一个进度条告知用户眼下正在执行一个耗时操作,可是并不须要明白知道某个value来setProgress,所以就能够自己定义一个时间和进度让进度条自己主动执行了. 以下是代码: H ...