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

Posted 薛定谔的DBA

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 数据文件。因此,我使用以下查询添加了另外三个文件:
 

USE [master]
GO
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 )
GO
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 )
GO
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 )
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

以上是关于SQL Server TempDB 和 Model 数据库之间的关系和比较的主要内容,如果未能解决你的问题,请参考以下文章

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

如何收缩 SQL Server 中的 Tempdb 数据库

SQL Server如何删除多余tempDB文件

sql server 临时库文件太大 迁移tempdb数据库

sql server 2008r2的tempdb很大怎么办

《SQL Server企业级平台管理实践》读书笔记——SQL Server中关于系统库Tempdb总结