笔记 postgresql oid同步

以前学习postgresql的笔记

 

create table 消耗 OID

  • create table my_test_table, 他本身会消耗一个

  • 会在pg_type中插入两条记录_my_test_tablemy_test_table会消耗掉两个oid

  • 如果该表需要toast会生成一个改变的toast表和toast index表消耗另外两个,查看过程如下:

  • create table my_test_table(a int, b char(8192));

  • select oid, relname from pg_class where relname='my_test_table';

  • -- oid = 16384

  • select oid, relname from pg_class where relname like '%16384%';

  • select typname, oid from pg_type where typname like '%my_test_table';

OID同步过程

OID同步原因:当创建表、视图、函数等对象时,对象需要分配新的OID。创建对象的OID

局唯一,因此要在所有的coordinatordatanode上获取一个最大的OID。以create table为例,

具体流程如下:

1)首先和所有的dn及除自己以外的co建立连接。

2)向所有建立连接的节点发送获取OID请求,收到请求的节点,把本节点最大的OID发给coordinator

3coordinator节点收到其他几点发来的oid,选一个最大的oid,然后调用SetNextAssignObjectId

函数,使当前co节点下一个要分配的OID为集群中最大的OID

4)然后才执行create语句,结构体CreateStmt中成员TableOidInfo用来存储获取的最大的

OID,当前coordiator把查询计划下发到其它节点,其它节点获取到最大OID后调用函数

heap_create_with_catalog,在自己节点上创建表

OID同步涉及到的系统表

pg_class

pg_namespace --create schema

pg_constraint

pg_operator

pg_ts_parser

pg_ts_dict

pg_ts_template

pg_ts_config

pg_collation

pg_am

pg_extension

pg_foreign_data_wrapper

pg_foreign_server

pg_user_mapping

pg_type

pg_enum

pg_proc

pg_rewrite

pg_trigger

pg_language

pg_conversion

pg_cast

pg_opfamily

pg_opclass

pg_tablespace

OID同步去除

当前实现可能存在问题是,当有节点或所有节点的OID回绕了,创建对象非常有可能失败。OID同步去除参考

PG-XL的做法,在查询计划中发送对象名,到节点上再转成本地OID


原文地址:https://www.cnblogs.com/codeblock/p/5526649.html