1.2. 数据库
数据库,由服务器上的一组磁盘文件组成,用于存储数据库相关的各种管理信息和用户数据,以保证数据库正常运转和用户数据的存储,数据库及其文件可以独立于实例而存在。
1.2.1.SQL Server数据库逻辑结构
直到Oracle 11g为止,Oracle是唯一一个每个实例只对应一个数据库的常用关系库,而这点随着Oracle 12c中CDB/PDB特性的产生而发生了改变,这使得Oracle从此结束了自己在关系库中特立独行的逻辑结构,当然,Oracle 12c中CDB/PDB特性并不是强制的,只是多个选项而已。
因此,SQL Server数据库的逻辑结构与Oracle 11g及其之前版本外的其他数据库一样,一个实例拥有多个数据库,直到SQL Server 2012版本,每个实例可以拥有最多32767个数据库,每个数据库可以拥有数十亿个对象,而其存储容量最大可达EB级。现实中,从未见过也不可能出现拥有如此多数据库的实例,也没见过单个数据库达到如此大的规模。一个SQL Server实例总会包含以下数据库。
1)Master:该数据库包含用于跟踪整个实例安装及随后被创建数据库的系统表。虽然其他数据库都有包含自己对象信息的系统字典,但Master的系统字典主要用于跟踪整个系统范围内的信息,例如:配置,端点,登录,数据库,数据文件使用,连接服务器等。Master数据库对整个数据库系统来说非常重要,确认每次对实例进行上述更改后都要进行妥善备份。
2)Model:该数据库只是个模板数据库。每当用户创建一个数据库时,SQL Server就会拷贝该数据库作为该新数据库的基础。用户可以修改该数据库的属性,以便用户今后创建的新数据库都会继承和具备这些属性。
3)Tempdb:该数据库用作一个工作空间。该数据库是SQL Server每次重启时,重新创建而不需要恢复的数据库。该数据库主要用于存储用户定义的临时表数据,查询处理期间产生的排序等中间结果,以及用于维护快照隔离和其他操作的行版本数据。因为SQL Server每次重启都会重新创建该数据库,因此,用户在其中创建的对象及其授权等一切信息都会随着SQL Server的重启而消失的无影无踪。
4)Msdb:该数据库主要用于SQL Server代理及其相关服务。这些服务主要用于调度类似备份和复制等任务,以及用于为SQL Server提供队列和可靠信息的服务代理(Service Broker)。此外,该数据库中的对象还用于作业(Jobs)、告警(Alerts)、日志传输(Log Shipping)、策略(Policies)、数据库邮件(Database Mails)及损坏数据页的恢复。当并不需要该数据库支持的这些活动时,可以忽略该数据库,但建议不要随便更改和删除它。
5)Resource Database(mssqlsystemresource):该数据库是不为用户所见的隐藏数据库,微软创建该数据库的目的是为了快速而安全的升级。SQL Server的系统可执行对象(例如:系统存储过程和函数等)都存放于该数据库中。用户无法通过常规方法看到、访问和修改该数据库,但通过一些非常规方法也可以对该数据库进行查看、访问和修改,但不建议这么做,这里仅对该数据库做一简要介绍,不再赘述。
以上五个数据库为SQL Server必不可少的系统数据库,每次安装,都会默认安装和创建这些数据库。
除了上述几个系统数据库,用户可以按照自己的需求创建多个数据库,用于存储和管理用户对象和数据。
1.2.2.SQL Server相关文件
SQL Server相关文件主要分为数据库文件和其他文件。
数据库文件就是操作系统文件,仅就数据库文件来说,每个SQL Server数据库至少要包含两个操作系统文件,它们分别用于存储用户数据和事务日志。SQL Server 2012数据库目前可以包含三种数据库文件。
1)主数据文件(Primary Data Files):每个数据库必须有且只能有一个主数据文件,除了存储数据库的启动信息和跟踪该数据库中的所有其他文件,还用于存储用户数据。一般来说,数据库的主数据文件扩展名为.mdf。创建数据库时,主数据文件总是被包含在主文件组中且第一个被列出来,除了主数据文件,主文件组还可以包含其他数据文件。
2)次级数据文件(Secondary Data Files):每个数据库可以有零到多个次级数据文件,一般来说,数据库的次级数据文件扩展名为.ndf。创建数据库时,次级文件可以被包含在主文件组或用户创建的其他文件组中。
3)日志文件(Log Files):每个数据库至少有一个日志文件,用于存储恢复该数据库中的事务所需要的信息,一般来说,数据库的日志文件的扩展名为.ldf。
可以通过查询目录视图sys.data_files获取当前数据库中上述三种数据库文件。
Select … from sys.database_files where …;
此外,SQL Server数据库和实例中还涉及如下几种文件。
4)文件流/文件表数据文件(Filestream/Filetable Data Files)和全文数据文件(Full-text Data Files):两类数据文件分别与大对象数据及全文索引数据存储相关,此处不再详述,感兴趣的读者可以查阅相关文档。
除了以上几类数据库相关的数据文件外,还有如下SQL Server系统整体相关的文件。
5)报错日志文件(Error Log Files):该文件用于存储SQL Server系统范围内的事件或信息,例如:任务或操作完成情况,实例启停,内核信息,系统级的报错信息等。该文件默认位置为“C:\Program Files\Microsoft SQL Server\MSSQL11.SQL12\MSSQL\Log\ERRORLOG”(笔者测试环境:SQL Server 2012 for Windows,根据具体安装和配置可能不同),也可以通过如下命令发现该文件的具体位置。
use master
go
xp_readerrorlog 0,1,N’Logging SQL Server messages in file’,null,null,null,N’asc’
go
一般来说,SQL Server会保留最近6个错误日志文件。从功能来讲,该报错日志文件和Oracle的告警日志文件相似。
6)导出文件(Dump Files):当在报错日志文件中发现一个例外发生时,也应该发现一个扩展名为.mdmp的导出文件,该文件一般与报错日志文件位于同一目录下,当然,也可以位于其他不同位置。该文件主要用于帮助微软工程师确定例外发生的原因。该文件与Oracle中的导出文件(Dump Files)或跟踪文件(Trace Files)功能相似。
此外,与Oracle中参数文件和控制文件功能相对应的,SQL Server中也有相关机制实现,然而,微软对这些机制和细节选择了尽量封装和屏蔽,这里我们也不再详述,感兴趣的读者可以自行查阅相关文档。
SQL Server数据库整体架构具体如图1-2-1所示。
图 1-2-1 SQL Server数据库整体架构示意图