PostgreSQL中的OID和XID 说明

随心笔谈2年前发布 admin
210 0 0

文章摘要

这篇文章介绍了PostgreSQL中的两个重要概念:OID(对象标识符)和XID(事务ID)。OID是一个32位的值,用于表的约束中,通常在创建表时使用WITH OIDS配置或设置default_with_oids参数时生成。XID也是一个32位的值,用于事务管理。由于32位的限制,这两个值在大型或长时间运行的数据库中可能导致重叠,从而引发问题。 文章强调,虽然 OID 和 XID 的重叠本身并不是致命的,但需要采取适当的维护措施,例如使用pg_resetxlog命令来重置事务日志。该命令可以手动重置事务ID或对象标识符,并提供多种选项来调整事务日志的设置。 通过这篇文章,读者可以更好地理解PostgreSQL内部的事务和对象管理机制,以及如何在出现问题时进行有效的解决。


oid: 行的对象标识符(对象 ID)。这个字段只有在创建表的时候使用了 WITH OIDS ,或者是设置了default_with_oids 配置参数时出现。 这个字段的类型是 oid (和字段同名)。

例子:

复制代码 代码如下:

CREATE TABLE pg_language

(

lanname name NOT NULL,

lanowner oid NOT NULL,

lanispl boolean NOT NULL,

lanpltrusted boolean NOT NULL,

lanplcallfoid oid NOT NULL,

lanvalidator oid NOT NULL,

lanacl aclitem[]

)

WITH (

OIDS=TRUE

);

OID 是 32 位的量,是在同一个集群内通用的计数器上赋值的。 对于一个大型或者长时间使用的数据库,这个计数器是有可能重叠的。 因此,假设 OID 是唯一的是非常错误的,除非你自己采取了措施来保证它们是唯一的。

XID:事务ID,也是 32 位的量。在长时间运转的数据库里,它也可能会重叠。重叠后数据库就有可能出错,所以需要采取措施解决。 只要我们采取一些合适的维护步骤,这并不是很要命的问题。比如我们定义做vaccum。或者手动重置。

重置用下面的命令:

$ pg_resetxlog –help

pg_resetxlog命令是重置PostgreSQL事务log的。

使用方法:

pg_resetxlog [OPTION]… DATADIR

选项参数:

-e XIDEPOCH 设置下一个事务ID EPOCH

-f 实施强制更新

-l TLI,FILE,SEG 强制设置新事务log的最小WAL开始位置

-m XID 设置下一个MULTI事务ID

-n 不做更新,只是取出现在的控制值,实验用的命令

-o OID 设置下一个OID,重置OID

-O OFFSET 设置下一个MULTI事务ID的OFFSET

-x XID 设置下一个事务ID,重置XID

写了这么一些,对内部是怎么回事感觉自己还是没有理清楚。呵呵!!

您可能感兴趣的文章:解析PostgreSQL中Oid和Relfilenode的映射问题

© 版权声明

相关文章