- 浏览: 232045 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
chenxliang:
2016年10月26、27日,上海浦东,Postgres中国用 ...
PostgreSQL的用户、角色和权限管理 -
gejiod:
最近出了SQL:2011標準,希望樓主也更新下
SQL2008标准 -
lincon77:
太长了,又是E文,要是有些例子可能好理解些
SQL2003标准 -
少主丶无翼:
很谢,找了很久
SQL2003标准 -
zeeeitch:
...
PostgreSQL启动过程中的那些事七:初始化共享内存和信号二十:shmem中初始化堆同步扫描、pg子进程相关结构
PostgreSQL启动过程中的那些事七:初始化共享内存和信号十八:shmem中初始化WalSender和WalRecv相关结构
- 博客分类:
- PostgreSQL内核
1 先上个图,看一下函数调用过程梗概,中间略过部分细节
初始化 walsender 和 walreceiver 相关结构 方法调用流程图
2 初始化 xlog 相关结构
话说 main()-> … ->PostmasterMain()-> … ->reset_shared() -> CreateSharedMemoryAndSemaphores()> … ->WalSndShmemInit() ,调用 ShmemInitStruct() , 在其中 调用 hash_search() 在哈希表索引 "ShmemIndex" 中查找 "Wal Sender Ctl" ,如果没有,就在 shmemIndex 中给 "Wal Sender Ctl" 分一个 HashElement 和 ShmemIndexEnt ( entry ) ,在其中的 Entry 中写上 "Wal Sender Ctl" 。返回 ShmemInitStruct() ,再调用 ShmemAlloc() 在共享内存上给 "Wal Sender Ctl" 相关结构(见下面“ Wal Sender Ctl 和 Wal Receiver Ctl 相关结构图” )分配空间,设置 entry (在这儿及ShmemIndexEnt 类型变量)的成员 location 指向该空间, size 成员记录该空间大小 , 最后返回 WalSndShmemInit () ,让 WalSndCtlData * 类型 全局变量 WalSndCtl 指向 所分配内存 ,初始化WalSndCtlData 结构类型的成员值。
接着 WalRcvShmemInit() -> ShmemInitStruct() , 在其中 调用 hash_search() 在哈希表索引 "ShmemIndex" 中查找 "Wal Receiver Ctl" ,如果没有,就在 shmemIndex 中给 "Wal Receiver Ctl" 分一个 HashElement 和 ShmemIndexEnt ( entry ) ,在其中的 Entry 中写上 "Wal Receiver Ctl" 。返回 ShmemInitStruct() ,再调用 ShmemAlloc() 在共享内存上给 "Wal Receiver Ctl" 相关结构(见下面“ Wal Sender Ctl 和 Wal Receiver Ctl 相关结构图” )分配空间,设置 entry (在这儿及ShmemIndexEnt 类型变量)的成员 location 指向该空间, size 成员记录该空间大小 , 最后返回 WalRcvShmemInit () ,让 WalRcvData * 类型 全局变量 WalRcv 指向 所分配内存 ,初始化WalRcvData 结构类型的成员值。
相关结构定义和图见下面:
typedef enum WalSndState
{
WALSNDSTATE_STARTUP = 0,
WALSNDSTATE_BACKUP ,
WALSNDSTATE_CATCHUP ,
WALSNDSTATE_STREAMING
} WalSndState ;
/*
* Each walsender has a WalSnd struct in shared memory.
*/
typedef struct WalSnd
{
pid_t pid ; /* this walsender's process id, or 0 */
WalSndState state ; /* this walsender's state */
XLogRecPtr sentPtr ; /* WAL has been sent up to this point */
/*
* The xlog locations that have been written, flushed, and applied by
* standby-side. These may be invalid if the standby-side has not offered
* values yet.
*/
XLogRecPtr write ;
XLogRecPtr flush ;
XLogRecPtr apply ;
/* Protects shared variables shown above. */
slock_t mutex ;
/*
* Latch used by backends to wake up this walsender when it has work to
* do.
*/
Latch latch ;
/*
* The priority order of the standby managed by this WALSender, as listed
* in synchronous_standby_names, or 0 if not-listed. Protected by
* SyncRepLock.
*/
int sync_standby_priority ;
} WalSnd ;
extern WalSnd *MyWalSnd;
/* There is one WalSndCtl struct for the whole database cluster */
typedef struct
{
/*
* Synchronous replication queue. Protected by SyncRepLock.
*/
SHM_QUEUE SyncRepQueue ;
/*
* Current location of the head of the queue. All waiters should have a
* waitLSN that follows this value. Protected by SyncRepLock.
*/
XLogRecPtr lsn ;
/*
* Are any sync standbys defined? Waiting backends can't reload the
* config file safely, so WAL writer updates this value as needed.
* Protected by SyncRepLock.
*/
bool sync_standbys_defined ;
WalSnd walsnds [1]; /* VARIABLE LENGTH ARRAY */
} WalSndCtlData ;
extern WalSndCtlData *WalSndCtl;
typedef enum
{
WALRCV_STOPPED , /* stopped and mustn't start up again */
WALRCV_STARTING , /* launched, but the process hasn't
* initialized yet */
WALRCV_RUNNING , /* walreceiver is running */
WALRCV_STOPPING /* requested to stop, but still running */
} WalRcvState ;
/* Shared memory area for management of walreceiver process */
typedef struct
{
/*
* PID of currently active walreceiver process, its current state and
* start time (actually, the time at which it was requested to be
* started).
*/
pid_t pid ;
WalRcvState walRcvState ;
pg_time_t startTime ;
/*
* receiveStart is the first byte position that will be received. When
* startup process starts the walreceiver , it sets receiveStart to the
* point where it wants the streaming to begin.
*/
XLogRecPtr receiveStart ;
/*
* receivedUpto-1 is the last byte position that has already been
* received. At the first startup of walreceiver , receivedUpto is set to
* receiveStart. After that, walreceiver updates this whenever it flushes
* the received WAL to disk.
*/
XLogRecPtr receivedUpto ;
/*
* latestChunkStart is the starting byte position of the current "batch"
* of received WAL. It's actually the same as the previous value of
* receivedUpto before the last flush to disk. Startup process can use
* this to detect whether it's keeping up or not.
*/
XLogRecPtr latestChunkStart ;
/*
* connection string; is used for walreceiver to connect with the primary.
*/
char conninfo [MAXCONNINFO];
slock_t mutex ; /* locks shared variables shown above */
} WalRcvData ;
extern WalRcvData *WalRcv;
初始化完 Wal Receiver Ctl 和 Wal Receiver Ctl 相关结构 的共享内存结构图
为了精简上图,把创建 shmem 的哈希表索引 "ShmemIndex" 时创建的 HCTL 结构删掉了,这个结构的作用是记录创建可扩展哈希表的相关信息,不过这个结构在 "ShmemIndex" 创建完成后也会由于出了对象作用域而消失。增加了左边灰色底的部分,描述 共享内存 /shmem 里各变量物理布局概览,由下往上,由低地址到高地址。 图中黄色的索引项就是本节新增加的索引项。
Wal Sender Ctl 和 Wal Receiver Ctl 相关结构图
发表评论
-
PostgreSQL服务过程中的那些事三:pg服务进程中的内存上下文
2012-12-31 15:07 2073题外话:年底了,就以这篇博文结束2012 ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询六:执行器执行
2012-11-07 20:13 1848话说 查询“ select c ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询五:规划成plantree
2012-10-31 20:37 1753话说 查询“ select cname, comp ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询四:分析重写成querytree
2012-10-24 19:27 1440话说 查询“ select cname, comp ... -
postgresql 小技巧
2012-10-16 19:36 1406Note : #PostgreSQL and ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询三:获取内存快照
2012-10-16 19:31 1764话说 查询“ select cname, comp ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询二:SQL解析为parsetree
2012-10-09 19:50 1553话说 查询“ select cname, comp fr ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询一:开启事务
2012-09-25 19:55 1900在《 PostgreSQL 服务过程中的那些事二: ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.八:加载DB基础设施,完成服务进程初始化
2012-09-18 21:02 1810话说调用 InitPostgres ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.七:初始化portal管理环境
2012-09-11 19:58 1638话说调用 In ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.六:初始化系统表缓存catcache
2012-09-04 20:51 1871话说调用 InitPostgres ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.五:初始化relcache管理环境
2012-08-28 20:47 1324话说调用 InitPostgres ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程三:初始化relcache管理环境
2012-08-28 20:46 0<!-- [if gte mso 9]><x ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询梗概
2012-08-21 21:04 1264话说客户端发起请求, pg 服务器为该请求启动一个 ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程二:建立连接完成
2012-08-13 18:50 15813 这节主要讨论 pg 服务进程 pos ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一
2012-08-08 14:42 5712到pg 服务进程了,打算搞一个完整但简单的查询例子,从 ... -
PostgreSQL启动过程中的那些事十九:walwriter进程二
2012-08-03 16:53 13873 这节主要讨论 walwrit ... -
PostgreSQL启动过程中的那些事十九:walwriter进程一
2012-08-01 17:26 1626话说 main()->Po ... -
PostgreSQL启动过程中的那些事十八:bgwriter进程二
2012-07-27 07:25 14393 这节主要讨论 bgwr ... -
PostgreSQL启动过程中的那些事十八:bgwriter进程一
2012-07-23 20:18 1656话说 main()->Postm ...
相关推荐
InitWalSender 函数会将全局的 WalSndCtl 的 walsnds 初始化,walsnds 是一个变长数组,会根据 max_wal_senders 进行内存分配和初始化。每个创建的 Walsender 都会保存到全局的 WalSndCtl 的数组中。 在 Walsender ...
nacos-2.0.1 postgresql初始化脚本
在Quartz 2.2.3版本中,初始化数据库是使用Quartz的关键步骤,因为Quartz依赖于一个持久化存储来保存作业和触发器的信息。这个过程通常涉及执行一系列SQL语句来创建必要的表结构。 Quartz的初始化SQL语句主要用于...
`wal2json` 的核心功能在于其能够将 PostgreSQL 的原始 WAL 信息转换为结构化的 JSON 文档,这对于监控、审计、备份和恢复等场景非常有用。通过将 WAL 数据解析成 JSON,用户可以轻松地理解和分析数据库的变化,同时...
一、服务器进程的启动和关闭: 一、服务器进程的启动和关闭: 一、服务器进程的启动和关闭: 一、服务器进程的启动和关闭: 一、服务器进程的启动和关闭: 一、服务器进程的启动和关闭: . 50 PostgreSQL PostgreSQL...
"quartz-job初始化数据表.zip" 文件显然包含了用于设置Quartz作业调度系统的数据库表结构。 这个压缩包可能包含了一系列SQL脚本,用于在数据库中创建必要的表,这些表包括但不限于: 1. **QRTZ_JOB_DETAILS**:此...
- `src/backend/utils/misc/pg_shmem.c`文件中实现了共享内存的相关功能,这对于多进程之间的通信非常重要。 #### 五、PostgreSQL与MySQL对比 **1. PostgreSQL文件目录组织**: - 整体代码结构清晰,遵循了良好的...
在初始化过程中,initdb会生成一系列的配置文件和数据库模板,并设置默认的最大连接数、共享缓冲区等参数。完成初始化之后,会得到一系列的成功消息,表明数据库系统已经准备就绪。 最后,使用pg_ctl工具来启动...
PostgreSQL的WAL(Write-Ahead Logging)是数据库中一个关键的内部机制,用于确保事务的持久性和一致性。WAL机制是许多数据库系统中用来增强数据安全性的标准做法,与Oracle数据库中的REDO日志功能相似。在学习...
Postgresql存储过程中可以使用各种控制结构,包括条件语句、循环语句和跳转语句。 * IF语句:用于判断条件的真假 * LOOP语句:用于实现循环操作 * EXIT语句:用于退出循环 * CONTINUE语句:用于继续执行循环 * ...
在本节内容中,我们将深入了解如何使用Go语言和GORM库初始化MySQL数据库,并建立与该数据库的连接。GORM是一个流行的Go语言ORM(对象关系映射)库,它允许开发者通过编程方式与数据库交互,而无需编写大量的SQL代码...
这将做很多事,包括建立 PostgreSQL 需要运行的数据结构以及初始化一个可工作的数据库:template1。你需要使用 postgres 用户来运行 initdb 工具。 ``` pg$ /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data `...
赠送jar包:postgresql-42.3.1.jar; 赠送原API文档:postgresql-42.3.1-javadoc.jar; 赠送源代码:postgresql-42.3.1-sources.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
- **share**:共享资源,如语言模块、初始化脚本等。 - **global**:全局系统对象的数据文件。 - **base**:每个数据库的单独目录。 - **pg_clog**、**pg_subtrans**、**pg_multixact**等:用于事务管理和并发...
初始化数据库是PostgreSQL安装过程中必不可少的一步,可以通过执行以下命令完成: ```bash sudo /usr/pgsql-15/bin/postgresql-15-setup initdb ``` 初始化完成后,将会创建数据库目录并设置默认权限。 ##### 3.4...
在Spring MVC项目中,数据库初始化脚本通常用于在应用启动时设置数据库结构和预填充数据,确保系统能正常运行。 描述中提到“只使用于mysql数据库”,这表明提供的脚本是针对MySQL数据库设计的。MySQL是一种流行的...
* 数据库设计:PostgreSQL数据库设计包括数据模型、表结构、索引和约束等方面。 PostgreSQL安装与配置 * PostgreSQL安装:包括下载、安装和配置PostgreSQL服务器。 * PostgreSQL配置:包括设置数据库参数、内存...
初始化数据库是为了使 PostgreSQL 数据库能够正常运行。包括设置数据库密码、创建数据库目录、初始化数据库结构等步骤。 登录数据库 登录数据库是为了对 PostgreSQL 数据库进行管理和维护。使用 psql 命令可以连接...
在标题和描述中提到的“postgresql 12、15离线安装包”指的是为这两个版本提供的安装程序,适用于没有互联网连接或者网络环境受限的环境。离线安装包通常包含了所有必要的组件和依赖,使得用户可以在本地计算机上...
赠送jar包:postgresql-42.2.5.jar; 赠送原API文档:postgresql-42.2.5-javadoc.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。