深度解析buffer manager、index-only
什么是脏页?
缓冲管理器结构?1.。2.。3.。干嘛用的
作用:管理共享内存和持久存储之间的数据传输
1.缓冲表
2.缓冲区描述符
3.缓冲池
处理过程:
缓冲管理器收到请求–》缓冲区标签–》找到对应数据页面
缓冲区标签:
读操作:
写操作:
什么是脏页?
缓冲区管理器由那几个层组成
什么是自旋锁,自旋锁的优点不足?
buffer describe layer 会用到那些锁,作用是什么?
锁:解决并发的问题
缓冲管理器中的五种锁:
什么时候会获取独占模式的content_lock
buffermappingLock128个分区(默认)
IO进行锁,发生时间
描述将页面从存储加载到空槽的流程?
什么时候pg会使用环形缓冲区
什么是仅索引扫描
HOT的作用
数据库行数据更新时,索引也需要进行维护,如果是高并发的情况下,索引维护的代价 很大,可能造成索引分裂。Pg为了避免这个问题,采用了HOT(堆内元组技术)解决这 个问题
查询:共享锁 插入:独占锁
copy协议与事务
Copy 子协议对应三种模式:
copy-in:导入数据,对应命令 COPY FROM STDIN
copy-out:导出数据,对应命令 COPY TO STDOUT
copy-both:用于 walsender,在主备间批量传输数据
vacuum 原理解析
不同数据库之间历史版本怎么放的?
vacuum作用,清理分类?
1.清理死元组
2.freeze 冻结(我比谁都小,我对所用人可见的)
3.analyze更新统计信息
理解什么是FSM,什么时候生成的,有什么作用
FSM(Free Space Map),即空闲空间管理。
https://blog.csdn.net/weixin_39540651/article/details/100933665
什么 时候会触发autovacuum
每当死亡元组(dead tuple)超过以下公式时,就会触发自动清理
autovacuum_vacuum_threshold(门槛) + pg_class.reltuples (表上记录数)*autovacuum_vacuum_scale_factor(比例因子)
死亡元组数可以认为是pg_stat_all_tables中n_dead_tup的值
门槛默认为50,比例因子默认为0.2,就是20%,设置阈值门槛为了避免频繁清理小表,针对大表可以调小比例因子,或者放弃比例因子调大阈值
理想方案:
据各个表的delete和update频繁程度以及表的数据量单独为每个表设置阈值:
ALTER TABLE test SET (autovacuum_vacuum_threshold = 100);
计算autovacuum计算
autovacuum清理过程
清理过程相当简单,它从数据文件中读取页面(默认8kB数据块),并检查它是否需要清理.如果没有死元组,页面就会被丢弃而不做任何更改.否则它被清理 (死元组被删除),被标记为"脏"并最终写出来。
postgresql并发控制
事务标识 txid,
查看当前txid
select txid_current();
元组结构由哪几部分组成
headtupleHeaderdata:堆元组头数据
Commit Log的作用
PostgreSQL 在Commit Log 中保存事务的状态。Commit Log,通常称为clog,分配给共享内存,并在整个事务处理过程中使用。
PostgreSQL 定义了四种事务状态
理解事务是否活跃
freeze原理
表空间空闲率
SELECT count(*) as “number of pages”,pg_size_pretty(cast(avg(avail) as bigint)) as “Av. freespace size”,round(100 * avg(avail)/8192 ,2) as “Av. freespace ratio” FROM pg_freespace(’test’);
SELECT *, round(100 * avail/8192 ,2) as “freespace ratio” FROM pg_freespace(’test’);
Foreign Data Wrappers(外部数据包装)
FDW原理
EXPLAN查看
解决索引失效的问题
索引知识
btree
hash
gin
gist
sp-gist
wal记录
数据先到wal buffer–>在落盘保证数据 lsn不断放大的号,确保回放,把最新的lsn,从上一次检查点重放 保证数据库不丢数据 是如何恢复的 重放xlog从磁盘到wal buffer ,redo poin它中有lsn号,去和shared buffer中的lsn做对比,大的就回放 块折断 full_page_writes作用:是否开启全页写入,为了防止块折断(块损坏)的一种策略 判断:checksum值 采用机制:在checkponit后的一个块第一次变脏后就要整块写入到wal日志中, 后续修改这个块,只要把修改信息写入到wal日志 断电重启,有块折断, 则在全页写入的块为基础进行恢复 最后覆盖磁盘上的折断块 参数checkpoint_segments对checkpoint影响 作用:控制checkpoint的间隔 过大:恢复时间会变长 过小:造成频繁的checkpoint进而导致写入了过多的全页,可能wal日志暴增 检查点作用 1.将事务提交的修改写进disk(写脏数据);保证数据库的完整性和一致性。 2.缩短恢复时间,将脏页写入相应的数据文件,确保修改后的文件通过fsync()写入到磁盘。 触发条件: 1、checkpoint_timeout设置时间 2、为checkpoint_segments设置的 WAL 段文件的数量自上一个检查点以来已经被消耗(默认3) 3、WAL 段文件的总大小已超过参数max_wal_size的值(默认值为 1GB(64 个文件)) 4、PostgreSQL 服务器在smart或fast模式下停止 5、手动执行CHECKPOINT 6、写入WAL的数据量已达到参数max_wal_size(默认值:1GB) 7、执行pg_start_backup函数时 8、在进行数据库配置时
pg_control文件
包含检查点的基本信息,如果损坏或无法读取,则无法启动恢复过程,从而无法获得起点。
WAL段切换 1、wal段文件被写满 2、函数pg_switch——wal()被调用 3、启用了archive_mode,且已经超过archive_timeout配置的超时时间。 archive_timeout时间短会导致空间膨胀