PostgreSQL内核
文章平均质量分 77
beiigang_126_com
学习 记录 备查 分享
展开
-
数据库并发事务控制四:postgresql数据库的锁机制
并发控制是DBMS的关键技术,并发控制技术也称为同步机制,其实现通常依赖于底层的并发控制机制。操作系统提供了多种同步对象,如事件 Event、互斥锁 Mutex和条件变量 Cond、信号量Semaphore、读写锁 RWLock、自旋锁 Spinlock等。数据库管理系统自己实现封锁主要是考虑: 锁语义加强:OS只提供排它锁。为了提高并发度,数据库至少需要共享锁和排它锁,即读锁和写锁;原创 2015-01-30 09:48:33 · 13101 阅读 · 2 评论 -
PostgreSQL启动过程中的那些事十九:walwriter进程二
3 这节主要讨论walwriter进程到了WalWriterMain,设置合适的信号处理句柄,创建一个资源属主以保持对本进程资源的跟踪,创建一个本进程的所有工作都在其内做的内存上下文"Wal Writer",创建这个内存上下文是为了本进程在错误恢复期间能重置context并且因此避免可能的内存泄漏。设置错误跳跃点。接着不堵塞信号(当postmaster进程fork本进程时用PG_原创 2012-08-03 16:54:23 · 2043 阅读 · 0 评论 -
PostgreSQL启动过程中的那些事十九:walwriter进程一
话说main()->PostmasterMain()->StartupDataBase(),fork了启动进程调用,调用StartupXLOG方法,启动XLOG、验证数据库一致性、根据情况做数据库恢复和创建检查点,然后启动进程退出。Postmaster进程响应启动进程退出信号,启动了后台写进程、WAL日志写进程、AUTOVACUUM进程、归档进程、统计进程这些辅助进程。1Startup原创 2012-08-01 17:34:39 · 3762 阅读 · 0 评论 -
PostgreSQL启动过程中的那些事十六:启动进程三:CheckPointGuts刷出共享内存里所有数据
话说启动进程调用StartupXLOG启动xlog,根据情况,如果需要就排除系统故障引起的数据库不一致状态,做相应的REDO或UNDO,然后创建一个检查点,把所有共享内存磁盘缓冲和提交数据缓冲写并文件同步到磁盘、把检查点插入xlog文件、更新控制文件,使数据库达到一种状态。 这节接着讨论启动进程在创建检查点时调用的CheckPointGuts方法(在创建重启点时也会调用这个方法)原创 2012-07-12 16:26:48 · 2872 阅读 · 0 评论 -
PostgreSQL启动过程中的那些事十七:ServerLoop
话说main()->PostmasterMain()->StartupDataBase(),fork了启动进程,根据情况处理系统故障并启动了xlog,然后启动进程退出。Postmaster进程响应启动进程退出信号,fork了后台写进程、WAL日志写进程、AUTOVACUUM进程、归档进程、统计进程这些辅助进程。然后,postmaster进程进入了无限循环,等待客户端请求到来,为其提供服务;并根据需原创 2012-07-08 19:30:53 · 2289 阅读 · 0 评论 -
PostgreSQL启动过程中的那些事十六:启动进程二
这节主要讨论启动进程到了StartupXLOG。根据情况,如果需要就排除系统故障引起的数据库不一致状态,做相应的REDO或UNDO,然后创建一个检查点,把所有共享内存磁盘缓冲和提交数据缓冲写并文件同步到磁盘、把检查点插入xlog文件、更新控制文件,使数据库达到一种状态,设置共享内存中XLogCtl、ShmemVariableCache等对象信息;如果不需要,就根据控制文件从xlog文件读取最后的检原创 2012-06-24 16:42:46 · 4807 阅读 · 1 评论 -
PostgreSQL的存储系统二:REDOLOG文件存储结构
Pg XLOG文件(常说的REDOLOG)名字的命名方法是在XLogFileName宏里定义的,分别由时间线ID、日志ID、段ID的八位16进制数依次构成。例如00000001000000010000008F。#defineXLogFileName(fname,tli, log, seg) \ snprintf(fname, MAXFNAMELEN,"%08X%08原创 2012-06-20 19:51:46 · 3636 阅读 · 0 评论 -
PostgreSQL的存储系统一:控制文件存储结构
Pg 控制文件pg_control里存储的数据是一个ControlFileData结构。控制文件尽量保持小于512个字节以使其适合一个典型的磁盘驱动的物理簇的大小。这会减少由于电源故障而写控制文件直接失败的可能性。但控制文件的物理大小是8K,这个远大于512个字节。这样做是为了控制文件格式变化时保持物理大小不变,如果正在读一个不兼容的文件,以使ReadControlFile能传递一个合适的错误版本原创 2012-06-20 19:43:33 · 4354 阅读 · 0 评论 -
PostgreSQL启动过程中的那些事十六:StartDataBase梗概
这一节到了pg的高潮,StartupDataBase启动数据库。 经过细致甚至有些枯燥(这中间我中断了几次就是有这感觉,干这行吗,还是搞清楚了心里踏实。)的准备,激动人心的时刻到了,pg要开始“high”了,pg人的原话就是“We're ready to rock and roll...”。 一个StartupDataBase方法涉及到的方法数十乃至上百,涉及到的代原创 2012-06-10 20:56:14 · 2041 阅读 · 0 评论 -
PostgreSQL启动过程中的那些事十六:启动进程一
话说pg中有个昙花一现的进程“启动进程”(“startup progress”),做了启动XLOG、验证数据库一致性、根据需要做数据库恢复和创建检查点等事情(参见《pg启动过程中的那些事十五StartDataBase梗概》),现在来讨论这个进程。1StartupDataBase调用流程略图 话说Main()->PostmasterMain()->StartupD原创 2012-06-18 22:06:35 · 3649 阅读 · 0 评论 -
PostgreSQL启动过程中的那些事十二:为postmaster进程设置信号句柄
现在离数据库启动过程的高潮只有几步之遥,这几步比较简单,简要描述之。 这几步包括: 八:设置虚拟文件描述符 九:初始化活跃backend进程列表 十:创建opts文件 十一:保存非默认GUC参数到文件 十二:为postmaster进程安装信号句柄 十三:为统计进程启动准备资源原创 2012-05-23 21:39:59 · 3522 阅读 · 0 评论 -
PostgreSQL启动过程中的那些事八:设置文件描述符个数
这一节pg在postmaster启动时估算数据库的要打开的文件数,设置VFD数。 Pg用“虚拟”文件描述符(VFDs)缓存来处理打开的文件。因各种原因服务器打开很多文件描述符,包括基表、临时文件(例如排序和hash spool files)和像那样随机对C例程库的调用;超过系统对单进程能打开的文件数的限制是很容易的。操作系统打开一个文件占用一个文件描述符(FD)。(在现代OS上这原创 2012-05-21 21:22:05 · 2167 阅读 · 1 评论 -
PostgreSQL启动过程中的那些事九_十_十一:初始化活跃backend进程列表、创建opts文件、保持非默认GUC参数文件
现在离数据库启动过程的高潮startdatabase只有几步之遥,这几步比较简单,简要描述之。 这几步包括: 八:设置虚拟文件描述符 九:初始化活跃backend进程列表 十:创建opts文件 十一:保存非默认GUC参数到文件 十二:为postmaster进程安装信号句柄 十三:为统计进程启动原创 2012-05-21 21:35:18 · 3093 阅读 · 0 评论 -
PostgreSQL启动过程中的那些事十二.五:启动系统日志进程syslogger
这一节pg启动系统日志进程。1先上个图,看一下函数调用过程梗概,中间略过部分细节SysLogger启动方法调用流程图 2初始化syslogger进程 话说main()->…->PostmasterMain()->…->SysLogger_Start(),调用logfile_getname获取系统日志文件名,调用logfile_open打开给文件,然后调用s原创 2012-06-10 20:52:47 · 2135 阅读 · 0 评论 -
PostgreSQL启动过程中的那些事十五:加载客户端认证文件
现在离数据库启动过程的高潮只有几步之遥,这几步比较简单,简要描述之。 这几步包括: 八:设置虚拟文件描述符 九:初始化活跃backend进程列表 十:创建opts文件 十一:保存非默认GUC参数到文件 十二:为postmaster进程安装信号句柄 十三:为统计进程启动准备资源原创 2012-06-04 20:38:50 · 1507 阅读 · 0 评论 -
PostgreSQL启动过程中的那些事十八:bgwriter进程一
话说main()->PostmasterMain()->StartupDataBase(),fork了启动进程调用,调用StartupXLOG方法,启动XLOG、验证数据库一致性、根据情况做数据库恢复和创建检查点,然后启动进程退出。Postmaster进程响应启动进程退出信号,启动了后台写进程、WAL日志写进程、AUTOVACUUM进程、归档进程、统计进程这些辅助进程。 1 St原创 2012-07-23 20:25:51 · 3851 阅读 · 1 评论 -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一
到pg服务进程了,打算搞一个完整但简单的查询例子,从解析树到分析树到执行计划树,简论一下pg对于查询的整个处理过程(复杂点的各种树的图就太大了)。 话说pg启动后,postmaster进程进入无限循环,等待客户端请求并为之提供请求的服务(参见《pg启动过程中的那些事十七:serverloop》)。在无限循环里,postmaster进程通过调用操作系统接口select定期检查是否有原创 2012-08-08 14:47:43 · 3651 阅读 · 0 评论 -
PostgreSQL启动过程中的那些事十八:bgwriter进程二
3 这节主要讨论bgwriter进程到了BackgroundWriterMain,设置合适的信号处理句柄,创建一个资源属主以保持对本进程资源的跟踪,创建一个本进程的所有工作都在其内做的内存上下文"Background Writer",创建这个内存上下文是为了本进程在错误恢复期间能重置context并且因此避免可能的内存泄漏。设置错误跳跃点。接着不堵塞信号(当postmaster进程原创 2012-07-27 07:27:36 · 2230 阅读 · 0 评论 -
PostgreSQL的存储系统二:REDOLOG文件存储结构二
REDOLOG文件里的用户数据和数据文件里的用户数据存储结构相同 几个月前同事给台湾一家公司培训《pg9 ad admin》时,有个学员提及WAL里记录的内容为Query时的SQL语句(比如insert等),同事告知WAL里记录的tuple信息,而非SQL,该学员坚持里面是SQL或SQL+tuple,并说oracle的redo日志里记录的是SQL(不知到这个从哪里知道的,也原创 2013-08-29 14:49:09 · 5539 阅读 · 1 评论 -
PostgreSQL服务过程中的那些事三:pg服务进程中的内存上下文
题外话:年底了,就以这篇博文结束2012吧 总结回顾一下pg服务进程中的内存上下文吧。 Pg的内存管理就像经济体制,计划经济和市场经济并存,主要是共享内存和内存上下文。共享内存就是计划经济,启动时根据各相关参数计算好大小就固定了,使用时也严格按照计划使用。内存上下文就是市场经济,这一部分是按需使用。这两种内存的管理前面有几篇文章做了专门讨论,可以参考p原创 2012-12-31 15:07:36 · 3760 阅读 · 1 评论 -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询六:执行器执行
话说查询“select cname, comp from test1, test2 wheretest1.id=test2.id;”发送到服务器端,走查询分支exec_simple_query,先调用start_xact_command初始化了事务管理相关对象和资源,接着调用pg_parse_query,通过Lex和Yacc对传入SQL语句进行词法语法解析,生成解析树。下来调用GetTransac原创 2012-11-07 20:17:33 · 4196 阅读 · 4 评论 -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询四:分析重写成querytree
话说查询“selectcname, comp from test1, test2 where test1.id=test2.id;” 发送到服务器端,走查询分支exec_simple_query,先调用start_xact_command初始化了事务管理相关对象和资源,接着调用pg_parse_query,通过Lex和Yacc对传入SQL语句进行词法语法解析,生成解析树。下来调用GetTransa原创 2012-10-24 19:27:33 · 2580 阅读 · 0 评论 -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询五:规划成plantree
话说查询“selectcname, comp from test1, test2 where test1.id=test2.id;” 发送到服务器端,走查询分支exec_simple_query,先调用start_xact_command初始化了事务管理相关对象和资源,接着调用pg_parse_query,通过Lex和Yacc对传入SQL语句进行词法语法解析,生成解析树。下来调用GetTransa原创 2012-10-31 20:39:30 · 2424 阅读 · 0 评论 -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询一:开启事务
在《PostgreSQL服务过程中的那些事二:pg服务进程处理简单查询概览》里话说以下面的例子对简单查询分支进行讨论,并给出了简单查询方法调用序列,下面就从这儿开始,先回顾一下上节点内容。 进入简单查询分支处理方法exec_simple_query后的处理基本上涵盖了《数据库系统实现》这本书里的内容。处理量相当大,先根据流程图概览一下处理过程。为了减小图的大小,把Postgres原创 2012-09-25 20:00:16 · 3591 阅读 · 1 评论 -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询三:获取内存快照
话说查询“selectcname, comp from test1, test2 where test1.id=test2.id;”发送到服务器端,走查询分支exec_simple_query,先调用start_xact_command初始化了事务管理相关对象和资源,接着调用pg_parse_query,通过Lex和Yacc对传入SQL语句进行词法语法解析,生成解析树。下来调用GetTransac原创 2012-10-16 19:38:50 · 3115 阅读 · 1 评论 -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询二:SQL解析为parsetree
话说查询“selectcname, comp from test1, test2 where test1.id=test2.id;” 发送到服务器端,走查询分支exec_simple_query,先调用start_xact_command初始化了事务管理相关对象和资源,接着调用pg_parse_query,通过Lex和Yacc对传入SQL语句进行词法语法解析,生成解析树。1下面是解析SQL原创 2012-10-09 19:51:53 · 2932 阅读 · 1 评论 -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.八:加载DB基础设施,完成服务进程初始化
话说调用InitPostgres方法给portgres服务进程做相关初始化,这个方法里初始化了relcache和catcache,初始化了执行查询计划的portal的管理器,填充本进程PGPROC结构相关部分成员等,上一节讨论了portal管理环境的初始化,这一节继续讨论剩余的相关初始化。1先看InitPostgres方法的调用序列梗概图InitPostgres方法的调用序列梗原创 2012-09-18 21:12:42 · 4506 阅读 · 0 评论 -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.七:初始化portal管理环境
话说调用InitPostgres方法给portgres服务进程做相关初始化,这个方法里初始化了relcache和catcache,初始化了执行查询计划的portal的管理器,填充本进程PGPROC结构相关部分成员等,上一节讨论了relcache管理环境的初始化,这一节继续讨论执行sql的portal管理器的初始化。 1先看InitPostgres方法的调用序列梗概图 Ini原创 2012-09-11 20:00:02 · 2401 阅读 · 0 评论 -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.五:初始化relcache管理环境
话说调用InitPostgres方法给portgres服务进程做相关初始化,这个方法里初始化了relcache和catcache,初始化了执行查询计划的portal的管理器,填充本进程PGPROC结构相关部分成员等,这一节讨论这个方法。 1先看InitPostgres方法的调用序列梗概图 InitPostgres方法的调用序列梗概图原创 2012-08-28 20:55:19 · 5322 阅读 · 1 评论 -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.六:初始化系统表缓存catcache
话说调用InitPostgres方法给portgres服务进程做相关初始化,这个方法里初始化了relcache和catcache,初始化了执行查询计划的portal的管理器,填充本进程PGPROC结构相关部分成员等,上一节讨论了relcache管理环境的初始化,这一节继续讨论catcache的初始化。 1先看InitPostgres方法的调用序列梗概图 InitPost原创 2012-09-04 20:56:50 · 2081 阅读 · 0 评论 -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询梗概
话说客户端发起请求,pg服务器为该请求启动一个postgres访问进程为该客户端通过访问,建立了连接。这个postgres访问进程进入无限循环,等待客户端请求并为其通过服务,直到进程终止,连接断口。这节就看客户端向postgres服务进程发出请求的处理过程。 1Postgres服务进程处理请求的无限循环调用序列图 上图大红色方框中显示了postgres服原创 2012-08-21 21:09:58 · 2611 阅读 · 1 评论 -
PostgreSQL服务过程中的那些事一:启动postgres服务进程二:建立连接完成
3 这节主要讨论pg服务进程postgres进程到了PostgresMain,所有后台进程,交互或其它进程从这儿开始。 进入PostgresMain后,解析客户端命令行参数dbname;做文件、存储、缓存的初始化;设置合适的信号处理句柄;调用InitPostgres方法给portgres服务进程做相关初始化,这个方法里初始化了relcache和catcache,原创 2012-08-13 18:51:37 · 6853 阅读 · 2 评论 -
PostgreSQL启动过程中的那些事七:初始化共享内存和信号二十:shmem中初始化堆同步扫描、pg子进程相关结构
这一节pg初始化堆扫描同步支持用到的相关结构。 堆扫描同步是当多个进程在同一个表上做顺序扫描(sequential scan),pg尝试保持他们同步以减少整体I/O需求。这个目标是读每一个页到共享内存仅一次,且使所有参与扫描这个页的进程在这个页被替换出共享内存前处理这个页。 活跃backend进程列表,这被用来跟踪pg有多少个孩子和在需要的时候给他们发送信号。原创 2012-05-14 21:19:28 · 1949 阅读 · 0 评论 -
PostgreSQL启动过程中的那些事十三_十四:初始化统计进程需要的资源、为autovuc进程启动做条件检查
现在离数据库启动过程的高潮只有几步之遥,这几步比较简单,简要描述之。 这几步包括: 八:设置虚拟文件描述符 九:初始化活跃backend进程列表 十:创建opts文件 十一:保存非默认GUC参数到文件 十二:为postmaster进程安装信号句柄 十三:为统计进程启动准备资源原创 2012-05-30 08:09:24 · 1895 阅读 · 1 评论 -
PostgreSQL的内存管理机制三:AllocSet/MemoryContext实例删除和内存回收
话说MemoryContextMethods结构里的函数实现了pg里AllocSet/MemoryContext的内存管理机制,定义见下面。typedef structMemoryContextMethods{ void *(*alloc) (MemoryContext context, Sizesize); /* call this free_p in ca原创 2011-12-22 06:17:11 · 3755 阅读 · 0 评论 -
PostgreSQL的内存管理机制二:AllocSet/MemoryContext的内存回收
话说MemoryContextMethods结构里的函数实现了pg里AllocSet/MemoryContext的内存管理机制,定义见下面。typedef structMemoryContextMethods{ void *(*alloc) (MemoryContext context, Sizesize); /* call this free_p in ca原创 2011-12-09 20:28:52 · 2709 阅读 · 1 评论 -
PostgreSQL启动过程中的那些事四:初始化全局时区global_timezone
话说初始化和设置完GUC参数后,改变了当前工作文件夹,给数据集文件夹加了文件锁postmaster.pid,接着就是初始化时区设置,这些都跳过去了,后来发现初始化时区用到了pg里的动态哈希表,决定还是把这个写出来。动态哈希表在pg里使用的地方很多,pg使用它管理共享内存shared memory、锁、市区timezone等。Linux使用哈希表来管理内存、连接等。后面再讨论pg里的动态哈希表d原创 2011-12-19 21:17:18 · 3082 阅读 · 2 评论 -
PostgreSQL启动过程中的那些事七:初始化共享内存和信号一:初始化shmemIndex和信号
pg现在要初始化另一块内存——共享内存shared memory(以后shared memory有时会简写成shmem),在这块内存里,pg存放数据、锁、各种backend进程等。1先上个图,看一下函数调用过程梗概,中间略过部分细节初始化共享内存方法调用流程图 2计算shared memory大小 话说main()->…->PostmasterMa原创 2011-12-29 22:13:57 · 4986 阅读 · 0 评论 -
PostgreSQL启动过程中的那些事一:初始化TopMemoryContext和ErrorContext
1先上个示意图,看一下函数调用过程梗概,中间略过部分细节 前面标1的是初始化TopMemoryContext前面标2的是初始化ErrorContext初始化TopMemoryContext和ErrorContext的方法调用过程图 2初始化TopMemoryContext的过程话说main()->…->PostmasterMain()->…->MemoryC原创 2011-12-07 22:19:07 · 3792 阅读 · 0 评论 -
PostgreSQL启动过程中的那些事三:加载GUC参数
1先上个图,看一下函数调用过程梗概,中间细节有略 GUC参数初始化分两步,第一步先读取buildin/compiled-in的GUC参数默认值,这里包括全部的GUC参数,建立GUC参数相关结构变量,第二步读取postgresql.conf配置文件中的参数设置之。从上图中能看出来,这个读取并设置postgresql.conf中参数的过程还是挺复杂的。2初始化GUC原创 2011-12-09 20:23:25 · 3804 阅读 · 1 评论