- 浏览: 231166 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
chenxliang:
2016年10月26、27日,上海浦东,Postgres中国用 ...
PostgreSQL的用户、角色和权限管理 -
gejiod:
最近出了SQL:2011標準,希望樓主也更新下
SQL2008标准 -
lincon77:
太长了,又是E文,要是有些例子可能好理解些
SQL2003标准 -
少主丶无翼:
很谢,找了很久
SQL2003标准 -
zeeeitch:
...
PostgreSQL启动过程中的那些事七:初始化共享内存和信号二十:shmem中初始化堆同步扫描、pg子进程相关结构
话说调用 InitPostgres 方法给 portgres 服务进程做相关初始化,这个方法里初始化了 relcache 和 catcache ,初始化了执行查询计划的 portal 的管理器,填充本进程 PGPROC 结构相关部分成员等,上一节讨论了 portal 管理环境的初始化,这一节继续讨论剩余的相关初始化。
1
先看 InitPostgres 方法的调用序列梗概图
InitPostgres 方法的调用序列梗概图
InitPostgres 方法为初始化这个 postgres 服务进程做了一系列的工作,具体如下:
( 1 )调用 InitProcessPhas e2 方法,把本进程的 PGPROC 结构注册到 PGPROC 数组,就是让 共享内存里的 PGPROC 数组( 初始化 PGPROC 数组的文章见《 PostgreSQL 启动过程中的那些事七:初始化共享内存和信号十一: shmem 中初始化 SharedProcArray 》 )的第一个空元素指向这个 PGPROC 结构 ,并注册退出时做内存清理的函数。
( 2 )调用 SharedInvalBackendInit 方法,在该后台进程数据的 共享失效管理器数组获取一个 ProcState 结构(相关数据结果见《 PostgreSQL 启动过程中的那些事七:初始化共享内存和信号十三: shmem 中初始化 SharedInvalidationState 》)给该进程并初始化相关项,并注册退出方法以在退出时标记本进程的项非活跃。
( 3 )调用 ProcSignalInit 方法, 在 ProcSignalSlot 结构 数组(关于 ProcSignalSlot 结构 数组参见《 PostgreSQL 启动过程中的那些事七:初始化共享内存和信号十四: shmem 中初始化 PMSignal 》) ProcSignalSlot s 里给当前进程获取一个元素,元素下标是 MyBackendId-1 ,并注册以在进程退出时释放这个槽。
( 4 )为访问 XLOG ,调用 RecoveryInProgress 方法做共享内存相关初始化。
( 5 )调用 RelationCacheInitlisze 方法做管理 relcache 的环境的初始化。
( 6 )调用 InitCatalogCache 方法做管理 catcache 的环境的初始化。
( 7 )调用 EnablePortalManager 方法初始化 portal 管理器。
( 8 )调用 RelationCacheInitializePhase2 方法初始化共享系统表。
( 9 )调用 GetTransactionSnapshot 方法获取一个事务快照。这个方法在后面讨论简单查询时再讨论。
( 10 )调用 PerformAuthentication 方法根据 hba 文件设置进行客户端认证。
( 11 )调用 GetDatabaseTuple 方法根据数据库名字从 pg_database 系统表获取要访问的数据库对应的元组。
( 12 )调用 RelationCacheInitializePhase3 方法完成 relcache 初始化。
( 13 )调用 CheckMyDatabase 方法检查当前用户的数据库访问权限,从 cache 里的 pg_database 取当前数据库的相关属性字段。
( 14 )调用 InitializeClientEncoding 方法初始化客户端字符编码。
( 15 )调用 pgstat_bestart 方法在 PgBackendStatus 设置本进程状态。
2
这一节概论第 8 步到第 15 步。先看一下后续方法的调用序列图,为了图能大一点, PostgresMain 以前的调用流程序列就从下面的图中省略了,要回顾可以参考上面的“ InitPostgres 方法的调用序列梗概图 ”。
相关方法 调用序列图
下面讨论第( 8 )步, RelationCacheInitializePhase2 方法初始化共享 catalog 。先看一下为什么要有第( 5 )、( 8 )、( 12 )步三步来初始化 relcache 。当前还处在数据库服务器和客户端建立连接的过程中,数据库服务器的服务进程要根据连接串中指定数据库加载其相关对象,但此时服务器端还没有加载访问数据库的基础设施,比如系统表 "pg_database" 、 "pg_authid" 、 "pg_auth_members" 等的描述符及其相关索引 信息,因此无法通过系统表访问数据库的相关信息。第( 5 )步初始化 relcache 的管理环境,参见《
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.五:初始化relcache管理环境
》。第( 8 )步通过 "global/pg_filenode.map" 、 "global/pg_internal.init" 文件初始化共享 catalog : "pg_catalog" ,将系统表 "pg_database" 、 "pg_authid" 、 "pg_auth_members" 等的描述符信息加载到 relcache 里。 "global/pg_filenode.map" 文件里存放的是数据库中关系和文件节点的映射信息, "global/pg_internal.init" 文件里存放的是 "pg_class" 、 "pg_attribute" 、 "pg_proc" 、 "pg_type" 等系统关系信息。然后完成设置数据库快照(第 9 步)、根据 hba 文件完成客户端认证(第 10 步)、 从 pg_database 获取客户端要访问的数据库的对应元组(第11步),第 ( 12 )步根据要访问的数据库 ID ,加载该数据库本地的 "pg_filenode.map" 、 "pg_internal.init" 文件完成初始化。加载 "pg_class" 、 "pg_attribute" 、 "pg_proc" 、 "pg_type" 等及其索引信息。如果从相关 "pg_filenode.map" 、 "pg_internal.init" 文件初始化失败,系统会从硬编码的代码中初始化基础设施相关关系信息,下面摘录了 "pg_database" 、 "pg_authid" 、 "pg_auth_members" 的硬编码信息。不管加载那个文件,完成相关信息初始化后如有必要将重新该文件。重写时先写临时文件,写完后改文件名为正式文件。这样做是为了避免并发的后台进程读相关文件时崩溃。关于文件名举个例子,例如文件 "data/global/pg_internal.init" ,对应的临时文件名是 "data/global/pg_internal.init.pid" ,最后的 "pid" 是当前进程 ID 。
第( 13 )步调用 CheckMyDatabase 方法检查当前用户的数据库访问权限,从 cache 里的 pg_database 取当前数据库的相关属性字段。第( 14 )调用 InitializeClientEncoding 方法初始化客户端字符编码。第( 15 )调用 pgstat_bestart 方法在 PgBackendStatus 设置本进程状态。至此 pg 服务进程的初始化工作告一段落。
下面是部分系统关系硬编码信息:
DATA(insert OID = 11 ( "pg_catalog" PGUID _null_ ));
DESCR( "system catalog schema" );
#define PG_CATALOG_NAMESPACE 11
#define DatabaseRelationId 1262
#define DatabaseRelation_Rowtype_Id 1248
CATALOG(pg_database,1262) BKI_SHARED_RELATION BKI_ROWTYPE_OID(1248) BKI_SCHEMA_MACRO
{
NameData datname; /* database name */
Oid datdba; /* owner of database */
int4 encoding; /* character encoding */
NameData datcollate; /* LC_COLLATE setting */
NameData datctype; /* LC_CTYPE setting */
bool datistemplate; /* allowed as CREATE DATABASE template? */
bool datallowconn; /* new connections allowed? */
int4 datconnlimit; /* max connections allowed (-1=no limit) */
Oid datlastsysoid; /* highest OID to consider a system OID */
TransactionId datfrozenxid; /* all Xids < this are frozen in this DB */
Oid dattablespace; /* default table space for this DB */
aclitem datacl[1]; /* access permissions (VAR LENGTH) */
} FormData_pg_database;
/* ----------------
* Form_pg_database corresponds to a pointer to a tuple with
* the format of pg_database relation.
* ----------------
*/
typedef FormData_pg_database * Form_pg_database ;
/* ----------------
* pg_authid definition. cpp turns this into
* typedef struct FormData_pg_authid
* ----------------
*/
#define AuthIdRelationId 1260
#define AuthIdRelation_Rowtype_Id 2842
CATALOG(pg_authid,1260) BKI_SHARED_RELATION BKI_ROWTYPE_OID(2842) BKI_SCHEMA_MACRO
{
NameData rolname; /* name of role */
bool rolsuper; /* read this field via superuser() only! */
bool rolinherit; /* inherit privileges from other roles? */
bool rolcreaterole; /* allowed to create more roles? */
bool rolcreatedb; /* allowed to create databases? */
bool rolcatupdate; /* allowed to alter catalogs manually? */
bool rolcanlogin; /* allowed to log in as session user? */
bool rolreplication; /* role used for streaming replication */
int4 rolconnlimit; /* max connections allowed (-1=no limit) */
/* remaining fields may be null; use heap_getattr to read them! */
text rolpassword; /* password, if any */
timestamptz rolvaliduntil; /* password expiration time, if any */
} FormData_pg_authid;
#undef timestamptz
/* ----------------
* Form_pg_authid corresponds to a pointer to a tuple with
* the format of pg_authid relation.
* ----------------
*/
typedef FormData_pg_authid * Form_pg_authid ;
/* ----------------
* pg_auth_members definition. cpp turns this into
* typedef struct FormData_pg_auth_members
* ----------------
*/
#define AuthMemRelationId 1261
#define AuthMemRelation_Rowtype_Id 2843
CATALOG(pg_auth_members,1261) BKI_SHARED_RELATION BKI_WITHOUT_OIDS BKI_ROWTYPE_OID(2843) BKI_SCHEMA_MACRO
{
Oid roleid; /* ID of a role */
Oid member; /* ID of a member of that role */
Oid grantor; /* who granted the membership */
bool admin_option; /* granted with admin option? */
} FormData_pg_auth_members;
/* ----------------
* Form_pg_auth_members corresponds to a pointer to a tuple with
* the format of pg_auth_members relation.
* ----------------
*/
typedef FormData_pg_auth_members * Form_pg_auth_members ;
就到这儿吧!
------------
转载请著明出处,来自博客:
blog.csdn.net/beiigang
beigang.iteye.com
发表评论
-
PostgreSQL服务过程中的那些事三:pg服务进程中的内存上下文
2012-12-31 15:07 2065题外话:年底了,就以这篇博文结束2012 ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询六:执行器执行
2012-11-07 20:13 1824话说 查询“ select c ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询五:规划成plantree
2012-10-31 20:37 1736话说 查询“ select cname, comp ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询四:分析重写成querytree
2012-10-24 19:27 1437话说 查询“ select cname, comp ... -
postgresql 小技巧
2012-10-16 19:36 1387Note : #PostgreSQL and ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询三:获取内存快照
2012-10-16 19:31 1763话说 查询“ select cname, comp ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询二:SQL解析为parsetree
2012-10-09 19:50 1534话说 查询“ select cname, comp fr ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询一:开启事务
2012-09-25 19:55 1889在《 PostgreSQL 服务过程中的那些事二: ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.七:初始化portal管理环境
2012-09-11 19:58 1633话说调用 In ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.六:初始化系统表缓存catcache
2012-09-04 20:51 1857话说调用 InitPostgres ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.五:初始化relcache管理环境
2012-08-28 20:47 1317话说调用 InitPostgres ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程三:初始化relcache管理环境
2012-08-28 20:46 0<!-- [if gte mso 9]><x ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询梗概
2012-08-21 21:04 1260话说客户端发起请求, pg 服务器为该请求启动一个 ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程二:建立连接完成
2012-08-13 18:50 15783 这节主要讨论 pg 服务进程 pos ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一
2012-08-08 14:42 5687到pg 服务进程了,打算搞一个完整但简单的查询例子,从 ... -
PostgreSQL启动过程中的那些事十九:walwriter进程二
2012-08-03 16:53 13813 这节主要讨论 walwrit ... -
PostgreSQL启动过程中的那些事十九:walwriter进程一
2012-08-01 17:26 1615话说 main()->Po ... -
PostgreSQL启动过程中的那些事十八:bgwriter进程二
2012-07-27 07:25 14333 这节主要讨论 bgwr ... -
PostgreSQL启动过程中的那些事十八:bgwriter进程一
2012-07-23 20:18 1646话说 main()->Postm ... -
PostgreSQL启动过程中的那些事十六:启动进程三:CheckPointGuts刷出共享内存里所有数据
2012-07-12 16:24 1480话说启动进程调用 Startup ...
相关推荐
在本话题中,我们将深入探讨“OLEDB驱动程序大全”中的一个特定组件——PostgreSQL OLEDB Provider。 PostgreSQL OLEDB Provider是用于连接和操作PostgreSQL数据库的OLEDB驱动程序。PostgreSQL是一种开源的关系型...
初始化数据库并启用自动启动,命令为:/usr/pgsql-9.3/bin/postgresql93-setup initdb、systemctl enable postgresql-9.3 和 systemctl start postgresql-9.3 四、添加新用户和新数据库 1. 新建一个 Linux 新用户...
9. **初始化数据库**: ```bash /opt/pgsql/bin/initdb -D /opt/pgsql/data ``` 10. **启动数据库服务**: ```bash /opt/pgsql/bin/pg_ctl -D /opt/pgsql/data -l logfile start ``` 11. **创建数据库**: ...
《在CentOS7上安装TimescaleDB 2.3.1和PostgreSQL 11.7的详细步骤》 在数据库领域,TimescaleDB和PostgreSQL是两个备受瞩目的组件。TimescaleDB是一款专为时间序列数据设计的开源扩展,它构建于PostgreSQL之上,...
本文介绍了如何从源码包编译安装 Postgresql,包括创建 LV、创建数据库软件用户、解压软件包、源码包编译安装、初始化数据库、启动数据库和登录数据库实例等步骤。这些步骤适用于所有的源码包安装。
安装过程中,用户可以选择安装路径、设置数据库端口号、创建初始管理员用户(例如,'postgres')以及配置数据存储目录。安装完成后,可以通过pgAdmin或其他图形化管理工具来管理和操作数据库。 **TimescaleDB:** ...
### 一、服务器进程的启动和关闭 PostgreSQL服务器的管理通常通过`pg_ctl`命令进行,它是对`postgres`命令的封装,提供了更为便捷的使用方式。以下是`pg_ctl`的常用选项: 1. **初始化数据库**: - `pg_ctl init...
CentOS 6.8 安装 PostgreSQL 11 数据库...这篇文章详细介绍了 Centos 6.8 安装 PostgreSQL 11 数据库的步骤,包括安装存储库 RPM、安装客户端软件包、安装服务、初始化数据库、修改数据库存储路径、添加用户和授权等。
然后,我们需要初始化数据库,启动和停止数据库服务。具体命令如下: ``` $mkdir /home/postgres/pgsql_data $vi .bash_profile 修改 PATH 为:PATH=$PATH:$HOME/bin:/home/postgres/pgsql/bin 加入 export PGDATA=...
- 初始化仓库:`svnadmin create /usr/local/subversion/repos/myrepo` 5. **设置权限**: - `chown -R apache:apache /usr/local/subversion/repos` - `chmod -R 755 /usr/local/subversion/repos` 6. **配置 ...
- `var x int = 10` 是一种变量声明方式,同时初始化变量。 - `y := 20` 使用了简短变量声明语法(`:=`),这在Go语言中是一种非常常见的写法,尤其在函数内部使用。 - `sum := x + y` 同样使用简短变量声明语法,...
3. 创建连接对象:使用`NpgsqlConnection`(如果使用Npgsql)或`OleDbConnection`(如果使用PgOleDb)类创建连接对象,并用上面的连接字符串初始化。 4. 打开连接:调用`Open()`方法来建立到数据库的连接。 5. ...
PostgreSQL,简称Postgres,是一个强大的、高度可扩展的开源关系数据库管理系统(RDBMS)。它的版本13.2是该系统的最新稳定版,提供了诸多改进和新特性,旨在提升性能、可靠性和易用性。这个“postgresql-13.2.tar....
- 启动PostgreSQL服务,例如`pg_ctl -D /usr/local/pgsql -l /home/postgres/postgresql.log start`。 - 设置`postgres`用户的密码,如`alter user postgres with password '123456';`。 3. **数据库流复制配置**...
**2.4 初始化和启动服务** - **初始化**:创建数据库实例所需的目录结构和文件。 ```shell /usr/pgsql-11/bin/postgresql-11-setup initdb ``` - **启动服务**:通过Systemd服务管理工具启动PostgreSQL服务。 ``...
在`main.go`文件中,我们将初始化GraphQL服务器,并设置解析器。解析器是GraphQL服务的核心,它接收查询并返回结果。你可以使用`graphql.NewObject`和`graphql.Field`函数来创建GraphQL对象和字段,然后将它们组装成...
它使用数据容器进行持久化,与主机卷相比,这是一种更为优雅的方法。 要求 Ubuntu 14.04已通过测试。 该角色使用Ansible的docker模块,因此要求。 角色变量 这是具有默认值的默认变量的列表: postgres_docker_...
在IT行业中,数据库管理系统是核心组件之一,而TimescaleDB和PostgreSQL是两个备受瞩目的开源解决方案。本文将深入探讨“timescaledb1.7.5+pg10.7 for Centos7”安装包及依赖包的相关知识点,旨在帮助您理解和安装这...
- 初始化数据库是安装后的关键步骤,使用`postgresql-setup --initdb`命令来完成,这会创建默认的数据目录,例如 `/var/lib/pgsql/data`。 - 配置启动服务以便在系统启动时自动运行PostgreSQL,通过`systemctl ...