深入理解缓冲区(十三)

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把信息保存在日志中


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值