pg_surgery
更新时间:2024-07-01 14:39:41
pg_surgery 插件描述
AntDB 支持 pg_surgery 扩展, 该扩展提供了两个函数:
- heap_force_freeze - 强制要冻结 tuple
- heap_force_kill - 强制删除 tuple
使用准备
- 修改配置文件后重启数据库
# 修改postgresql.conf文件
shared_preload_libraries = 'credcheck'
- 登陆数据库,执行 SQL 命令,创建扩展
CREATE EXTENSION pg_surgery;
使用方法
使用 \dx+ pg_surgery 可以查看 pg_surgery 下的两个函数:
# 查看pg_surgery下的两个函数
antdb=# \dx+ pg_surgery
Objects in extension "pg_surgery"
Object description
--------------------------------------------
function heap_force_freeze(regclass,tid[])
function heap_force_kill(regclass,tid[])
(2 rows)
函数介绍:
heap_force_kill(regclass, tid[]) returns void
:
该函数在未检查元组的情况下将“已用”行指针标记为“已死”。此函数的预期用途是强制删除无法访问的元组。
heap_force_freeze(regclass, tid[]) returns void
:
该函数在不检查元组数据的情况下将元组标记为冻结。此函数的预期用途是生成可访问的元组,这些元组由于可见性信息损坏而无法访问,或者由于可见性信息丢失而无法成功清空表。
使用范例:
# 创建测试表格并插入数据
antdb=# CREATE TABLE t_surgery(id int);
CREATE TABLE
antdb=# INSERT INTO t_surgery SELECT generate_series(1,5);
INSERT 0 5
antdb=# SELECT xmin, ctid, id FROM t_surgery ;
xmin | ctid | id
------+-------+----
1327 | (0,1) | 1
1327 | (0,2) | 2
1327 | (0,3) | 3
1327 | (0,4) | 4
1327 | (0,5) | 5
(5 rows)
# freeze单个ctid
antdb=# SELECT heap_force_freeze('test_surgery'::regclass, array[ '(0,1)' ]::tid[]);
heap_force_freeze
-------------------
(1 row)
antdb=# SELECT xmin, ctid, id FROM t_surgery ;
xmin | ctid | id
------+-------+----
2 | (0,1) | 1
1327 | (0,2) | 2
1327 | (0,3) | 3
1327 | (0,4) | 4
1327 | (0,5) | 5
(5 rows)
# freeze多个ctid
antdb=# SELECT heap_force_freeze('t_surgery'::regclass, array[ '(0,2)', '(0,5)' ]::tid[]);
heap_force_freeze
-------------------
(1 row)
antdb=# SELECT xmin, ctid, id FROM t_surgery ;
xmin | ctid | id
------+-------+----
2 | (0,1) | 1
2 | (0,2) | 2
1327 | (0,3) | 3
1327 | (0,4) | 4
2 | (0,5) | 5
(5 rows)
# 删除单个ctid tuple
antdb=# SELECT heap_force_kill('t_surgery'::regclass, array[ '(0,1)' ]::tid[]);
heap_force_kill
-----------------
(1 row)
antdb=# SELECT xmin, ctid, id FROM t_surgery ;
xmin | ctid | id
------+-------+----
2 | (0,2) | 2
1327 | (0,3) | 3
1327 | (0,4) | 4
2 | (0,5) | 5
(4 rows)
# 删除多个ctid tuple
antdb=# SELECT heap_force_kill('t_surgery'::regclass, array[ '(0,3)', '(0,5)' ]::tid[]);
heap_force_kill
-----------------
(1 row)
antdb=# SELECT xmin, ctid, id FROM t_surgery ;
xmin | ctid | id
------+-------+----
2 | (0,2) | 2
1327 | (0,4) | 4
(2 rows)
问题反馈