默认情况下,每个 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.databases
where 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=0
select 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 Model
go
Create 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.LogText
FROM @DBS AS dbs
ORDER 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 TempDB
Go
CREATE TABLE DemoTable(
ID INT IDENTITY,
[Date] DATETIME DEFAULT GETDATE(),
[Text] varchar(500) default 'ABC'
);
SET NOCOUNT ON;
declare @i int = 0
while @i<100000
begin
INSERT INTO dbo.DemoTable DEFAULT VALUES;
set @i=@i+1
end
GO
如下图,TempDB 使用了7秒。同样在Model数据库上执行同样的操作,耗时45秒。这是由于 TempDB 中的事务日志记录最少。
本文探讨了 SQL Server Model 和 TempDB 数据库之间的关系。通常,DBA 不会考虑 Model 数据库的重要性,因为它只是新数据库的模板。它在 SQL Server 数据库创建中起着至关重要的作用。TempDB 数据库也是它的一个副本,它继承了一些属性,例如文件数量、自动增长、来自主数据库表的恢复模式。
更多请关注 公-众-号:SQLServer