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和...
MySQL 5.6 Table cache 简介
一、 Table cache MySQL 5.6后,引入了“table_cache_instances”参数来控制 table cache instance的个数。目前最大值是64,默认值是1。建议值是16,当系统CPU核数高于16时。引入此参数的目的是,提高并发。相当于把table cache 拆成了多个分区,每个分区的打开table句柄数为:table_open_cache / table...
Semaphore vs. Mutex 简单区别
一、前言 最近看了MySQL和PostgreSQL源码对于mutex处理,Semaphore和mutex的关系,有些地方模糊了。想想也是,从大学那会儿学linux内核后,后面很少看那块了,更多的是研究数据库的一些东西。因此,刚好可以补习下,找回记忆。 二、概况 其实从本质上来讲,两都并没有太大区别,...
PostgreSQL Select源码解析
这张时序图比较大,但是大致上描述了PG 处理简单SQL的大致流程。 由客户端发起SQL 语句,PG服务端进程backend接收到语句后,开始执行exec_simple_query()代码。后面所有方法调用均有exec_simple_query()函数直接或者间接发起。 大体上分为以下几个过程:pg_...
PostgreSQL vs. Oracle DML 独立压测
一、压测目的 前面使用Sysbench 默认事务模型,已经对PG和Oracle进行了压测,在性能上没有明显的区分度。 为了更细粒度了解PG和oracle分别在insert,update,delete上的区别,特进行此次压测。另外也是为了在外部上云时,为Oracle向PG迁移时,提供基本性能数据支持。 二、压测结果 此次压测,...
PostgreSQL vs. Oracle 测试
PG vs. Oracle Sysbench 0.5 测试 一、目的 此次测试的目的,仅作为Oracle向PostgreSQL迁移的广义性能对比参考,应用针对性测试后续跟进。 二、测试 测试工具统一采用Sysbench 0.5版本,此版本的一个亮点是测试模型使用lua脚本...
PostgreSQL中page页结构
PostgreSQL中page页结构源码解析 在PG中,磁盘存储和内存中的最小管理单位都是page,也是通常所说的block。一般PG页的大小为8K,在源码编译时可以设置。此后都不可更改,因为许多PG内存结构设计都是以此为基础的。在一个page中,表的记录是从page的底部开始存储,然后慢慢向上涨。Page结构图如...