SQL Server系统数据库介绍

一、基本介绍

1.1 数据库组成

数据库的存储结构分为逻辑存储结构和物理存储结构:

  • 逻辑存储结构

说明数据库是由哪些性质的信息所组成。SQL Server的数据库不仅仅只是数据的存储,所有与数据处理操作相关的信息都存储在数据库中。

  • 物理存储结构

数据库在磁盘上是以文件为单位存储的,由数据库文件和事务日志文件组成,一个数据库至少应该包含一个数据库文件和一个事务日志文件。

SQL Server数据库系统中的数据库文件是由数据文件和日志文件组成的,数据文件以盘区为单位存储在存储器中。

1.2 数据文件

1、数据文件

数据库文件是指数据库中用来存放数据库数据和数据库对象的文件,一个数据库可以有一个或多个数据库文件,一个数据库文件只能属于一个数据库。

当有多个数据库文件时,有一个文件被定为主数据文件,用来存储数据库的启动信息和部分或全部数据,一个数据库只能有一个主数据库文件

数据文件则划分为不同的页面和区域,页是SQL Server存储数据的基本单位。

  • 主数据文件

数据库的起点,指向数据库文件的其他部分,每个数据库都有一个主要数据文件,扩展名为.mdf。

  • 次数据文件

包含除主数据库文件之外的所有数据文件,一个数据库可以没有次数据文件,也可以有多个次数据文件,扩展名为.ndf。

扫描二维码关注公众号,回复: 12508262 查看本文章

2、日志文件

日志文件中记录了存储数据库的更新情况等事务日志信息,用户对数据库进行的插入、删除和更新等操作都会记录在日志文件中。当数据库损坏时,可以根据日志文件来分析出错的原因,或者数据丢失时,还可以使用事务日志恢复数据库。每一个数据库至少必须拥有一个事务日志文件,而且允许拥有多个日志文件。

1.3 五大系统数据库

系统数据库 说明 是否需要备份 恢复模式 注释
master 记录实例所有系统级信息 简单 master库不可用时,实例无法正常启动
msdb agent的报警以及任务调度、操作记录、备份恢复历史记录 简单
model 其他所有数据库创建使用的模版 简单(默认) 建议设置为完整备份。model 库较小而且很少更改,无需备份日志。
resource 包含所有系统对象的只读数据库 - 隐藏数据库
tempdb 用于保存临时或中间结果集 简单 每次实例重启会重建tempdb

二、master数据库

2.1 基本信息

master数据库记录了SQL Server中所有系统级信息,主要包括:

  • 登录账户信息、链接服务器、系统配置设置等
  • 其他数据库的元信息(数据库所有文件位置信息等)
  • SQL Server初始化信息

master数据库的物理存储信息:

文件 逻辑名称 物理名称 文件增长
主数据 master master.mdf 以 10% 的速度自动增长到磁盘充满为止。
日志 mastlog mastlog.ldf 以 10% 的速度自动增长到最大 2 TB。

2.2 限制

不能在 master 数据库中执行下列操作:

  • 添加文件或文件组。
  • 更改排序规则。 默认排序规则为服务器排序规则。
  • 更改数据库所有者。 master 的所有者是 sa。
  • 创建全文目录或全文索引。
  • 在数据库的系统表上创建触发器。
  • 删除数据库。
  • 从数据库中删除 guest 用户。
  • 启用变更数据捕获。
  • 参与数据库镜像。
  • 删除主文件组、主数据文件或日志文件。
  • 重命名数据库或主文件组。
  • 将数据库设置为 OFFLINE。
  • 将数据库或主文件组设置为 READ_ONLY。

2.3 使用建议

  • 始终有一个 master 数据库的当前备份可用。

  • 执行下列操作后,尽快备份 master 数据库:

    创建、修改或删除任意数据库
    更改服务器或数据库的配置值
    修改或添加登录帐户

  • 不要在 master中创建用户对象。 否则,必须更频繁地备份 master 。

  • 不要针对 master 数据库将 TRUSTWORTHY 选项设置为 ON。

三、msdb数据库

3.1 基本信息

msdb数据库提供了运行SQL Server Agent工作的信息,主要包括一些告警以及日常计划任务调度的信息,如备份恢复的事件日志。

默认情况下msdb数据库使用的是恢复模式是简单模式,若需要使用备份恢复历史表,建议将该数据库的恢复模式设置为完整模式。需要注意的是,当SQL Server初始化安装/升级、或者重建时,msdb的恢复模式都会被默认设置为简单模式。

msdb数据库的物理存储信息:

文件 逻辑名称 物理名称 文件增长
主数据 MSDBData MSDBData.mdf 以 10% 的速度自动增长到磁盘充满为止。
日志 MSDBLog MSDBLog.ldf 以 10% 的速度自动增长到最大 2 TB。

3.2 限制

不能在 msdb 数据库中执行下列操作:

  • 更改排序规则。 默认排序规则为服务器排序规则。
  • 删除数据库。
  • 从数据库中删除 guest 用户。
  • 启用变更数据捕获。
  • 参与数据库镜像。
  • 删除主文件组、主数据文件或日志文件。
  • 重命名数据库或主文件组。
  • 将数据库设置为 OFFLINE。
  • 将主文件组设置为 READ_ONLY。

四、model数据库

4.1 基本信息

model数据库主要是所有数据库创建时使用的模版。当一个新数据库被创建时,SQL Server首先会复制model数据库的全部内容、包括数据库选项,后续该数据库下的操作继续填充剩余的空白页。

修改model数据库的配置会影响到整个实例的数据库创建。在SQL Server中model数据库时刻可能会被其他数据库使用,所以该数据库无法删除,必须永远存在。

model数据库的物理存储信息:

文件 逻辑名称 物理名称 文件增长
主数据 modeldev model.mdf 以 64 MB 的速度自动增长到磁盘充满为止。
日志 modellog modellog.ldf 以 64 MB 的速度自动增长到最大 2 TB。

4.2 限制

不能在 model 数据库中执行下列操作:

  • 添加文件或文件组。
  • 更改排序规则。 默认排序规则为服务器排序规则。
  • 更改数据库所有者。 模型 的所有者是 sa。
  • 删除数据库。
  • 从数据库中删除 guest 用户。
  • 启用变更数据捕获。
  • 参与数据库镜像。
  • 删除主文件组、主数据文件或日志文件。
  • 重命名数据库或主文件组。
  • 将数据库设置为 OFFLINE。
  • 将主文件组设置为 READ_ONLY。
  • 使用 WITH ENCRYPTION 选项创建过程、视图或触发器。 加密密钥与在其中创建对象的数据库绑定在一起。 在 model 数据库中创建的加密对象只能用于 model中。

五、resource数据库

5.1 基本信息

Resource库时一个隐藏库,它记录了SQL Server中的所有系统对象(如 sys.objects),这些信息实际的物理存储在resource库下,但是逻辑上会在每个数据库下sys的架构中显示。由于该数据库为只读库,无法存储一些用户信息(存储在master库中)。

resource库的版本升级比较简单,仅需要将对应版本的Resource 数据库文件复制到本地服务器便可完成升级。

5.2 resource库相关命令

1、查看resource库版本信息

SELECT SERVERPROPERTY('ResourceVersion');  
GO

2、查看resource库上次升级时间

SELECT SERVERPROPERTY('ResourceLastUpdateDateTime');  
GO

六、tempdb数据库

6.1 基本概念

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

6.2 限制

不能对 TempDB 数据库执行以下操作:

  • 添加文件组
  • 备份或还原数据库
  • 更改排序规则。 默认排序规则为服务器排序规则
  • 更改数据库所有者。 TempDB 的所有者是 sa
  • 创建数据库快照
  • 删除数据库
  • 从数据库中删除 guest 用户
  • 启用变更数据捕获
  • 参与数据库镜像
  • 删除主文件组、主数据文件或日志文件
  • 重命名数据库或主文件组
  • 运行 DBCC CHECKALLOC
  • 运行 DBCC CHECKCATALOG
  • 将数据库设置为 OFFLINE
  • 将数据库或主文件组设置为 READ_ONLY

6.3 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

猜你喜欢

转载自blog.csdn.net/weixin_37692493/article/details/107306767