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的定义、基本概念以及其核心特性,更好地理解这一开源数据库产品。
1454 5
|
5月前
|
存储 运维 安全
OSS安全合规实战:金融行业敏感数据加密+KMS自动轮转策略(满足等保2.0三级要求)
金融行业OSS面临等保2.0、行业监管及数据泄露三重合规挑战,存在存储加密不足、密钥轮转滞后、访问控制不当等问题。本文提出分层加密架构,结合服务端KMS与客户端加密,设计自动密钥轮转机制,实现高性能与合规兼顾,并提供故障排查与成本优化方案,助力金融机构安全落地OSS应用。
279 1
|
11月前
|
监控 开发工具 Android开发
ARMS 用户体验监控正式发布原生鸿蒙应用 SDK
阿里云 ARMS 用户体验监控(RUM)推出了针对原生鸿蒙应用的 SDK。SDK 使用 ArkTS 语言开发,支持页面采集、资源加载采集、异常采集及自定义采集等功能,能够全面监控鸿蒙应用的表现。集成简单,只需几步即可将 SDK 接入项目中,为鸿蒙应用的开发者提供了强有力的支持。
607 103
|
存储 运维 Linux
Docker详解(十)——Docker容器CPU资源限额配置
Docker详解(十)——Docker容器CPU资源限额配置
628 3
|
存储 大数据 定位技术
大数据 数据索引技术
【10月更文挑战第26天】
345 3
|
设计模式 应用服务中间件 容器
【Tomcat源码分析】Pipeline 与 Valve 的秘密花园
本文深入剖析了Tomcat中的Pipeline和Valve组件。Valve作为请求处理链中的核心组件,通过接口定义了关键方法;ValveBase为其基类,提供了通用实现。Pipeline则作为Valve容器,通过首尾相连的Valve链完成业务处理。StandardPipeline实现了Pipeline接口,提供了详细的Valve管理逻辑。通过对代码的详细分析,揭示了模板方法模式和责任链模式的应用,展示了系统的扩展性和模块化设计。
【Tomcat源码分析】Pipeline 与 Valve 的秘密花园
|
搜索推荐 API 定位技术
解锁携程美食与景点数据接口:打造个性化旅行体验的秘密武器
携程API助您探索旅游信息,虽无专门“美食列表”接口,但可通过景点详情接口获取周边美食推荐。结合地图或餐饮API,丰富美食数据一手掌握。景点列表接口帮助搜索景点详情,包括名称、位置等。使用流程包括注册账号、获取密钥、构造请求及解析响应数据。记得查阅最新文档,确保合规使用。体验API:[链接]。
|
Java 数据库连接 API
数据库与Java的无缝对接:Hibernate与JPA的集成与应用
【6月更文挑战第25天】Java企业级应用中,Hibernate和JPA是ORM主流框架。JPA是标准API,定义对象-关系映射规范,强调标准化和可移植性。Hibernate是JPA的具体实现,扩展了更多功能,如强大的查询语言和缓存机制。两者集成允许开发者利用Hibernate性能,通过JPA注解保持代码规范。示例展示了如何使用JPA注解定义实体和Hibernate执行查询,实现数据库操作。这种方式提升了开发效率和应用质量。
243 0
|
云安全 机器学习/深度学习 弹性计算
|
存储 弹性计算 大数据
从大数据平台CDP的架构看大数据的发展趋势 1
从大数据平台CDP的架构看大数据的发展趋势
下一篇
oss云网关配置