PostgreSQL SQL执行流程
每种数据库都有自己的SQL执行流程图,PostgreSQL也不例外。下面这张图基本上概括了PG处理SQL的整个逻辑。我下面分开来细讲一下: 1.Main Main是整个后台的入口,基本上不处理任何逻辑,只是简单的分发处理逻辑。 但是像检查当前用户是否是”root”,还是会做的。因为我们知...
PostgreSQL 行锁解读
像其它数据库一样,PostgreSQL数据库不仅有表级别的锁,同时也有行级别的锁。行锁对于提高系统的并行度至关重要。那么PostgreSQL是如何实现行锁的呢? PostgreSQL获取行锁的大致分为以下两个阶段: 1.获取buffer page级别的锁 这是一个buffer content锁,不是单纯的buffer pin,当然buffer...
PostgreSQL checkpoint原理
今天来谈一下PostgreSQL 的checkpoint原理。检查点功能在现有流行的数据库中都具备。如Oracle,MySQL等,尤其是Oracle 对检查点功能的实现,非常完善。Oracle不 仅有全局检查点,还有增量检查点,即非常著名的 “Incremental checkpoint”。虽然各大数据库实现的方式不同,但是主要目的都是一样的,都是...
PostgreSQL源码定制:在线global read only
基于RDS云上需求,最近实现了类似于MySQL global read only的功能。PG的read only功能,也不再需要通过重起PG实现来实现。直接可以online更改PG实例级别 global read only 和 global read write功能, 以达到快速实现主备切换的功能。大大缩短了主备切换时间,提高了PG的高可性。弥补了PG在这一功能上的...
PostgreSQL 事务模型介绍
PostgreSQL有自己的事务实现模型。总体上分为三层:top layer, middle layer和bottom layer。 1. Top Layer Top Layer主要由用户控制,对用户可见。这一层的事务,主要由用户来决定事务的发起与结束。事务生命周期由用户控制,是high-level的。 也就是通常所说的事务块,transaction block。当用户发起...
PostgreSQL 物理文件映射解析
我们知道,在PG中,每个relation,也就是表,都有好几个fork对应。存放主表数据的为“MAIN” fork;管理空余空间的为“FSM” fork;存放可视化视图的为“visibility” fork。 那么PG又是如何将每个表的fork管理起来,并跟pg_class中的relfileno对应起来的呢?这可以分为两类:一类是常规表;一类是系统...
PostgreSQL XID与virtual XID区别
PG中事务号有两个概念,一个就是通常意义上的事务号transaction id。如tuple中的xmin,xmax等。另外一个意义是虚拟事务ID,即virtual transaction ID。那么这两个有 什么区别呢? 1.Transaction Id 它是用来标识事务的顺序的,类似于Oracle的LSN(Logical Sequence Numb...
PostgreSQL vacuum 内核源码机理
为了能全面理解PG整个vacuum的过程,专门绘制了下面一个完整的过程图,用以记录其内核源码实现机理。整个过程比较复杂。大致分为以下几个部分: 一、pg_ctl 这个负责PG server起动,调用start_postmaster后,起动PG主server进程postmaster。后面任务交给postmaster来处理...
PostgreSQL Cost Based Vacuum探秘
PostgreSQL cost based vacuum的意思就是指每次 vacuum,进行heap scan时,都会基于IO cost进行sleep。如果IO cost越大,总体sleep的时间就会越长。也就是说scan 表,并且清理dead tuple 是断断续续的,并不会一次性全vacuum完。这样子做的原因就是尽量避免对当前DML操作的影响,从而减少因vacuum而对系...
PostgreSQL vacuum原理—vacuum揭秘
在前面两个章节中,我们讲了vacuum的一些重要参数“PostgreSQL vacuum原理一功能与参数”以及PG发起vacuum的流程“PostgreSQL vacuum原理—启动机制”。这个章节我们重要讲下vacuum 的实现, 主要分为vacuum full和lazy vacuum。 1.vacumm full vacuum full会锁表和索引...
Linux semaphore SEMMNI,SEMMSL,SEMMNS简介
无论在Oracle还是DB2,大家在安装数据库之前,都需要对操作系统OS级别的信号量进行设置。尤其是Oracle,如果按默认设置不做更改,那么在precheck时,并不被通过。 其实PostgreSQL数据库中,也是一样,信号量对数据库系统尤为关健。因为数据库内部很多锁的实现以及进程间IPC(Inter-Process Commu...
PostgreSQL vacuum原理—启动机制
在”PostgreSQL vacuum原理一功能与参数中我在致讲了vacuum的几大功能点,以及相关的一些参数,如何来调整vacuum。那么这一章节主要讲比较内核的一些东西。 1.PG发起vacuum的流程 在PG实例起动时,postmaster 进程会fork出autovacuum launcher进程。 完整的vacuum进程创建如下: pg_ctl命令行起动PG实例,然后fork出p...
PostgreSQL vacuum原理一功能与参数
从上篇“PostgreSQL MVCC 源码实现”中,我们知道,PG并没有像Oracle那样的undo来存放旧版本;而是将旧版本直接存放于relation文件中。那么带来的问题就是dead tuple过多,导致relation文件 不断增大而带来空间膨胀问题。为了解决这个问题,PG中引入了vacuum后台进程,专门来清理这些dead tuple,并回缩空间。当然vacuum的...
PostgreSQL spin 与 lwlock
在PostgreSQL 中,内存锁大致可以分为spin lock, lwlock以及Lock。 1.spin lock 就是自旋锁,实现的成本最低,一般使用TAS(test and set)来实现,而TAS操作,通常由硬件来实现内存操作。没有队列的概念。 因此速度是最快的。通常只有exlusive一种模式,要么得...
PostgreSQL MVCC 源码实现
MVCC对每一个DBA来讲,都不陌生,即多版本控制(Multi-Version-Control)。正因为数据有了多个版本,才实现了读和写在一定程度上的分离,提高数据库每秒处理查询的能力(QPS)。 用户发起的普通查询请求(不包含select … for update语句),并不堵塞DML事务。在Read Commit事务隔离级别时...
TAS 指令与PostgreSQL spin lock
TAS: 指Test-And-Set,它是一个原子操作,修改内存的值,并返回原来的值。当一个进程P1对一个内存位置做TAS操作,不允许其它进程P2对此内存位置,再做TAS操作。 P2必须等P1操作完成后,再做TAS操作。以下是一个简单的锁,通过TAS来实现: function Lock(boolean *lock){ while (test_and_set...
PostgreSQL QPS 计数器extension实现
一、背景 实现QPS counter的原因,是为了PG也能够有类似MySQL 那样的 "Com_select,Com_update,Com_delete,Com_update" 计数器,方便计算QPS,TPS。 因为PG在源码级别并没有实现这一功能,另外update,delete,insert的次数也需要通过计算,不断查询视图而得到,并不是十分方便。 二、extension实现 为什么要以扩展的方式来实...
MySQL 5.6 drop database时,table metadata lock等待
一个线下库环境,开发人员不提交DML和查询事务,导致drop database时,遭遇表的metadata lock(MDL)等待,而不是SCHEMA上。 即会看到 “Waiting for table metadata lock”,而不是”Waiting for schema metadata lock”。这是为什么呢? 经过源码分析,原因如下。 我们知道: select 语句在操作时,需要对表...
MySQL 5.6 global read lock 介绍
global read lock Global_read_lock类实现globalread lock。它有两个私有成员,分别在global和commit域保护global read lock。m_mdl_global_shared_lock:MDL_ticket类型,用于”GLOBAL”namespace内保护global read lock,阻止所有DDL语句。实现方法是会在GLOBAL namespace层级获取MDL share...
MySQL 5.6 metadata lock 源码解读
一、 MDL(MetadataLock) MDL,就是通常所说的表的MetadataLock。5.5.3以及5.6版本,对这块的定义越来越清晰。从5.6来讲,MySQL对MDL分为两个维度来管理:时间和粒度。 1. 时间(duration)维度 MySQL从对锁持有的时间上来讲,分为三种:statement,transaction和...