数据页的缓冲池管理

缓冲池页可能在使用中,也可能未被使用,并且可以是脏页或干净页。

  • 使用中的页就是当前正被读取或更新的页。 如果某页正被更新,那么只有更新者才能访问该页。 但是,如果该页并非正被更新,那么可以同时有许多并发的阅读者。
  • 脏页包含已被更改的数据,但是尚未将该数据写入磁盘。
这些页将一直保留在缓冲池中,直到数据库关闭、其他页需要使用另一页所占用的空间或者该页被显式地从缓冲池中清除(例如,在删除对象的过程中执行此清除)为止。 以下条件确定移除哪一页以使其空间可供另一页使用:
  • 该页在多久以前被引用?
  • 该页再次被引用的可能性有多大?
  • 该页包含什么类型的数据?
  • 该页是否已在内存中更改但尚未写入磁盘?

发生崩溃时或在数据库操作(例如,联机备份)之前,可使用 FLUSH BUFFERPOOLS 语句来减小数据库的恢复窗口大小。 有关更多信息,请参阅 FLUSH BUFFERPOOLS 语句。

已更改的页在被覆盖之前,始终会写入磁盘。 除非需要空间,否则不会从缓冲池中自动移除已写入磁盘的已更改页。

页清除程序代理程序

在经过认真调整的系统中,通常由页清除程序代理程序将已更改的页(即脏页)写入磁盘。 页清除程序代理程序作为后台进程执行 I/O,它们使应用程序能够更快地运行,这是因为,其代理程序可以执行实际的事务工作。 页清除程序代理程序有时被称为异步页清除程序异步缓冲区写程序,这是因为它们不与其他代理程序的工作协调进行,而只是在有需要时才工作。

为了提高需要执行大量更新操作的工作负载的性能,可以启用主动页清除功能,以使页清除程序在任何给定时刻选择要写哪些脏页时更为主动。 当快照揭示有许多同步数据页或索引页写操作与异步数据页或索引页写操作相关时尤其如此。

图 1 说明了如何在页清除程序代理程序与数据库代理程序之间共享管理缓冲池的工作。

图 1。 异步页面清除。 脏页被写入磁盘。
异步页面清除过程

页清除和快速恢复

如果将较多的页写入磁盘,那么系统崩溃后的数据库恢复速度将加快,这是因为数据库管理器可以从磁盘重建较多的缓冲池,而不必根据数据库日志文件回放事务。

恢复期间必须读取的日志的大小是日志中下列记录的位置之间的差:
  • 最近写入的日志记录
  • 描述对缓冲池数据所作的最早更改的日志记录

页清除程序会采用这样一种方式将脏页写入磁盘,以致在内存中缓冲脏页的秒数多达 page_age_trgt_mcr

要将恢复期间日志读取时间缩至最短,请使用数据库系统监视器来跟踪执行页清除的次数。 如果尚未对数据库启用主动清除页功能,那么 pool_lsn_gap_clns(触发缓冲池日志空间清理程序次数)监视元素将提供此信息。 如果已启用主动页清除页功能,那么应该不会发生这种情况,并且 pool_lsn_gap_clns 的值为 0。

可以使用 log_held_by_dirty_pages 监视元素来确定是否页清除程序未清除足够多的页数,因此无法满足用户设置的恢复条件。 如果 log_held_by_dirty_pages 始终明显大于 logfilsiz * softmax,那么需要提供更多页清除程序或者调整 softmax