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的管理的更多相关文章
- SQL Server中TempDB管理(version store的逻辑结构)
原文:SQL Server中TempDB管理(version store的逻辑结构) 原文来自: http://blogs.msdn.com/b/sqlserverstorageengine/arch ...
- SQL Server中TempDB管理(版本存储区的一个example)
原文:SQL Server中TempDB管理(版本存储区的一个example) 原文来自: http://blogs.msdn.com/b/sqlserverstorageengine/archive ...
- SQL Server中tempdb的management
对<SQL Server中tempdb的management>的一些更正和补充 对<SQL Server中tempdb的management>的一些更正和补充 前几天看了这 ...
- 第十七周翻译-SQL Server中事务日志管理的阶梯,级别5:以完全恢复模式管理日志
SQL Server中事务日志管理的阶梯,级别5:以完全恢复模式管理日志 作者:Tony Davis,2012/01/27 翻译:赖慧芳 译文: 该系列 本文是Stairway系列的一部分:SQL ...
- SQL Server中事务日志管理的步骤,第5级:完全恢复模式管理日志(译)
SQL Server中事务日志管理的步骤,第5级:完全恢复模式管理日志 作者:Tony Davis,2012/01/27 系列 本文是进阶系列的一部分:SQL Server中事务日志管理的步骤 当事情 ...
- 对《SQL Server中tempdb的management》的一些更正和补充
对<SQL Server中tempdb的management>的一些更正和补充 前几天看了这篇文章:SQL Server中tempdb的management 发现里面有些内容不是很准确 文 ...
- [转]如何监测谁用了SQL Server的Tempdb空间
Tempdb 系统数据库是一个全局资源,供连接到 SQL Server 实例的所有用户使用.在现在的SQL Server里,其使用频率可能会超过用户的想象.如果Tempdb空间耗尽,许多操作将不能完成 ...
- SQL Server中的TempDB管理——TempDB基本知识(为什么需要版本存储区)
原文:SQL Server中的TempDB管理--TempDB基本知识(为什么需要版本存储区) 参考资料来自: http://blogs.msdn.com/b/sqlserverstorageengi ...
- SQL Server 中如何移动tempdb到新的位置
操作步骤:1.检查tempdb的逻辑名字和它的存在位置.可以使用下面语句: SELECT name, physical_name FROM sys.master_files WHERE databas ...
随机推荐
- pygame系列
在接下来的blog中,会有一系列的文章来介绍关于pygame的内容,pygame系列偷自http://www.cnblogs.com/hongten/p/hongten_pygame_install. ...
- Android版本铎A梦幻连连看游戏源代码完整版
我写主代码,没有版权问题,它少量小游戏和应用源代码稍后会陆续上线!哆啦A梦连连看包含了2种游戏模式和60关卡,并能够通过改动配置文件非常方便的实现自行添加新关卡.採用andengine游戏引擎开发,内 ...
- vb实现多用户登录
利用vb实现多用户登录,主要是将vb与数据库实现链接,这个问题在作品展中我们的软件“天天迹录”的登录时用到,但是当时自己只是知道有这么个功能,但是那些代码的含义并不明白,在3个月后的我又有机会接触到它 ...
- Windows Phone开发(30):图形
原文:Windows Phone开发(30):图形 图形如矩形.椭圆.路径等都从Shape类派生,它们一般表示规则或不规则图形,这些图形都是简单的二维图形,我相信大家都能理解的. 例一:矩形. 请看下 ...
- (视频)《高速创建站点》 4.2 完结篇 – 应用运营vs.发射卫星,遥測(Telemetry) 技术
本文是<高速创建站点>系列的第10篇(完结篇),假设你还没有看过之前的内容,建议你点击下面文件夹中的章节先阅读其它内容再回到本文.訪问本系列文件夹.请点击:http://anb.io/bl ...
- JQuery打印
jquery.jqprint-0.3.js JQuery提供的局部打印功能: <input type="button" value="打印" onclic ...
- Android该系统提供的服务--Vibrator(振子)
Android该系统提供的服务--Vibrator(振子) --转载请注明出处:coder-pig Vibrator简单介绍与相关方法: watermark/2/text/aHR0cDovL2Jsb2 ...
- 重新想象 Windows 8 Store Apps (16) - 控件基础: 依赖属性, 附加属性, 控件的继承关系, 路由事件和命中测试
原文:重新想象 Windows 8 Store Apps (16) - 控件基础: 依赖属性, 附加属性, 控件的继承关系, 路由事件和命中测试 [源码下载] 重新想象 Windows 8 Store ...
- 【原创】一个基于简单剪枝的DFS解数独程序
问题来源:leetCode Sudoku Solver Write a program to solve aSudoku puzzle by filling the empty cells. Empt ...
- Android采取async框架文件上传
页面效果 须要的权限 <uses-permission android:name="android.permission.INTERNET"/> 网络訪问权限; 布局文 ...