现在的位置: 首页 > 综合 > 正文

PostgreSQL中的OID和XID

2013年10月08日 ⁄ 综合 ⁄ 共 939字 ⁄ 字号 评论关闭

在PostgreSQL中经常碰到OID和XID,刚才不明白这些东西是干什么的。

  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

 

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

抱歉!评论已关闭.