
简介
该用户还未填写简介
擅长的技术栈
可提供的服务
暂无可提供的服务
pg会根据当前状态确定初始日志源,当日志源读取发生错误,或者状态发生改变时,会切换到其他日志源。这个功能对应函数是 WaitForWALToBecomeAvailable(在xlog.c文件)前篇中获取到了恢复起点,即开始回放日志的位置,后面我们就可以开始读取并应用日志了。不过在此之前还有一个问题,从哪里获取WAL日志呢?用于在不同时段,从不同的日志源获取WAL日志。,对于不同的用途,也有不同的日
CheckpointerMain函数是checkpointer进程的主入口函数。第一部分主要是些准备工作:下面这段很重要Checkpointer进程的主流程是一个无条件的for循环,在未触发checkpoint时一直在WaitLatch中sleep,也就是在epoll_wait中观察list链表,查看是否有事件句柄已经就绪(某个条件触发checkpoint)。如果已经存在就绪事件,则通过SetLa
从功能上看从对应函数来看本节主要介绍日志注册(蓝色)部分。这俩名字很像,registered_buffers是一个数组,其中的每个元素由registered_buffer结构体组成。该数组用于注册被修改的页面信息,XLogRegisterBuffer函数每注册一个页面时,会在其中占用一个槽位。rdatas是一个数组,其中的每个元素由XLogRecData结构体组成。事务日志并不直接写入WAL Bu
调和内存(ns级)与磁盘(ms级)间的速度差异。pg不仅用自己的,也用os cache,所以它使用了“双缓存”,这也是很多文档推荐shared_buffer参数只设为内存25%(通常不超过16G)的原因。

pg中的每个行只能存在一个page里,不能跨page存储。因此对于一些非常长的行,就需要使用到TOAST(The OverSized Attribute Storage Technique,超尺寸字段存储技术)将大字段值压缩或者拆分为多行到单独表存储。对于用户来说,这是完全透明的。
日志写入WAL Buffer的过程分为两步:你可能会疑惑:为什么数据复制的并发度只设为8?如果设大会有什么问题吗?这个问题的答案在WaitXLogInsertionsToFinish函数(除此之外它还要解决另一个非常重要的问题),我们后面会学习它。简单来说,每次WAL刷入磁盘,都会调用这个函数,而这个函数需要遍历所有WALInsertLocks,所以NUM_XLOGINSERT_LOCKS不宜过大
前面几篇文章介绍的方法只能在sql本身有过好执行计划的时候将其固定,如果sql从未有过好的执行计划,需要添加hint但又无法修改sql代码时,之前的方法就不大合适,需要使用新的方法。一、 问题背景遇到过的一个案例就十分符合这种情况。11.2的数据库A中发现一个慢sql,执行超过4万秒。查询program得知是开发用的datagrip工具自动执行的语句,无法关闭也无法修改该sql,实际对业务功能没一
开发A在测试环境操作时有时会遇到阻塞问题,需要找DBA帮忙查看阻塞会话及kill session,后来觉得太麻烦想要个kill会话的权限,查了下Oracle授予普通用户kill session权限的方法。1. 授予alter system权限官方文档查到,kill session需要ALTER SYSTEM权限,但是这个权限非常大,不能直接给GRANT ALTER SYSTEM...

提交日志CLOG 原理 用途 管理函数

一、 pg中的锁pg中的锁可以分为3个层次:自旋锁(Spin Lock):是一种和硬件结合的互斥锁,借用了硬件提供的原子操作的原语来对一些共享变量进行封锁,通常适用于临界区比较小的情况。轻量锁(Lightweight Lock):负责保护共享内存中的数据结构,有共享和排他两种模式,类似Oracle中的latch常规锁(Regular Lock):就是通常说的对数据库对象的锁。按照锁粒度,可以分为表







