pg_squeeze简单使用

简介: pg_squeeze简单使用

概述
一般当一个表膨胀时一般使用vacuum full或者cluster进行表重建,在这一过程中会加排他锁,导致该表无法进行读写,只有等整个过程完成后才可以进行正常使用。
pg_squeeze就是来解决这个问题的,它只会在最后切换filenode的过程中加锁,其他过程中是不影响读写的。
安装
下面说下安装pg_squeeze需要注意的地方:
1.先配置好PG_CONFIG就是命令pg_config的路径。
2.make 和 make install。
3.配置postgresql.conf的几个参数,因为这个要使用逻辑复制来实现增量重组的所以要配置
wal_level=logical; max_replication_slots=1(最少大于1);shared_preload_libraries='pg_squeeze'
4.create extension pg_squeeze。
使用
首先创建表,表中必须要有一个主键或者是唯一键。
postgres=# create table a(id int primary key);
CREATE TABLE
postgres=# insert into a select generate_series(1,2000000);
INSERT 0 2000000
安装完这个插件后,你会看到多了一些表和函数,我们重点说一下squeeze.tables这个表
postgres=# dt squeeze.
              List of relations

 Schema Name Type Owner
 squeeze errors table postgres
 squeeze log table postgres
 squeeze tables table postgres
 squeeze tables_internal table postgres
 squeeze tasks table postgres

(5 rows)

postgres=# d squeeze.tables
                                          Table "squeeze.tables"
      Column | Type | Modifiers


 id | integer | not null default nextval('squeeze.tables_id_seq'::regcla
ss)
 tabschema | name | not null
 tabname | name | not null
 clustering_index | name |
 rel_tablespace | name |
 ind_tablespaces | name[] |
 task_interval | interval | not null default '01:00:00'::interval
 first_check | timestamp with time zone | not null
 free_space_extra | integer | not null default 50
 min_size | real | not null default 8
 vacuum_max_age | interval | not null default '01:00:00'::interval
 max_retry | integer | not null default 0
 skip_analyze | boolean | not null default false
Indexes:
    "tables_pkey" PRIMARY KEY, btree (id)
    "tables_tabschema_tabname_key" UNIQUE CONSTRAINT, btree (tabschema, tabname)
Check constraints:
    "tables_free_space_extra_check" CHECK (free_space_extra >= 0 AND free_space_extra < 100)
    "tables_min_size_check" CHECK (min_size > 0.0::double precision)
    "tables_task_interval_check" CHECK (task_interval >= '00:01:00'::interval)
Referenced by:
    TABLE "squeeze.tables_internal" CONSTRAINT "tables_internal_table_id_fkey" FOREIGN KEY (table_id) R
EFERENCES squeeze.tables(id) ON DELETE CASCADE
    TABLE "squeeze.tasks" CONSTRAINT "tasks_table_id_fkey" FOREIGN KEY (table_id) REFERENCES squeeze.ta
bles(id) ON DELETE CASCADE
Triggers:
    tables_internal_trig AFTER INSERT ON squeeze.tables FOR EACH ROW EXECUTE PROCEDURE squeeze.tables_i
nternal_trig_func()
如果要使用pg_squeeze重建表需要插入一条记录进入到squeeze.tables这个表中,最简单的例子就是:insert into squeeze.tables(tabschema,tabname,first_check) values('public','a',now());
下面说下这个表中的字段的含义。
tabschema:就是表的模式名。
tabname:表示表名。
clustering_index:表示重建表时,表数据的物理顺序按照该索引进行聚簇。
rel_tablespace:表示表重建时,移动到哪个表空间中。
ind_tablespace:这个一个二维数组,表示索引和表空间的映射关系。
task_interval:表示两个任务相隔的最小时间,默认是1小时。
first_check:表示第一次统计时间。
free_space_extra:表示空闲空间超过多少时就会对表进行重建,默认是50。
vacuum_max_age:当进行一次vacuum后,认为fsm是有效的最大时间,默认1小时。
max_retry:当重建表失败时最大的重新尝试的次数,默认是0.
skip_analyse:跳过对表进行analyse,默认是false。
启动pg_squeeze的进程需要调用:SELECT squeeze.start_worker();
关闭pg_squeeze的进程需要调用:SELECT squeeze.stop_worker();
默认pg_squeeze进程进行检查是否重建表的时间由squeeze.worker_naptime这个参数来决定,默认时间是1分钟。
可以设置squeeze.max_xlock_time控制最大占用锁的时间。
简单例子
postgres=# insert into squeeze.tables
postgres-# (tabschema,tabname,first_check,free_space_extra)
postgres-# values('public','a',now(),20);
INSERT 0 1
postgres=# select squeeze.start_worker();

 start_worker

         1009
(1 row)

postgres=# select * from squeeze.tables_internal;

 table_id class_id class_id_toast free_space last_task_created last_task_finished
        5 71866 0 0.346762447033898

(1 row)
我们往squeeze.tables插入了一条记录,如果空闲空间大于20%就会重建表,查询squeeze.tables_internal,空闲空间是0.34,下面模拟空闲空间超过20%的情况。
postgres=# dt+ a
                   List of relations

 Schema Name Type Owner Size Description
 public a table postgres 69 MB

(1 row)

postgres=# delete from a where id<500000;
DELETE 499999
postgres=# select * from squeeze.tables_internal;

 table_id class_id class_id_toast free_space last_task_created last_task_finished
        5 71866 0 0.346762447033898

(1 row)

postgres=# select * from squeeze.tables_internal;

 table_id class_id class_id_toast free_space last_task_created last_task_finished
        5 71866 0 0.346762447033898

(1 row)

postgres=# select * from squeeze.tables_internal;

 table_id class_id class_id_toast free_space last_task_created last_task_finished
        5 71866 0 22.2685491701977

(1 row)

postgres=# dt+ a
                   List of relations

 Schema Name Type Owner Size Description
 public a table postgres 52 MB

(1 row)

postgres=# select * from squeeze.tables_internal;
 table_id | class_id | class_id_toast | free_space | last_task_created | last_task_finished


        5 | 71866 | 0 | 0.354176768699156 | | 2017-01-01 23:14:40.034
685+08
(1 row)
开始前表大小是69M,delete了50W条数据,如果是正常情况,delete后的空间是不会释放的,用了插件后,更新完统计信息后获得free_space=22.26大于我们设定的20,所以对表进行重建,之后发现表的大小变成了52M,新的统计信息有了最后一次的完成时间。

目录
相关文章
|
存储 SQL 弹性计算
TiDB概述:定义与基本概念
【2月更文挑战第25天】TiDB是一款高性能、分布式的关系型数据库,它采用Go语言开发,兼容MySQL协议和生态,能够为用户提供强大的数据存储和查询能力。本文将详细介绍TiDB的定义、基本概念以及其核心特性,更好地理解这一开源数据库产品。
1642 5
|
7月前
|
Ubuntu Linux 测试技术
Linux系统离线安装Docker完整指南
本文详细介绍在Ubuntu 24等Linux系统中离线安装Docker的完整流程,适用于内网隔离环境。涵盖安装包下载、`docker.service`配置、安装与卸载脚本编写、权限设置、镜像测试及用户组配置,并包含docker-compose的离线部署方法,助力高效完成生产环境搭建。
9622 4
Linux系统离线安装Docker完整指南
|
开发者 Docker 容器
DockerFile的ADD和COPY的区别
DockerFile的ADD和COPY的区别
5727 0
|
3月前
|
人工智能 测试技术 API
阿里云 MSE AI Registry 公测开启:给你的 AI 资产一个专属的注册中心
AI Registry 公测开启,一文了解产品能力、AgentLoop 集成与 Skill 规划。
546 46
|
4月前
|
人工智能 安全 API
龙虾AI🦞OpenClaw保姆级实战手册:阿里云/本地部署步骤+百炼Coding Plan API配置安全使用避坑指南
2026年开年,开源AI智能体OpenClaw因红色龙虾图标被网友亲切称为「龙虾」,迅速在科技圈和币圈掀起热潮,其GitHub星标数狂飙至21.8万+,跻身总榜第14位,成为现象级的AI工具。这款被定义为「私人AI小秘书」的智能体,打破了传统AI助手仅能「回答问题」的局限,可无缝对接微信、飞书、Telegram等全平台通信工具,支持语音对话与实时面板操控,真正实现了「指令下达,落地执行」的核心能力。但随着工业和信息化部网络安全威胁和漏洞信息共享平台发出安全预警,以及人民日报的温馨提醒,如何正确使用OpenClaw、规避安全风险,同时完成阿里云与本地多系统的部署配置
1219 17
|
人工智能 运维 安全
AI大模型运维开发探索第四篇:智能体分阶段演进路线
本文探讨了智能体工程的演进历程,从最初的思维链(智能体1.0)到实例化智能体(智能体2.0),再到结构化智能体(智能体3.0),最终展望了自演进智能体(智能体4.0)。文章详细分析了各阶段遇到的问题及解决策略,如工具调用可靠性、推理能力提升等,并引入了大模型中间件的概念以优化业务平台与工具间的协调。此外,文中还提到了RunnableHub开源项目,为读者提供了实际落地的参考方案。通过不断迭代,智能体逐渐具备更强的适应性和解决问题的能力,展现了未来AI发展的潜力。
|
数据可视化 Ubuntu 数据挖掘
linux中使用R语言
R语言是一种专用于统计计算和数据分析的编程语言,以其强大的数据处理能力和丰富的可视化功能著称。在Linux中安装R非常简单,通过`sudo apt install r-base`即可完成。R支持基本数据分析和复杂的数据可视化,如使用ggplot2包绘制精美图形。此外,R还能生成甘特图等项目管理工具,帮助清晰展示项目进度。无论是数据处理还是可视化,R都表现出色,适合各种数据分析任务。
834 3
|
人工智能 搜索推荐 机器人
详解:Grok 3 官网入口_Grok 3国内中文版在线使用
Grok是xAI于2023年11月推出的创新型语言模型,它可不是一般的聊天机器人
|
存储 运维 安全
OSS安全合规实战:金融行业敏感数据加密+KMS自动轮转策略(满足等保2.0三级要求)
金融行业OSS面临等保2.0、行业监管及数据泄露三重合规挑战,存在存储加密不足、密钥轮转滞后、访问控制不当等问题。本文提出分层加密架构,结合服务端KMS与客户端加密,设计自动密钥轮转机制,实现高性能与合规兼顾,并提供故障排查与成本优化方案,助力金融机构安全落地OSS应用。
752 1