暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL Server中tempdb的management

SQLServer走起 2020-07-17
670

TempDB基础

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

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

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

现在我们来看一个例子说明这一点

    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

              文章转载自:

              http://blogs.msdn.com/b/apgcdsd/archive/2012/03/12/sql-server-tempdb-management.aspx

              文章经作者授权转载,版权归原文作者所有

              图片来源于网络,侵权必删!

              文章转载自SQLServer走起,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论