数据库的存储结构分为逻辑存储结构和物理存储结构:
说明数据库是由哪些性质的信息所组成。SQL Server的数据库不仅仅只是数据的存储,所有与数据处理操作相关的信息都存储在数据库中。
数据库在磁盘上是以文件为单位存储的,由数据库文件和事务日志文件组成,一个数据库至少应该包含一个数据库文件和一个事务日志文件。
SQL Server数据库系统中的数据库文件是由数据文件和日志文件组成的,数据文件以盘区为单位存储在存储器中。
数据库文件是指数据库中用来存放数据库数据和数据库对象的文件,一个数据库可以有一个或多个数据库文件,一个数据库文件只能属于一个数据库。
当有多个数据库文件时,有一个文件被定为主数据文件,用来存储数据库的启动信息和部分或全部数据,一个数据库只能有一个主数据库文件
数据文件则划分为不同的页面和区域,页是SQL Server存储数据的基本单位。
数据库的起点,指向数据库文件的其他部分,每个数据库都有一个主要数据文件,扩展名为.mdf。
包含除主数据库文件之外的所有数据文件,一个数据库可以没有次数据文件,也可以有多个次数据文件,扩展名为.ndf。
日志文件中记录了存储数据库的更新情况等事务日志信息,用户对数据库进行的插入、删除和更新等操作都会记录在日志文件中。当数据库损坏时,可以根据日志文件来分析出错的原因,或者数据丢失时,还可以使用事务日志恢复数据库。每一个数据库至少必须拥有一个事务日志文件,而且允许拥有多个日志文件。
系统数据库 | 说明 | 是否需要备份 | 恢复模式 | 注释 |
---|---|---|---|---|
master | 记录实例所有系统级信息 | 是 | 简单 | master库不可用时,实例无法正常启动 |
msdb | agent的报警以及任务调度、操作记录、备份恢复历史记录 | 是 | 简单 | |
model | 其他所有数据库创建使用的模版 | 是 | 简单(默认) | 建议设置为完整备份。model 库较小而且很少更改,无需备份日志。 |
resource | 包含所有系统对象的只读数据库 | 否 | - | 隐藏数据库 |
tempdb | 用于保存临时或中间结果集 | 是 | 简单 | 每次实例重启会重建tempdb |
master数据库记录了SQL Server中所有系统级信息,主要包括:
master数据库的物理存储信息:
文件 | 逻辑名称 | 物理名称 | 文件增长 |
---|---|---|---|
主数据 | master | master.mdf | 以 10% 的速度自动增长到磁盘充满为止。 |
日志 | mastlog | mastlog.ldf | 以 10% 的速度自动增长到最大 2 TB。 |
不能在 master 数据库中执行下列操作:
始终有一个 master 数据库的当前备份可用。
执行下列操作后,尽快备份 master 数据库:
创建、修改或删除任意数据库
更改服务器或数据库的配置值
修改或添加登录帐户
不要在 master中创建用户对象。 否则,必须更频繁地备份 master 。
不要针对 master 数据库将 TRUSTWORTHY 选项设置为 ON。
msdb数据库提供了运行SQL Server Agent工作的信息,主要包括一些告警以及日常计划任务调度的信息,如备份恢复的事件日志。
默认情况下msdb数据库使用的是恢复模式是简单模式,若需要使用备份恢复历史表,建议将该数据库的恢复模式设置为完整模式。需要注意的是,当SQL Server初始化安装/升级、或者重建时,msdb的恢复模式都会被默认设置为简单模式。
msdb数据库的物理存储信息:
文件 | 逻辑名称 | 物理名称 | 文件增长 |
---|---|---|---|
主数据 | MSDBData | MSDBData.mdf | 以 10% 的速度自动增长到磁盘充满为止。 |
日志 | MSDBLog | MSDBLog.ldf | 以 10% 的速度自动增长到最大 2 TB。 |
不能在 msdb 数据库中执行下列操作:
model数据库主要是所有数据库创建时使用的模版。当一个新数据库被创建时,SQL Server首先会复制model数据库的全部内容、包括数据库选项,后续该数据库下的操作继续填充剩余的空白页。
修改model数据库的配置会影响到整个实例的数据库创建。在SQL Server中model数据库时刻可能会被其他数据库使用,所以该数据库无法删除,必须永远存在。
model数据库的物理存储信息:
文件 | 逻辑名称 | 物理名称 | 文件增长 |
---|---|---|---|
主数据 | modeldev | model.mdf | 以 64 MB 的速度自动增长到磁盘充满为止。 |
日志 | modellog | modellog.ldf | 以 64 MB 的速度自动增长到最大 2 TB。 |
不能在 model 数据库中执行下列操作:
Resource库时一个隐藏库,它记录了SQL Server中的所有系统对象(如 sys.objects),这些信息实际的物理存储在resource库下,但是逻辑上会在每个数据库下sys的架构中显示。由于该数据库为只读库,无法存储一些用户信息(存储在master库中)。
resource库的版本升级比较简单,仅需要将对应版本的Resource 数据库文件复制到本地服务器便可完成升级。
1、查看resource库版本信息
SELECT SERVERPROPERTY('ResourceVersion');
GO
2、查看resource库上次升级时间
SELECT SERVERPROPERTY('ResourceLastUpdateDateTime');
GO
tempdb数据库是一饿全局资源,可供连接到SQL Server数据库的所有用户使用,主要用于以下几方面:
比如全局或者本地的临时表/索引、临时存储过程、表变量、表值函数中返回的表或游标。
spool、游标、临时的大对象存储
hash join或者hash 聚合操作的临时文件
创建或者重建索引操作、group by、order by操作产生的内部排序结果,
RC隔离级级别、snapshot隔离级别下,由于数据变更产生的多版本数据记录
在线创建索引操作、 Multiple Active Result Sets (MARS)、 AFTER triggers操作产生的多版本数据记录
对于tempdb的所有操作也会被记录到日志中,以便事务回滚。每次实例重启会重建tempdb。对于每个会话线程,当会话链接断开时,会自动删除其持有的临时表、临时存储过程等。也正是由于这样的特性,tempdb数据库是不需要进行备份恢复操作的。
任何用户都可以在tempDB库中创建临时对象,且用户只能访问自己的对象,除非他们获得更多的权限。
model数据库的物理存储信息:
文件 | 逻辑名称 | 物理名称 | 初始大小 | 文件增长 |
---|---|---|---|---|
主数据 | tempdev | tempdb.mdf | 8 MB | 以 64 MB 的速度自动增长直到磁盘已满 |
次要数据文件* | temp# | tempdb_mssql_#.ndf | 8 MB | 以 64 MB 的速度自动增长直到磁盘已满 |
日志 | templog | templog.ldf | 8 MB | 以 64 MB 的速度自动增长直到达到上限 2 TB |
不能对 TempDB 数据库执行以下操作:
1、检查当前tempdb库大小以及增长参数
1)tempdb数据库不可设置过小,若参数设置过小,每次实例启动时都会消耗额外的计算资源对tempdb进行扩展,直到满足当前所需大小
2)tempdb库的数据文件应该设置为自动增长,避免出现意外导致tempdb空间不足
3)tempdb的每个文件组的数据文件大小应保持一致,SQL Server使用比例填充算法,有效提高并行效率
4)将文件增量设置为合理的大小以避免 TempDB 数据库文件的增量过小。 如果文件的增量与写入tempDB的数据量相比过小,则tempDB可能需要不断扩大,并且会影响性能。
SELECT name AS FileName,
size*1.0/128 AS FileSizeInMB,
CASE max_size
WHEN 0 THEN 'Autogrowth is off.'
WHEN -1 THEN 'Autogrowth is on.'
ELSE 'Log file grows to a maximum size of 2 TB.'
END,
growth AS 'GrowthValue',
'GrowthIncrement' =
CASE
WHEN growth = 0 THEN 'Size is fixed.'
WHEN growth > 0 AND is_percent_growth = 0
THEN 'Growth value is in 8-KB pages.'
ELSE 'Growth value is a percentage.'
END
FROM tempdb.sys.database_files;
GO
2、tempdb空间使用监控
1)tempdb空间使用情况监控
-- Determining the Amount of Free Space in TempDB
SELECT SUM(unallocated_extent_page_count) AS [free pages],
(SUM(unallocated_extent_page_count)*1.0/128) AS [free space in MB]
FROM sys.dm_db_file_space_usage;
-- Determining the Amount Space Used by the Version Store
SELECT SUM(version_store_reserved_page_count) AS [version store pages used],
(SUM(version_store_reserved_page_count)*1.0/128) AS [version store space in MB]
FROM sys.dm_db_file_space_usage;
-- Determining the Amount of Space Used by Internal Objects
SELECT SUM(internal_object_reserved_page_count) AS [internal object pages used],
(SUM(internal_object_reserved_page_count)*1.0/128) AS [internal object space in MB]
FROM sys.dm_db_file_space_usage;
-- Determining the Amount of Space Used by User Objects
SELECT SUM(user_object_reserved_page_count) AS [user object pages used],
(SUM(user_object_reserved_page_count)*1.0/128) AS [user object space in MB]
FROM sys.dm_db_file_space_usage;
2)监控当前会话或任务tempdb空间占用情况
-- Obtaining the space consumed by internal objects in all currently running tasks in each session
SELECT session_id,
SUM(internal_objects_alloc_page_count) AS task_internal_objects_alloc_page_count,
SUM(internal_objects_dealloc_page_count) AS task_internal_objects_dealloc_page_count
FROM sys.dm_db_task_space_usage
GROUP BY session_id;
-- Obtaining the space consumed by internal objects in the current session for both running and completed tasks
SELECT R2.session_id,
R1.internal_objects_alloc_page_count
+ SUM(R2.internal_objects_alloc_page_count) AS session_internal_objects_alloc_page_count,
R1.internal_objects_dealloc_page_count
+ SUM(R2.internal_objects_dealloc_page_count) AS session_internal_objects_dealloc_page_count
FROM sys.dm_db_session_space_usage AS R1
INNER JOIN sys.dm_db_task_space_usage AS R2 ON R1.session_id = R2.session_id
GROUP BY R2.session_id, R1.internal_objects_alloc_page_count,
R1.internal_objects_dealloc_page_count;;
文章参考:
https://www.cnblogs.com/libingql/p/4078728.html
https://docs.microsoft.com/zh-cn/sql/relational-databases/databases/system-databases?view=sql-server-ver15