服务器结构
SQL Server服务器可以看成是由实例及数据库构成。实例包括SQL Server占用的内存及后台线程。
与Oracle显著不同的是,SQL Server服务器的数据库是多个,其中包括5个系统数据库及若干个用户数据库(其中的resource数据库存储系统数据,对用户不可见)。每个数据库包括数据文件及重做日志文件,SQL Server数据库不包含控制文件。
Oracle服务器 = 一个Oracle实例+一个数据库
SQL Server服务器 = 一个SQL Server实例+多个数据库
数据库相关文件
SQL Server的数据库文件包括:
数据文件:存放数据库中的数据。
重做日志文件:存放用户对数据库的操作记录,用于实例恢复或介质恢复。
SQL Server中的数据文件
数据文件与重做日志文件的作用与Oracle对应的文件相同,只是SQL Server的重做日志文件除了包含重做数据外,还包含回滚事务所用的undo数据,Oracle的重做日志文件只包含重做数据,undo数据存储在undo表空间。
SQL Server中的“控制文件”
SQL Server没有控制文件,实例中的各个数据库文件信息存储在master系统数据库以及用户数据库的primary文件组的主数据文件中。
SQL Server中的“初始化参数文件”
SQL Server没有初始化参数文件(初始化参数文件用于保存实例启动及运行时各种参数配置),实例的配置信息保存在master系统数据库中,数据库的配置信息保存在各自数据库的primary文件组的主数据文件中。
SQL Server中的“口令文件”
Oracle中的口令文件保存sys用户及具备sysdba系统权限的用户的口令,其他用户的口令保存在数据库中,这是因为sys用户除了在数据库中拥有管理权限外,还拥有启动和关闭数据库等特殊权限,如果sys用户的口令也与其他用户的口令一样存储在数据库中,显然在数据库打开之前,就无法验证其口令的正确性。但是SQL Server没有口令文件,启动SQL Server各种服务都是由操作系统行号完成的,其口令由操作系统维护。
归档日志文件
SQL Server没有归档日志文件,Oracle归档日志的功能通过事务日志文件备份实现。
SQL Server中的错误日志
Oracle中的警告文件记录着数据库运行的信息,根据这个文件我们可以知道发生了什么内部错误,什么时候创建了表空间,什么时候把表空间或数据文件脱机、联机,数据库启动关闭等信息。出现错误时,如果不能确定原因,应该首先查看经该文件的内容,以得到解决问题的线索,警告文件从数据库创建开始一直到被删除。Oracle数据库的警告文件在SQL Server中称为错误日志(Errorlog),是实例范围的,而不是针对某个数据库的,与Oracle的警告文件类似,由SQL Server错误日志可以查看在实例运行过程中出现的错误。SQL Server的错误日志文件的位置为:\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Log。
注意区分这里的SQL Server错误日志与数据库重做日志文件,SQL Server错误日志时文本文件,是提供给数据库管理员用来查看服务器运行过程中的问题的,SQL Server数据库正常运行并不需要错入日志文件,而数据库的重做日志文件是数据库必须的,其目的是为了在出现故障时,恢复数据库。
服务器启动时,会创建新的错误日志文件ERRORLOG,上一次的ERRORLOG被重命名为ERRORLOG.1,ERRORLOG.1被重命名为ERRORLOG.2,依次类推,一直到ERRORLOG.5,被重命名为ERRORLOG.6,而ERRORLOG.6被删除,这样,错误日志最多保留6个备份。执行sp_cycle_errorlog系统存储过程可以自动创建新的ERROR文件并执行上述修改名称的过程,而不必重启服务器。
可以使用任何文本编辑器在操作系统上查看其内容,也可以在Management Studio中通过“管理——>SQL Server日志”查看其内容,如下图所示。
内存结构
1.内存构成
SQL Server的内存主要由两部分构成:buffer cache及其他部分。
buffer cache也称为buffer pool,是SQL Server占用内存的主要部分,其作用类似于Oracle的SGA。buffer cache中的主要部分为data cache,相当于Oracle实例SGA中的database buffer cache部分,用于存放由磁盘读取的数据,再次读取时不必从磁盘读取。一般情况下,这是buffer cache中最大的一个区域。
buffer cache中的另外一个重要部分为plan cache,用于存放编译过的执行计划,相当于Oracle实例shared pool中的library cache部分。
2.配置内存大小
与SQL Server内存分配相关的服务器参数有两个:
max server memory:设置buffer cache的上限
min server memory:设置SQL Server可以释放内存的buffer cache下限。
max server memory的默认设置为2 147 483 647,min server memory的默认设置为0,可以为max server memory指定的最小内存量为16MB。默认情况下, SQL Server 的内存要求会根据可用系统资源的情况动态变化。
将 max server memory 设置为最小值可能会严重降低 SQL Server 性能,甚至导致无法启动。 如果在更改此选项之后无法启动 SQL Server ,请使用 –f 启动选项启动它,并将 max server memory 重置为以前的值。
下面是设置这两个参数的方法。
先执行以下两个命令:
#先开启高级选项SP_CONFIGURE 'show advanced options',1#然后执行RECONFIGURE WITH OVERRIDE
执行以上两个命令之后才能使用命令行进行参数配置。
配置max server memory的值为500MB:
1> sp_configure 'max server memory','500'2> go 配置选项 'max server memory (MB)' 已从 2147483647 更改为 500。请运行 RECONFIGURE 语句进行安装。 1> reconfigure 2> go
配置min server memory的值为300MB:
1> sp_configure 'min server memory','300'2> go 配置选项 'min server memory (MB)' 已从 0 更改为 300。请运行 RECONFIGURE 语句进行安装。 1> reconfigure 2> go
也可以使用SQL Server Management Studio 配置内存选项:
1.在对象资源管理器中,右键单击“服务器”并选择“属性”。
2.单击 “内存” 节点。
3.在 “服务器内存选项”中,为 “最小服务器内存” 和 “最大服务器内存”输入所需的内存量。
而对于具体的SQL Server如何使用内存,例如分配给执行计划缓存多少,分配给数据buffer多少,这些都无法通过配置进行调控。
一般情况下,SQL Server的内存分配不需要用户干预,SQL Server尽力做到获得尽量多的内存,又不会使系统出现内存短缺现象。
SQL Server在启动时,根据当前负荷分配必要的内存数量,这个数量可能小于min server memory的值,如果负荷一直不大,其内存占用可能在很长时间内不会到达min server memory的值。
运行过程中,SQL Server会随着负荷及用户连接数的增长继续分配内存,直到内存总量达到max server memory值,或者操作系统提示内存短缺为止。
当SQL Server占用的内存超过min server memory的值,而且Windows系统因为其他应用的运行提示空闲内存缺少时,SQL Server会释放内存,但会保持内存不低于min server memory的值,当这些应用退出时,SQL Server又会获取更多的内存。在一秒钟之内,SQL Server可以释放或获取几兆字节的内存。
如果SQL Server占用的内存尚未达到min server memory的值,则这些内存会一直保持,而不会释放。
如果max server memory与min server memory配置为相同的值,内存占用量达到这个后,不会继续分配也不会释放,这种方式可以使SQL Server占用固定数量的内存。
另外要注意,SQL Server占用的内存总量可能会超过max server memory值,因为max server memory只是设置的buffer cache的上限,除此之外,SQL Server还需要分配其他功能的内存。
主要进程(线程)
SQL Server的Lazy Writer与CheckPoint线程是SQL Server的主要线程。
①Lazy Writer进程
Lazy Writer存在的目的是对缓冲区进行管理,保证SQL OS 有空闲缓存块和系统有一定可用内存。作用如下:
管理SQLServer空闲内存:
定期检查空闲缓冲列表的大小,当这个值过低的时候,即当data cache的空闲内存不够时,azy Writer搜索data cache,把脏块写入磁盘,并把这些可以重新使用的内存页放入自由列表(free list),即会更新缓存区空闲可用列表,而将未修改的页释放并回收资源,以增大空间内存数量。协调Windows与SQLServer内存
监视服务器内存,如果Windows物理内存很少,它会从空闲缓冲列表中释放内存给Windows;
在SQLServer负载很重时,它还会在分配给SQLServer的内存没有达到最大服务器内存阀值时,增加空闲缓冲列表的大小,以适应负载的需要。也就是Lazy Writer会缩小或扩充data cache的大小,使得系统空闲内存保持在5MB左右。
②CheckPoint进程
检查点(CheckPoint)存在的意义是减少服务器的恢复时间(Recovery Time)。检查点是CheckPoint进程创建的,是数据库的一个事件,也是数据库恢复的起始点。
出于性能方面的考虑,数据库引擎对内存中的数据库页进行修改,但在每次更改后不将这些页写入磁盘,相反,数据库引擎定期发出对每个数据库的检查点命令将内存的脏页和事务日志信息刷新到磁盘,不管脏页中的数据是否已经commit。 这样当数据库发生崩溃的情况再次重启时,这个CheckPoint时间点会作为数据库恢复的起始点,从而用于重做(redo)的时间不会过长,这与Oracle相似。与Oracle不同,SQL Server的CheckPoint并不会起到同步各种文件的作用。
如下情况都可以触发CheckPoint启动:
用户发出checkpoint命令;
对数据库添加或删除了文件;
对大容量日志恢复模式下数据库执行了大容量操作;
当数据库处于简单恢复模式时,如果重做日志文件的数据量超过了文件总大小的70%,也会激发Checkpoint启动,在把脏块写入磁盘的同时,checkpoint会截断重做日志,以释放空间。如果重做日志文件的充满是由于一个事务长时间未结束,则checkpoint不会启动;
当SQL Server预测的恢复时间超过了预设的recovery interval的值,也会激发checkpoint启动,recovery interval默认为0,这种情况下,SQL Server自动选取一个合适的值,一般为1分钟;
对数据库执行了备份操作;
正常关闭SQL Server实例服务
Lazy Writer和Checkpoint对比
不像Lazy Writer,Checkpoint对SQL Server的内存管理毫无兴趣,所以CheckPoint也就意味着在这个点之前的所有修改都已经保存到了磁盘。并且CheckPoint把脏数据页写入磁盘后,并不把这些可以再次使用的内存数据页放入自由列表,即不会从缓存中移出脏页,CheckPoint进程的工作只是保证脏页被写入磁盘。
另外还要注意,并不只是Lazy Writer和Checkpoint执行写磁盘操作,执行读写任务的Work线程(这里的Work线程相当于Oracle中对客户端连接提供服务的服务器进程)在执行相关操作时,也会检查data cache的自由列表上的空闲内存是否少过,如果过少的话,它也会把脏块写入磁盘,并把这些内存页放入自由列表。因此Checkpoint启动时,很可能无事可做,因为把脏块写入磁盘的任务已经被Lazy Writer或Work线程完成了。
影响检查点操作持续时间的因素
检查点的频率对于数据库的恢复时间具有极大的影响,如果检查点的频率高,那么恢复时需要应用的重做日志就相对得少,检查时间就可以缩短。
但是通常,执行检查点操作所需的时间会随着该操作必须写入的脏页数的增加而增加。 默认情况下,为最大程度地降低对其他应用程序性能的影响,SQL Server 将调整检查点操作执行写入的频率。
SQL Server系统数据库
系统数据库包括master、model、msdb、tempdb以及resource数据库。
①master:保存整个服务器的系统信息,如服务器配置信息、登陆账号信息、其他数据库的数据库文件信息等。
②model:是数据库的模板,当用户创建新的数据库时,SQL Server复制model数据库的结构作为新数据库的开始,用户可以修改这个数据库的选项设置,添加新用户或创建各种数据库对象,以使其他新建的用户数据库都具备某些特征。但是用户不能对model数据库添加文件组,它只包含primary文件组,也不能向primary文件组添加新的数据文件,它只能包含一个主数据文件。但用户可以更改主数据文件和重做的大小及其他特征,如果在建库时未指定文件组及重做文件,则新数据库主数据文件会继承model数据库的主数据文件大小,但是其他如自动增长、最大大小等属性不会继承,新数据库的重做文件大小及属性也不会继承model数据库的重做文件的相应属性。
③msdb:当配置了数据库的自动化管理时,msdb数据库保存自动化作业的配置信息。
④tempdb:类似Oracle数据库的临时表空间,用于保存临时表以及数据库运行过程中的排序或散列操作产生的临时数据。另外tempdb数据库还保存了用于实现行版本控制的数据(row version store),这些数据的功能与Oracle数据库的undo表空间数据类似。
⑤resource:保存sys架构中的数据,主要是数据字典数据。在Management Studio中,这个数据库不会显示出来,用户也不能在sqlcmd中使用use resource命令登陆这个数据库,而只能通过访问sys架构下的对象间接访问resource数据库中的内容。用户查询数据字典视图获得服务器或数据库的系统信息。
客户端连接的处理模式
对于客户端连接,SQL Server只有一种处理模式,类似于Oracle的共享服务器模式。在Oracle共享服务器模式下,管理员可以手工设定并发服务器进程的数量,多个客户端连接会共用一个服务器进程。在这种模式下,还会启动另外的称为Dispatcher的进程,负责把服务器进程分配给客户端连接。
对应于每个CPU,SQL Server会启动一个Scheduler,可以看成是逻辑CPU。Oracle中处理客户端连接的服务器进程在SQL Server中称为Work线程(或纤程),每个Work线程大约占用0.5MB内存。
当有客户端请求时,会交给当前负荷最低的Scheduler,如果这时没有空闲的Work线程,这个Scheduler会启动一个Work线程来处理这个请求,当一个Work线程在15分钟内部都处于空闲状态,Scheduler会销毁它以释放内存。
作者:水桶的魔法
链接:https://www.jianshu.com/p/665da9f6aa8a