![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
postgresql
清海风缘
这个作者很懒,什么都没留下…
展开
-
PG内核分析 Question and Answer
PG内核分析 Question and AnswerPG系统概述为什么说PG是一种先进的对象—关系数据库系统因为PG它不仅支持关系数据库的各种功能, 而且还具备类, 继承等对象数据库的特征.面向对象数据库技术可望成为继关系数据库技术之后的新一代数据管理技术。它是一种以关系数据库和SQL为基础, 扩展了抽象数据类型,从而具备面向对象特征的数据库.PG不是完全的对象数据库, 而是综合了在关系数据库的基础上,吸收了对象数据库的优点发展起来的. 对象数据库的缺点参见下面所述:参考: 面向对象数据原创 2020-06-02 14:09:46 · 1428 阅读 · 0 评论 -
PostgreSQL嵌套事务提交流程研究
PostgreSQL嵌套事务提交流程研究父事务最终提交代码流程图事务提交调用流程其中值得拿出来讲的,主要是TransactionIdSetTreeStatus这个方法。这里涉及到一个概念,子事务。在PG这个地方,子事务的概念主要指:事务从开始到结束,期间可以savepoint,之后rollback到savepoint而不是事务起点,在实际情况中多有应用,因此这里父事务与子事务(比如事务最终提交,但期间有回滚的情况,或者事务期间多次savepoint)必须尽可能原子性的方式写入,否则事务可见性就会原创 2020-06-02 11:59:39 · 1172 阅读 · 0 评论 -
postgresql共享行锁实现原理研究
postgresql共享行锁实现原理研究背景锁是数据库很重要的机制,postgresql支持表锁,行锁,了解postgresql行锁机制有助于我们在应用中分析和解决行锁的问题。锁模式当前postgresql支持4种行锁模式: FOR KEY SHARE, FOR SHARE, FOR NO KEY UPDATE, FORUPDATE,我们常见的delete场景获取的均为FOR UPDATE锁,而update场景会获取FOR NO KEYUPDATE或者FOR UPDATE,要看有没有唯一索引了。原创 2020-06-02 11:34:41 · 1036 阅读 · 0 评论 -
PostgreSQL multixact日志管理器说明
PostgreSQL multixact日志管理器说明MultiXactID日志是uxdb系统用来记录组合事务ID的一种日志。由于uxdb采用了多版本并发控制,因此同一个元组相关联的事务ID可能有多个,为了在加锁(行共享锁)的时候统一操作,uxdb将与该元组相关联的多个事务ID组合起来用一个MultiXactID代替来管理。同CLOG、Subtrans日志一样,MultiXact日志也是利用SLRU缓冲池来实现。MultiXact日志管理器相关数据结构MultiXactID是一个多对一的映射关系,需要原创 2020-06-02 11:26:32 · 1219 阅读 · 0 评论 -
PostgreSQL中使用pstack打印fork子进程所有线程堆栈信息
PostgreSQL中使用pstack打印fork子进程所有线程堆栈信息PostgreSQL数据库在并行查询中, 出现如下"stack depth limit exceeded"的错误, 因此想使用pstack来打印其堆栈信息, 依次来排查错误.voidcheck_stack_depth(void){ if (stack_is_too_deep()) { ereport(ERROR, (errcode(ERRCODE_STATEMENT_TOO_COMPLEX), errm原创 2020-06-02 11:13:09 · 1088 阅读 · 0 评论 -
PostgreSQL查看各个数据库占用的物理空间大小
SELECT d.datname AS Name, pg_catalog.pg_get_userbyid(d.datdba) AS Owner, CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT') THEN pg_catalog.pg_size_pretty(pg_catalog.pg_database_size(d.datname)) ELSE 'No Access' END.原创 2020-06-02 09:49:22 · 1094 阅读 · 0 评论 -
postgresql shared_buffers 讲解
postgresql shared_buffers 讲解什么是shred_buffer,我们为什么需要shared_buffers?1.在数据库系统中,我们主要关注磁盘io,大多数oltp工作负载都是随机io,因此从磁盘获取非常慢。2.为了解决这个问题,postgres将数据缓存在RAM中,以此来提高性能,即使ssd的情况下RAM也要快很多。3.shared_buffers是一个8KB的数组,postgres在从磁盘中查询数据前,会先查找shared_buffers的页,如果命中,就直接返回,避免从转载 2020-06-02 09:34:40 · 2160 阅读 · 0 评论 -
PostgreSQL中的SpinLock
PostgreSQL中的SpinLock1. What is SpinLock?SpinLock也就是我们常说的自旋锁,其显著的特点就是“死等”,需要获取SpinLock的线程会一直主动地check能否获取得到锁,直到获取到锁后线程才会继续执行下面的逻辑,这把锁会一直被这个线程持有,直到线程自己主动释放。因此,如果我们的应用场景,线程在锁的获取上只会被阻塞非常短的一段时间(或者锁在获取后马上会被释放),那么SpinLock的使用可以减少CPU对于进程重新调度(rescheduling)和上下文切换的开销原创 2020-06-02 09:28:40 · 240 阅读 · 0 评论 -
PostgreSQL中的RegularLock
PostgreSQL中的RegularLockRegularLock又称为HeavyweightLock,在PostgreSQL中我们常说的表锁,指的其实就是这类锁。因为,对于用户来说,关心的是表,数据库,page等数据库的对象,而之前所介绍的SpinLock和LWLock保护对象的是数据库内部实现的数据结构。相比与SpinLock和LWLock,RegularLock的加锁开销非常大,因为加锁时要额外记录锁的持有者,加锁次数,请求次数等额外信息。1. what is RegularLock?这里从几转载 2020-06-02 09:27:29 · 265 阅读 · 0 评论 -
PostgreSQL中的LWLock
PostgreSQL中的LWLock上一篇文章介绍了PostgreSQL中的SpinLock,本文将介绍的LWLock是基于SpinLock实现的一种轻量级锁( Lightweight Lock)。1. What is LWLock?从PG 10.5的注释来看,LWLock主要提供对共享内存变量的互斥访问,比如Clog buffer(事务提交状态缓存)、Shared buffers(数据页缓存)、Substran buffer(子事务缓存)等等。LWLock的数据结构定义如下:typedef st转载 2020-06-02 09:26:15 · 840 阅读 · 0 评论 -
postgresql shared_buffers 讲解
postgresql shared_buffers 讲解什么是shred_buffer,我们为什么需要shared_buffers?1.在数据库系统中,我们主要关注磁盘io,大多数oltp工作负载都是随机io,因此从磁盘获取非常慢。2.为了解决这个问题,postgres将数据缓存在RAM中,以此来提高性能,即使ssd的情况下RAM也要快很多。3.shared_buffers是一个8KB的数组,postgres在从磁盘中查询数据前,会先查找shared_buffers的页,如果命中,就直接返回,避免从转载 2020-05-15 14:18:42 · 5946 阅读 · 0 评论 -
PostgreSQL中的LWLock
PostgreSQL中的LWLock上一篇文章介绍了PostgreSQL中的SpinLock,本文将介绍的LWLock是基于SpinLock实现的一种轻量级锁( Lightweight Lock)。1. What is LWLock?从PG 10.5的注释来看,LWLock主要提供对共享内存变量的互斥访问,比如Clog buffer(事务提交状态缓存)、Shared buffers(数据页缓存)、Substran buffer(子事务缓存)等等。LWLock的数据结构定义如下:typedef st转载 2020-05-14 10:04:28 · 1516 阅读 · 0 评论 -
PostgreSQL中的RegularLock
PostgreSQL中的RegularLockRegularLock又称为HeavyweightLock,在PostgreSQL中我们常说的表锁,指的其实就是这类锁。因为,对于用户来说,关心的是表,数据库,page等数据库的对象,而之前所介绍的SpinLock和LWLock保护对象的是数据库内部实现的数据结构。相比与SpinLock和LWLock,RegularLock的加锁开销非常大,因为加锁时要额外记录锁的持有者,加锁次数,请求次数等额外信息。1. what is RegularLock?这里从几转载 2020-05-14 09:59:02 · 432 阅读 · 0 评论 -
PostgreSQL中的SpinLock
PostgreSQL中的SpinLock1. What is SpinLock?SpinLock也就是我们常说的自旋锁,其显著的特点就是“死等”,需要获取SpinLock的线程会一直主动地check能否获取得到锁,直到获取到锁后线程才会继续执行下面的逻辑,这把锁会一直被这个线程持有,直到线程自己主动释放。因此,如果我们的应用场景,线程在锁的获取上只会被阻塞非常短的一段时间(或者锁在获取后马上会被释放),那么SpinLock的使用可以减少CPU对于进程重新调度(rescheduling)和上下文切换的开销转载 2020-05-14 09:47:18 · 447 阅读 · 0 评论 -
PostgreSQL 如何打印日志信息所在的源文件和行数
PostgreSQL 如何打印日志信息所在的源文件和行数一直好奇在PG中, 当输出错误日志时, 如何能够附带错误信息所在的源代码文件名以及发生错误的代码行数.postgres.conf中, log信息冗余级别为"default(默认)", terse: 表示更加简单的日志信息, verbose: 表示更加冗余的日志信息(即: 附带"文件名和行数)#log_error_verbosity ...原创 2020-03-02 09:46:11 · 1883 阅读 · 1 评论 -
PostgreSQL事务处理机制问答
PostgreSQL事务处理机制问答1、Q:PostgreSQL中DDL支不支持事务?A:支持。PostgreSQL中对DDL的处理方式和普通的DML类似,也是支持事务的。2、 Q:PostgreSQL中对BLOB数据的处理支不支持事务?A:支持。对BLOB(bytea或large object)数据的事务处理和普通数据的差别不大,但由于BLOB数据较大涉及BLOB的事务会产生很大的WAL...转载 2020-02-20 15:42:35 · 383 阅读 · 0 评论 -
可串行性与“严格”可串行化区别
可串行性与“严格”可串行化区别多年来,“可串行化/序列化”(serializability)被称为数据库隔离级别的“ 黄金标准 ”。它是绝大多数商业数据库系统中提供的最高隔离级别,一些高度广泛部署的系统甚至无法提供隔离级别与可序列化一样高。在这篇文章中,我们展示了可序列化的可行性,并且说明它从未成为数据库系统的“黄金标准”。事实上,严格的可串行化才一直是黄金标准。正如我们将看到的,因为在遗留数...转载 2020-02-20 15:36:46 · 1558 阅读 · 1 评论 -
PostgreSQL系统概述_PG数据库内核分析学习笔记
PostgreSQL系统概述_PG数据库内核分析学习笔记PG简介和发展历程PG以一种先进的对象-关系数据库管理系统(ORDBMS), 它不仅支持关系数据库的各种功能, 而且还具备类, 继承等对象数据库的特征.它是目前功能最强大, 特性最丰富的和结构最复杂的开源数据库管理系统, 其中有些特性甚至连商业数据库都不具备.什么是对象数据库?面向对象数据库系统(OODBS)支持定义和操作OODB...原创 2020-02-20 14:16:25 · 1498 阅读 · 1 评论 -
PG MVCC 与 Oracle MVCC实现机制的背后思想差异
PG MVCC 与 Oracle MVCC实现机制的背后思想差异在PG中执行DELETE时, 行不会立即从数据文件中删除, 而是仅通过在页头中设置为xmax字段将其标记为已删除. 同样对于UPDATE, 它可能在PG中被视为DELETE + INSERT.这就因为PG MVCC背后的基本思想之一, 因为它有如下好处:允许更大并发支持更大的UPDATE操作在不同的进程之间最小的锁定O...原创 2020-02-19 21:25:21 · 1381 阅读 · 0 评论 -
buffer和cache区别的简单理解
buffer和cache区别的简单理解什么是buffer, 什么是cache, 在有些情况下两者概念是混用的, 但在有些场合, 二者又有些区别.从我经常使用的场景来"望文生义"理解, buffer就是"缓冲/缓存"的意思, cache经常和"命中率"有关, 由此, 简单推断, “缓冲/缓存"的目的是为了什么, 不就是为了"写"嘛, 而"命中率”, 命中,不命中,和什么有关, 和"读"有关嘛....原创 2020-02-18 23:11:13 · 317 阅读 · 0 评论 -
PG数据库内核分析学习笔记_MultiXact日志管理器
PG数据库内核分析学习笔记_MultiXact日志管理器MultiXact日志是PG系统用来记录组合事务ID的一种日志. 由于PG采用了多版本并发控制, 因此同一个元组相关的事务ID可能有多个, 为了在加锁(行共享锁)的时候统一操作, PG将与该元组相关联的多个事务ID组合起来用一个MultiXactID代替来管理.同CLOG, SubTrans日志一样, MultiXact日志也是利用SLRU...原创 2020-02-18 21:32:57 · 1353 阅读 · 0 评论 -
postgresql psql explain选项使用示例介绍
postgresql psql explain选项使用示例介绍explainpostgres=# explain select count(*) from pgbench_accounts ; QUERY PLAN ...原创 2020-02-18 15:32:49 · 887 阅读 · 0 评论 -
PostgreSQL 10 基于日志的备份与还原
PostgreSQL 10 基于日志的备份与还原wal,即预写式日志,是日志的标准实现方式,简单而言就是将对数据库的变动先记录到日志中,而后在将具体的新数据刷新到磁盘。PostgreSQL将该日志维护在数据文件夹下的子文件夹pg_wal中。当数据库崩溃后,可以通过“重放(replay)”日志中的“动作”,将数据库恢复。也就是说,只要拥有一个基础备份和完整的日志文件,理论上可以将数据库库恢复到任意...原创 2020-02-17 21:20:44 · 2365 阅读 · 0 评论 -
PG数据库内核分析学习笔记_XLOG日志恢复策略
PG数据库内核分析学习笔记_XLOG日志恢复策略在PostgreSQL中,系统在崩溃后重新启动时会调用StartupXlog入口函数.// xlog.c/* * This must be called ONCE during postmaster or standalone-backend startup */voidStartupXLOG(void){ XLogCtlInser...原创 2020-02-17 17:25:32 · 1282 阅读 · 0 评论 -
为什么PG只是用REDO方法来进行数据库的恢复
为什么PG只是用REDO方法来进行数据库的恢复在阅读<PG数据内核分析>一书中, 看到这样一句话:PG只是用REDO方法来进行数据库的恢复, 它不使用UNDO是因为其数据的多版本使得UNDO没有必要. 但从本质上来讲, PG日志并非是REDO日志, 而应该是UNDO/REDO日志, 其创建检查点时大体上服从UNDO/REDO日志创建检查点时要服从的规则, 只是做了一点改动.为...原创 2020-02-17 16:44:32 · 1035 阅读 · 0 评论 -
postgresql无任何优化以及调试宏定义设置
postgresql无任何优化以及调试宏定义设置debug编译去除-O2优化postgresql debug编译配置如下:./configure --enable-debug --prefix=/home/postgres/pginstall但这样虽然增加了-g选项, 但仍然时-O2优化, gdb debug时会跳行, 不爽.改变如下:./configure --enable-deb...原创 2020-01-19 14:50:20 · 396 阅读 · 0 评论