• SQL Server TempDB 和 Model 数据库之间的关系和比较


    默认情况下,每个 SQL Server 实例都带有四个系统数据库——Master、MSDB、Model 和 TempDB。TempDB 数据库是一个全局数据库,几乎所有用户和进程都使用它来实现各种功能,例如存储临时对象、内部对象、某些操作的中间排序结果(Group BY、Order BY、重建索引)。

    那么,SQL Server TempDB 和 Model 数据库之间有什么关系呢?下面,我们将验证两者之间的关系。

    • TempDB 是 Model 数据库的副本吗?

    SQL Server 中的 Model 数据库充当 SQL Server 中所有新创建的数据库的模板。如果对此数据库进行任何更改,所有新数据库都会获得这些更改。现在,大多数 DBA 都知道 SQL Server 会在服务重新启动时重新创建 TempDB。因此,不要使用 TempDB 将对象存储在 TempDB 数据库中。

    因此,SQL Server 也使用 Model 数据库来创建 TempDB 数据库。然而,它不是一个精确的副本。

    • 恢复模式差异

    查看两者的回复模式

    Select [name] as Databasename, recovery_model_desc as DBReocoveryModel from sys.databaseswhere name in('TempDB','Model')

    让我们尝试重新启动 SQL Server 并重新运行上述查询。你得到相同的结果。TempDB 始终保留在简单恢复模式,因为它是一个日志记录最少的数据库。你不能将恢复模式修改为完整或大容量日志。否则,它会给出以下错误消息。

    USE [master] ;  ALTER DATABASE [TempDB] SET RECOVERY FULL ;

    结论:TempDB 数据库始终保持在简单的恢复模式。Model 数据库恢复模型不会影响它。

    • TempDB 数据文件和日志文件

    默认情况下,每个新数据库都会获得一个主数据文件 (*.mdf) 和事务日志文件 (*.ldf)。根据最佳实践,DBA 根据逻辑处理器的数量配置多个 TempDB 数据库文件以减少争用。

    • 逻辑处理器数小于等于8,按逻辑处理器创建数据文件

    • 逻辑处理器数量大于八个,创建八个数据文件

    • 监控 TempDB 争用,并在需要时将数据文件增加四的倍数

    假设你为 SQL 实例创建了四个 TempDB 数据文件。我们知道,默认情况下,Model 数据库只有一个数据文件。所以想几个问题:

    每次重新启动 SQL Server 时都需要重新创建 TempDB 文件吗?

    TempDB 文件数是否等于 Model 数据库数据文件?

    在我的演示环境中,我有一个 TempDB 数据文件。因此,我使用以下查询添加了另外三个文件:
     

    1. USE [master]
    2. GO
    3. ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev2', FILENAME = N'D:\Program Files\Microsoft SQL Server\MSSQL14.MSSQL2017\MSSQL\DATA\tempdev2.ndf' , SIZE = 8192KB , FILEGROWTH = 65536KB )
    4. GO
    5. ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev3', FILENAME = N'D:\Program Files\Microsoft SQL Server\MSSQL14.MSSQL2017\MSSQL\DATA\tempdev3.ndf' , SIZE = 8192KB , FILEGROWTH = 65536KB )
    6. GO
    7. ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev4', FILENAME = N'D:\Program Files\Microsoft SQL Server\MSSQL14.MSSQL2017\MSSQL\DATA\tempdev4.ndf' , SIZE = 8192KB , FILEGROWTH = 65536KB )
    8. GO

    如下图,TempDB数据库有四个数据文件,而Model数据库有一个数据文件。​​​​​​​

    select name,state_desc from tempdb.sys.database_files where type=0select name,state_desc from model.sys.database_files where type=0

    现在,使用 SQL Server 配置管理器重新启动 SQL 服务并验证 TempDB 数据文件的数量。你将获得在 SQL 服务重新启动之前配置的四个 TempDB 数据文件。

    SQL Server 将数据文件和日志文件的数量存储在其内部表中。例如,以下查询从 [sys].[master_files] 中检索 TempDB 配置的数据。

    select db_name(database_id) as [DatabaseName], type_desc, name,physical_name, size, growth from [Master].[sys].[master_files]where db_name(database_id)='TempDB'

    结论:SQL Server 会在 SQL 服务重新启动后保留 TempDB 数据文件的数量。

    • TempDB 文件的自动增长配置

    我们将文件增长设置为 16 MB.​​​​​​​

    USE [master]ALTER DATABASE [tempdb] MODIFY FILE ( NAME = N'tempdev', SIZE = 16384KB )ALTER DATABASE [tempdb] MODIFY FILE ( NAME = N'tempdev2', SIZE = 16384KB )ALTER DATABASE [tempdb] MODIFY FILE ( NAME = N'tempdev3', SIZE = 16384KB )ALTER DATABASE [tempdb] MODIFY FILE ( NAME = N'tempdev4', SIZE = 16384KB )

    重启 SQL Server 服务,当 tempdb 重建后,文件数及增长大小并没有改变。

    结论:TempDB 没有从模型数据库中获取自动增长配置。

    • Model 和 TempDB 数据库中的数据库对象

    众所周知,Model 数据库是新创建的数据库的模板。因此,在你希望所有新数据库都拥有这些对象的副本之前,不应在其中创建任何对象。假设你在 Model 数据库中创建了一个审计表。

    TempDB 是否从 Model 数据库中获取对象?

    为了回答上述问题,让我们使用以下脚本在 Model 数据库中创建一个对象。

    Use ModelgoCreate Table AuditLogs(        ID int,        Auditdata varchar(50))

    现在,重新启动 SQL Server 服务并验证 [AuditLogs] 表是否存在于 TempDB 数据库中。该表存在如下所示。

    select * from tempdb.sys.tables

    结论:如果你在 Model 数据库中创建任何对象,它会在 TempDB 数据库中创建,服务重启的行为类似于新的常规用户数据库

    • 哪个数据库先启动——Model 还是 TempDB?

    SQL 服务启动后,它会按照特定顺序将所有数据库置于联机状态。它将一个条目记录到启动数据库及其恢复过程的错误日志中。

    要获取数据库启动顺序,请执行以下查询:​​​​​​​

    DECLARE @DBS TABLE (  LogDate DATETIME,   ProcessInfo VARCHAR(10),   LogText VARCHAR(50))INSERT INTO @DBS (LogDate, ProcessInfo, LogText)EXEC sys.sp_readerrorlog 0, 1, 'Starting up database'SELECT dbs.LogDate LogDateTime, dbs.ProcessInfo, dbs.LogTextFROM @DBS AS dbsORDER BY dbs.LogDate ASC

    如上图所示,SQL Server首先启动Master数据库,然后是资源数据库(mssqlsystemresource)。TempDB 仅在 Model 数据库之后启动。因此, Model 数据库对于 SQL 服务启动是必不可少的。如果它不可访问,SQL 服务将不会启动。

    如果你专门为 TempDB 过滤错误日志,你将获得以下条目。在 TempDB 启动期间,它还会在错误日志中记录 TempDB 文件的数量。

    结论:Model 数据库对于服务启动期间的 TempDB 是必不可少的。你还可以从错误日志中找出 TempDB 文件的数量

    • TempDB 数据库备份的工作方式是否类似于 Model 数据库

    Model 数据库备份取决于恢复模型。如果 DB 处于默认(完整)恢复模式,你可以进行类似于常规事务数据库的完整、差异、日志备份。

    TempDB 数据库始终保持在简单恢复模式中。但是,你不能对 TempDB 进行任何类型的备份。在 SSMS GUI 中,你看不到 TempDB 备份选项。

    如果你尝试使用 T-SQL 进行数据库备份,则会收到以下错误消息。它终止备份,因为它在 TempDB 数据库上是不允许的。

    • Model 和 TempDB 数据库中的事务日志记录

    SQL Server 对 TempDB 数据库使用最少的事务日志记录。因此,如果你在常规用户数据库或 TempDB 上运行工作负载,则性能会有所不同。如果我们重新启动 SQL 服务,我们会得到一个干净的 TempDB 副本。因此,TempDB 仅记录事务的某些日志记录。

    另一方面,Model 数据库是模板数据库;因此,即使在执行回滚的简单恢复模式中,SQL Server 也能确保记录事务。

    为了检查事务性能,我们将在 Model 和 TempDB 数据库上启动相同的事务。

    注意:不要使用 Model 数据库来执行查询。在本文中,我们使用它来执行 Model 和 TempDB 关系的演示

    以下查询在 TempDB 数据库中创建 [DemoTable] 并向其中插入几条记录。​​​​​​​

    Use TempDBGoCREATE TABLE DemoTable(  ID INT IDENTITY,  [Date] DATETIME DEFAULT GETDATE(),  [Text] varchar(500) default 'ABC');
    SET NOCOUNT ON;declare @i int = 0while @i<100000beginINSERT INTO dbo.DemoTable DEFAULT VALUES;set @i=@i+1endGO

    如下图,TempDB 使用了7秒。同样在Model数据库上执行同样的操作,耗时45秒。这是由于 TempDB 中的事务日志记录最少。

    本文探讨了 SQL Server  Model 和 TempDB 数据库之间的关系。通常,DBA 不会考虑 Model 数据库的重要性,因为它只是新数据库的模板。它在 SQL Server 数据库创建中起着至关重要的作用。TempDB 数据库也是它的一个副本,它继承了一些属性,例如文件数量、自动增长、来自主数据库表的恢复模式。

    更多请关注 公-众-号:SQLServer

  • 相关阅读:
    排序6:冒泡排序及优化思想
    如何一键重装Win7系统 便捷重装Win7系统教程
    广东MES系统实现设备管理的方法与功能
    面向对象设计模式——工厂方法(Method Factory))
    Linux CentOS7 vim宏操作
    5、Redis的发布和订阅
    电商运营管理——广告系统
    CUDA纹理内存tex1D/tex2D/tex3D函数
    Centos8搭建npm和maven的nexus私服
    牛客多校-Link with Arithmetic Progression-(三分总结)
  • 原文地址:https://blog.csdn.net/kk185800961/article/details/125463950