深入理解缓冲区(十三)

来源:互联网 发布:java 线程池面试 编辑:程序博客网 时间:2024/05/29 03:26

4.2      PostgreSQL日志缓冲区管理

前述介绍的buf,是一种双向的缓存,即“向外存发出读请求à读入数据到缓冲区”和“缓冲区中的数据被更新à写出到外存”。

在PostgreSQL系统中,还存在一种单向缓存,是REDO日志的缓存,此种缓存,是系统启动时读日志文件建立的,在运行过程中,缓存数据库引擎操作产生的RODO日志数据,然后按照一种规则,不断从内存刷出数据到外存,方向是从内到外,所以是单向缓存。

4.2.1        日志缓存相关代码

日志缓存的初始化

       调用XLOGShmemInit函数完成日志缓存区的初始化工作(主要是在共享内存中分配一块区域-- XLogCtl,以当作日志缓存使用)。

 

主要代码

主要函数

作用

调用关系

XLogInsert

把内存中生成的日志信息插入到日志缓存中

XLogInsert[1]

       WriteZeroPageXlogRec

       WriteTruncateXlogRec

       createdb

       movedb

       movedb

       remove_dbtablespaces

       ginInsertValue

       writeListPage

       ginHeapTupleFastInsert

       shiftList

       createPostingTree

       ginbuild

       ginUpdateStats

       xlogVacuumPage

       ginDeletePage

       gistbuild

       gistplacetopage

       gistplacetopage

       gistnewroot

       gistbulkdelete

       gistContinueInsert

       gistxlogInsertCompletion

       heap_insert

       heap_delete

       heap_lock_tuple

       heap_inplace_update

       log_heap_cleanup_info

       log_heap_clean

       log_heap_freeze

       log_heap_update

       log_newpage

       CreateMultiXactId

       WriteMZeroPageXlogRec

       _bt_insertonpg      

       _bt_split

       _bt_newroot

       _bt_getroot

       _bt_log_reuse_page

       _bt_delitems_vacuum

       _bt_delitems_delete

       _bt_pagedel

       write_relmap_file

       DefineSequence

       AlterSequenceInternal

       nextval_internal

       do_setval

       LogCurrentRunningXacts

       LogAccessExclusiveLocks

       RelationCreateStorage

       RelationTruncate

       CreateTableSpace

       DropTableSpace

       EndPrepare

       RecordTransactionCommitPrepared

       RecordTransactionAbortPrepared

       AssignTransactionId

       RecordTransactionCommit

       RecordTransactionAbort      

       CreateCheckPoint

       XLogPutNextOid

       RequestXLogSwitch

       XLogReportParameters

       pg_stop_backup

XLogWrite

调用write函数()把日志缓存的内容刷出到外存。调用XLogFileClose和XLogFileOpen进行文件切换(日志文件写满了,关掉当前日志文件,打开下一个日志文件写入日志信息)

XLogWrite

       XLogInsert

       AdvanceXLInsertBuffer

       XLogFlush

       XLogBackgroundFlush

XLogFlush

把日志缓存的内容刷出到外存(调用XLogWrite)

XLogFlush

       FlushBuffer

       WriteTruncateXlogRec

       write_relmap_file

       SlruPhysicalWritePage

       RelationTruncate

       EndPrepare

       RecordTransactionCommitPrepared

       RecordTransactionAbortPrepared

       RecordTransactionCommit

       xact_redo_commit

       CreateCheckPoint

AdvanceXLInsertBuffer

写如日志时,空余空间不够,则预先分配一块buf(方式是:先调用XLogWrite刷出一部分日志,然后把日志信息放入日志缓存)

AdvanceXLInsertBuffer

       XLogInsert(3次调用)

       CreateCheckPoint

 



[1] 通过调用关系,可以看到,数据库中有什么样的操作需要写日志。几乎所有操作,只要是需要被恢复的(和ACID特性紧密相关),都需要构造好要恢复的数据,然后调用XLogInsert把信息保存在日志中


原创粉丝点击