MSSQL数据库后台进程(线程)

与Oracle数据库相似,微软数据库产品MSSQL也有诸多后台进程来保证数据库系统的高效正常运转,因为MSSQL采用的是线程模型,应该叫作后台线程,为了你们易于理解,咱们在暂且称之为后台进程,下面咱们就来简要看一下:数据库

一、 数据写相关进程windows

1)   Lazy writer:该进程用来确保系统缓冲区(buffer pool)中有足够的自由内存,该进程按期扫描缓冲内存页,以发现不常使用的内存页并将其移出缓冲区,期间,会先将脏页数据写出到磁盘并移除缓冲区。session

2)   Eager writer:和lazy writer相似,该进程也是负责将缓冲区内的脏页写出到磁盘,但它写出的这些内存页主要是和非日志(non-logged,例如:bulk insert,select into)操做相关,期间,容许读写新页并行发生。异步

3)   Checkpoint:该进程按期扫描缓冲区以发现特定数据库的脏页,并将这些脏页写出到磁盘,经过建立一个在此以前确认全部脏页都写出到磁盘的时间点,能够减小最近数据库恢复须要的时间。用户能够经过提交checkpoint命令来请求一个检查点操做,或者系统也能够根据消耗的日志空间或时间自动产生一个检查点操做,此外,当系统中的某些事件也会致使检查点的发生,例如:增减或移除数据文件或日志文件,实例的关闭等。当检查点发生时,该进程将缓冲区内的脏页写出到磁盘,不管相关事务是否已经提交,都要写出到磁盘。spa

值得一提的是,这三个后台进程都是异步的,即它们在进行IO操做的同时能够去作其余工做,稍后再来检查以前IO的完成状况。线程

二、 事务日志相关进程代理

1)   Log writer:该进程负责将事务日志从缓冲区刷出到磁盘日志文件。MSSQL2016前的版本,每一个实例只有一个log writer进程,所以,该进程负责实例中的全部数据库log buffer。该进程经过异步IO完成log buffer到磁盘的写出,当用户提交一个事务时,该进程阻塞该用户会话,直到将相关数据库log buffer数据刷出到磁盘完成,同时,该进程还能够继续其余数据库log buffer的工做。MSSQL系统中的诸多事件都会触发log writer进程向磁盘写出log buffer中的内容,例如:会话提交当前事务,log buffer被写满,checkpoint等。日志

此外,该进程将lredo记录从log cache/buffer写出到磁盘log files时,写出单位是能够变化的,从512~64k不等,这点来讲,不像data buffer写出进程同样,最小必须是数据页大小。索引

2)   Backup log:该进程虽然严格来讲算不上一个后台进程,由于它用于完成用户发出的“backup log…”命令,但它倒是和事务日志紧密相关。进程

三、 系统监视和管理相关进程

1)   Signal handler:该进程主要负责MSSQL实例的启动和关闭。

2)   Task manager:该进程也会参与MSSQL实例的启动过程,主要用来启动实例相关的全部数据库。此外,该进程还负责启动MSSQL内部某些任务,以及监视实例服务进程和启动时间等任务。

3)   Resource monitor:该进程主要负责监视内存层面的使用和状态,并在必要时对MSSQL相关缓冲进行调整,当检测到没有用户需求被处理时,将自动进入空闲状态。

4)   Lock monitor:该进程负责监视阻塞时间超过系统相关阈值的场景,同时,还负责解决死锁问题。

5)   Ghost cleanup:该进程会周期性的唤醒,并对全部索引中已被标记为删除的索引项进行检查,而后,将这些索引项物理移除。

6)   Trace queue task:该进程负责监视跟踪文件和行集供应者。对跟踪文件,该进程每4秒就会将数据刷出到磁盘文件;对行集,将会关闭超过10分钟没收到任何事件的供应者。

四、 做业调度相关进程

SQLServer Agent:严格来讲,这并不算是一个后台进程,而是windows服务,该服务负责完成各类做业的调度和执行。

五、 其余相关进程

1)   XE Timer和XE Dispatcher:这些是扩展事件(Extended Event)相关的进程,负责按期将收集到的数据从缓冲异步发送到目的地。

2)   BRKR EVENT HNDLR和BRKR TASK:这些事件是服务代理人(Service Broker)相关进程。前者主要负责处理服务代理的全部启动和关闭事件;后者为执行内部服务代理任务的众多进程之一。

咱们能够经过以下SQL来查询MSSQL实例后台进程相关的信息:

select t.os_thread_id,r.session_id,r.status,r.commandfrom sys.dm_os_threads t inner join sys.dm_os_workers w on t.thread_address=w.thread_addressinner join sys.dm_exec_requests r on w.task_address=r.task_addresswhere r.status like '%background%';

相关文章
相关标签/搜索