查看原文
其他

PostgreSQL术语简明指南

xiongcc PostgreSQL学徒
2024-09-29

前言

今天晚上在整理素材的时候,Devrim Gündüz 的 Know the less known about PostgreSQL 议题使我来了兴趣,毕竟了解术语也是掌握 PostgreSQL 的方式之一。内核中有很多晦涩的术语,什么"ring buffer"、"buffer ring"、"tuple"、"row"等等,不说刚入门的小白,老油条看到这些术语也会云里雾里。本文简单聊聊 PostgreSQL 中常见的术语。

You are new-ish, or not used to some of the terms

Glossary

前面作者介绍了什么是 MVCC,相信各位都已十分了解了,在此表过不提。

xact

xact:"Transaction",表示事务,在 PostgreSQL 中,事务状态信息存储在 pg_xact 中,在 10 以前的版本,其命名为 pg_clog,由于其以 "log" 命名,误使很多新手认为它是"日志",一旦删除,只能自求多福了。

txid

txid:"Transaction ID",表示事务 ID,其上限是 32 位无符号整型。对于写入操作,PostgreSQL会分配永久性的事务 ID,而对于只读事务,只会分配虚拟事务 ID,用于节省事务 ID 的资源

这里需要提一点的事,对于查询操作,并不会分配真正的事务 ID,因此我们在做实验的时候,正确的姿势是使用 txid_current_if_assigned,因为 txid_current会真正消耗一个永久事务 ID。

postgres=# create table test(id int);
CREATE TABLE
postgres=# begin;
BEGIN
postgres=*# select txid_current_if_assigned();
 txid_current_if_assigned 
--------------------------
                         
(1 row)

postgres=*# insert into test values(1);
INSERT 0 1
postgres=*# select txid_current_if_assigned();
 txid_current_if_assigned 
--------------------------
                      758
(1 row)

ctid

The physical location of the row version within its table,表示数据位于哪个位置,block number + offset

作者也提到,不要依赖这个值,在 update、vacuum full 的时候都会发生改变

xmin xmax

每一行上都有许多隐藏的系统列,用于判断可见性、获取行的状态信息等。

xmin 和 xmax 分别代表插入某一行的事务 ID、删除或更新某一行的事务 ID

不过要注意的是,并不是 xmax 有值,就表示一定被删除或更新了,比如删除的事务回滚了,其次行级锁也是通过 xmax + infomask 来实现的。

cmin cmax

与xmin和xmax相对,不过是用于控制同一个事务内的可见性判断,典型场景就是游标。

datfrozenxid

All transaction IDs before this one have been replaced with a permanent transaction ID in this database,表示该数据库中最老的已冻结的事务 ID,是 pg_class.relfrozenxid 中的最小值。

multixact

Used to support row locking by multiple transactions,之前我也写文章详细讲过其原理 深度剖析 MultiXactID,将一组事务 ID 记录到一个 MultiXactID 中,进行映射。

MultiXactID 也是 32 位,所以也有类似的参数用于控制冻结

relfrozenxid

和 datfronzenxid 类似,All transaction IDs before this one have been replaced with a permanent (“frozen”) transaction ID in this table,所有小于该事务 ID 的元组都被冻结

WAL

Write Ahead Log,各位应该十分熟悉了,预写日志,用在 PITR/复制/备份恢复等等,对于 unlogged table 和 temp table,不会记录 REDO

WAL 细分为很多个资源管理器

LSN

Log Sequence Number,逻辑序列号,全局唯一标识

LSN 检查仅存在于共享缓冲区管理器中,不存在于临时表使用的本地缓冲区管理器中,因此对临时表的操作不能被 WAL 记录。

注意倒数第二句,比较页面的 LSN 和 WAL 的 LSN,以此达到"幂等"的伪效果。

隐藏参数

作者还提及了许多隐藏参数,默认情况下,postgresql.conf 文件中不包含,主要给开发者使用。

  • allow_system_table_mods (boolean)
  • ignore_checksum_failure (boolean)
  • zero_damaged_pages (boolean)
  • ignore_invalid_pages (boolean)
  • ignore_system_indexes (boolean)
  • post_auth_delay (integer)
  • pre_auth_delay (integer)
  • wal_consistency_checking (string)
  • wal_debug (boolean)
  • backtrace_functions (string)
  • debug_deadlocks (boolean)
  • log_btree_build_stats (boolean)
  • trace_notify (boolean)
  • trace_recovery_messages (enum)
  • trace_sort (boolean)
  • trace_locks (boolean)
  • trace_lwlocks (boolean)
  • trace_userlocks (boolean)
  • trace_lock_oidmin (integer)
  • trace_lock_table (integer)
  • jit_debugging_support (boolean)
  • jit_dump_bitcode (boolean)
  • jit_expressions (boolean)
  • jit_profiling_support (boolean)
  • jit_tuple_deforming (boolean)

更多信息可以参考 https://www.postgresql.org/docs/current/runtime-config-developer.html

只读参数

  • data_checksums (boolean):Initdb , off by default
  • block_size (integer):
  • debug_assertions (boolean):off
  • max_function_args (integer):最大函数参数,100
  • max_identifier_length (integer):最大标识符长度,63 字节
  • max_index_keys (integer):最大索引键,32
  • segment_size (integer)
  • server_encoding (string):initdb, UTF-8
  • server_version (string)
  • server_version_num (integer):150002,160000,比如 120007 代表 12.7 的版本。

参考

Know the less known: A PostgreSQL Glossary

https://www.postgresql.org/docs/current/runtime-config-developer.html


继续滑动看下一个
PostgreSQL学徒
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存