您的位置:首页 > 数据库

笔记 postgresql oid同步

2016-05-25 13:10 309 查看
以前学习postgresql的笔记

create table 消耗 OID

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

会在pg_type中插入两条记录_my_test_table和my_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全

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

具体流程如下:

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

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

3)coordinator节点收到其他几点发来的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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: