- 浏览: 231150 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
chenxliang:
2016年10月26、27日,上海浦东,Postgres中国用 ...
PostgreSQL的用户、角色和权限管理 -
gejiod:
最近出了SQL:2011標準,希望樓主也更新下
SQL2008标准 -
lincon77:
太长了,又是E文,要是有些例子可能好理解些
SQL2003标准 -
少主丶无翼:
很谢,找了很久
SQL2003标准 -
zeeeitch:
...
PostgreSQL启动过程中的那些事七:初始化共享内存和信号二十:shmem中初始化堆同步扫描、pg子进程相关结构
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.六:初始化系统表缓存catcache
- 博客分类:
- PostgreSQL内核
话说调用 InitPostgres 方法给 portgres 服务进程做相关初始化,这个方法里初始化了 relcache 和 catcache ,初始化了执行查询计划的 portal 的管理器,填充本进程 PGPROC 结构相关部分成员等,上一节讨论了 relcache 管理环境的初始化,这一节继续讨论 catcache 的初始化。
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
下面讨论第( 6 )步, InitCatalogCache 方法初始化 relcache 相关对象。 Relcache 是存放系统表元组的地方。为了图能大一点, PostgresMain 以前的调用流程序列就从下面的图中省略了,要回顾可以参考上面的“ InitPostgres 方法的调用序列梗概图 ”。
相关方法调用序列图
InitCatalogCache -> InitCatCache -> MemoryContextSwitchTo 将内存上下文切换到 "CacheMemoryContext" ,然后 InitCatalogCache -> InitCatCache -> palloc 在内存上下文 "CacheMemoryContext" 里分配管理 catcache 的相关结构。相关结构和图形见下面。
定义一个 syscache 的信息
struct cachedesc
{
Oid reloid ; /* OID of the relation being cached */
Oid indoid ; /* OID of index relation for this cache */
int nkeys ; /* # of keys needed for cache lookup */
int key [4]; /* attribute numbers of key attrs */
int nbuckets ; /* number of hash buckets for this cache */
};
static const struct cachedesc cacheinfo [] = {
{AggregateRelationId, /* AGGFNOID */
AggregateFnoidIndexId,
1,
{
Anum_pg_aggregate_aggfnoid,
0,
0,
0
},
32
},
…… ,
…… ,
…… ,
{UserMappingRelationId, /* USERMAPPINGOID */
UserMappingOidIndexId,
1,
{
ObjectIdAttributeNumber,
0,
0,
0
},
128
},
{UserMappingRelationId, /* USERMAPPINGUSERSERVER */
UserMappingUserServerIndexId,
2,
{
Anum_pg_user_mapping_umuser,
Anum_pg_user_mapping_umserver,
0,
0
},
128
}
};
typedef struct catcache
{
int id ; /* cache identifier --- see syscache.h */
struct catcache * cc_next ; /* link to next catcache */
const char * cc_relname ; /* name of relation the tuples come from */
Oid cc_reloid ; /* OID of relation the tuples come from */
Oid cc_indexoid ; /* OID of index matching cache keys */
bool cc_relisshared ; /* is relation shared across databases? */
TupleDesc cc_tupdesc ; /* tuple descriptor (copied from reldesc ) */
int cc_ntup ; /* # of tuples currently in this cache */
int cc_nbuckets ; /* # of hash buckets in this cache */
int cc_nkeys ; /* # of keys (1..CATCACHE_MAXKEYS) */
int cc_key [CATCACHE_MAXKEYS]; /* AttrNumber of each key */
PGFunction cc_hashfunc [CATCACHE_MAXKEYS]; /* hash function for each key */
ScanKeyData cc_skey [CATCACHE_MAXKEYS]; /* precomputed key info for
* heap scans */
bool cc_isname [CATCACHE_MAXKEYS]; /* flag "name" key columns */
Dllist cc_lists ; /* list of CatCList structs */
#ifdef CATCACHE_STATS
long cc_searches; /* total # searches against this cache */
long cc_hits; /* # of matches against existing entry */
long cc_neg_hits; /* # of matches against negative entry */
long cc_newloads; /* # of successful loads of new entry */
/*
* cc_searches - (cc_hits + cc_neg_hits + cc_newloads) is number of failed
* searches, each of which will result in loading a negative entry
*/
long cc_invals; /* # of entries invalidated from cache */
long cc_lsearches; /* total # list-searches */
long cc_lhits; /* # of matches against existing lists */
#endif
Dllist cc_bucket [1]; /* hash buckets --- VARIABLE LENGTH ARRAY */
} CatCache ; /* VARIABLE LENGTH STRUCT */
struct catcacheheader : 管理所有 cache 的信息 .
typedef struct catcacheheader
{
CatCache * ch_caches ; /* head of list of CatCache structs */
int ch_ntup ; /* # of tuples in all caches */
} CatCacheHeader ;
catcache 和管理它的相关结构图
系统表和 SysCache 中的 catcache 一一对应。静态数组 cacheinfo 的元素 cachedesc 描述系统表的 catcache 信息。系统表中的元组存放在 catcache 的双向链表数组 cc_bucket 的元素 Dllist 里。
------------
转载请著明出处,来自博客:
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服务进程一.八:加载DB基础设施,完成服务进程初始化
2012-09-18 21:02 1805话说调用 InitPostgres ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.七:初始化portal管理环境
2012-09-11 19:58 1633话说调用 In ... -
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 ...
相关推荐
PostgreSQL是一种开源的对象关系型数据库管理系统(ORDBMS),它以其强大的功能、高度的稳定性、良好的社区支持和丰富的数据类型而受到全球开发者的青睐。在本文中,我们将深入探讨PostgreSQL的安装过程,以及如何...
4. **启动与管理**:使用`pg_ctl`或服务管理工具(如systemd, sysvinit)启动和停止PostgreSQL服务。在运行环境中,可以配置`postgresql.conf`文件调整性能参数,如缓存大小、日志设置等。 5. **用户与权限**:...
3. **初始化数据库**:安装完成后,使用`initdb`命令创建一个新的数据库集群,这是PostgreSQL运行的基础。你可以通过指定数据存储路径、字符集等参数来自定义初始化。 4. **启动与停止服务**:PostgreSQL服务器可以...
初始化数据库是PostgreSQL安装过程中必不可少的一步,可以通过执行以下命令完成: ```bash sudo /usr/pgsql-15/bin/postgresql-15-setup initdb ``` 初始化完成后,将会创建数据库目录并设置默认权限。 ##### 3.4...
在这个过程中,Druid会根据配置自动初始化并管理连接池,当应用程序需要连接时,可以从池中获取;使用完毕后,连接会被返回到池中,以便后续使用。这种管理模式既提高了程序运行效率,也降低了数据库的压力。 通过...
一个实例同样可以管理多个数据库,但这些数据库被组织成一个集群,存储在一个初始化时设定的磁盘区域中,该区域由一个目录构成,存储着所有数据。首次数据库创建则通过`initdb`命令完成。值得注意的是,PostgreSQL也...
4. **初始化数据库**:使用`initdb`命令创建一个新的数据目录,然后使用`pg_ctl`启动服务。 5. **安全性**:为默认的`postgres`超级用户设置强密码,并考虑启用SSL加密连接以提高安全性。 总之,"postgresql-9.2.24...
当创建如表、视图、过程、函数等数据对象时,默认情况下会被放置在一个名为 `public` 的模式中。 例如,以下命令展示了如何查看当前用户能够访问的所有模式: ```sql postgres@[local]:1921=# \dn ``` 一个连接只能...
PostgreSQL是一种开源的对象关系型数据库管理系统,其体系结构复杂而精细,旨在提供高效、稳定且功能丰富的数据存储和管理解决方案。以下将详细解析PostgreSQL的主要组成部分及其作用。 1. **核心组件** - **...
- **权限**:某些操作可能需要管理员权限,如写入系统目录或启动服务。 - **配置选项**:根据你的需求选择合适的编译选项,如启用或禁用特定功能,设置端口号,配置数据存储位置等。 3. **部署与初始化** - **...
**Linux系统下的PostgreSQL 9.5.4详解** PostgreSQL是一种开源的对象关系数据库管理系统(ORDBMS),在Linux平台上广泛使用。版本9.5.4是 PostgreSQL 的一个稳定版本,它提供了许多增强功能和优化,以提升性能、...
在IT行业中,数据库管理系统是核心组件之一,而PostgreSQL作为一款开源的关系型数据库,因其强大的功能和稳定性,被广泛应用于各种场景。特别是在集群环境中,为了实现高可用性(HA),PostgreSQL的高可用解决方案...
3. **服务配置**:安装过程中会创建一个名为`postgresql-x64-11.2`的服务,该服务会在系统启动时自动运行,确保数据库系统始终可用。 4. **权限问题**:在Windows 10中,由于更严格的权限控制,可能会出现`icacls`...
这包括初始化进程、后台进程的启动以及内存结构的设置。"postgresSQL程序结构图-v8-wangteacher-v1.0.xmind"这份思维导图可能详细描绘了这些步骤,其中的“xmind”标签表明这是一个可视化表示,有助于我们直观地理解...
PostgreSQL 是一个强大的开源对象关系数据库系统,以其稳定性和丰富的功能而受到全球开发者的广泛欢迎。"postgres-15.2-1-windows-x64" 是 PostgreSQL 的一个针对 Windows 操作系统的64位版本,其版本号为15.2。这个...
2. 安装PostgreSQL 12.2服务器,配置数据目录和初始化数据库。 3. 设置PostgreSQL服务启动和自动启动。 4. 配置PgPool-II,包括连接池大小、监听端口、数据库连接信息等。 5. 启动PgPool-II服务,并检查其与...
4. **启动服务** - 使用`podman-compose up -d`命令启动所有服务,`-d`参数表示在后台运行。 - podman-compose会自动处理服务间的依赖关系,如先启动PostgreSQL,再启动Jumpserver。 5. **验证部署** - 访问配置...
1. 初始化并启动 PostgreSQL 数据库服务: ``` sudo systemctl start postgresql sudo systemctl enable postgresql ``` 2. 创建 Redash 用户和数据库: ``` sudo -u postgres psql CREATE DATABASE redash; CREATE...
在 CentOS7 系统上安装 Odoo 8 这个过程涉及到多个步骤,包括系统更新、配置 YUM 源、安装 PostgreSQL 数据库、安装 EPEL 和 yum-utils、部署必要的依赖包,以及最终的 Odoo 服务安装与配置。下面我们将详细探讨这些...
运行TBase的启动脚本(如`postgres`或`tbase_server`),启动数据库服务。检查日志文件确认服务是否成功启动。 8. **连接与验证** 使用客户端工具(如`psql`)连接到TBase,验证安装是否成功。可以通过查询系统表...