sys_squeeze介绍

sys_squeeze是KingbaseES的一个扩展插件,该组件将提供人工调用命令实现对表dead tuple的清理工作。该组件在清理表空间的过程中,不会全程加排他锁,能保证业务运行期间尽可能不影响对目标表的访问。而 vacuum full也可实现死亡元组占用空间释放,但是缺点是会锁表,阻止业务进行。该插件的实现依赖于逻辑解码,因此使用该插件之前必须保证数据库wal_level等级设置为'logical'。

测试

sys_squeeze使用条件:wal_level = logical
max_replication_slots = 10 # minimum 1
shared_preload_libraries = 'sys_squeeze'
create extension sys_squeeze; 查看扩展插件 test=# \dx sys_squeeze;
List of installed extensions
Name | Version | Schema | Description
-------------+---------+---------+------------------------------------------------
sys_squeeze | 1.4 | squeeze | A tool to remove unused space from a relation.
(1 row)
创建测试表
test=# create table test(id int,c_name varchar(200),primary key(id));
CREATE TABLE 初始化数据
test=# insert into test select generate_series(1,4000000),'tom';
INSERT 0 4000000
查看表大小:169MB
TEST=# \dt+ test
List of relations
Schema | Name | Type | Owner | Size | Description
--------+------+-------+--------+--------+-------------
public | test | table | system | 138 MB |
(1 row)
使用squeeze手工清理语法:
函数接口squeeze.squeeze_table(opt1,opt2,opt3,opt4,opt5) 有5个可配置参数: opt1: 填写所要清理的目标表的模式名,必须项 opt2: 填写所要清理的目标表名,必须项 opt3: 指定该表中已存在的index 名,若指定,会在新生成的表空间中按照此index顺序物理排列tuple,可选项,不指定填null opt4: 指定将新生成的表置入指定的表空间。 可选项,若不指定填null,表示仍然使用原有表空间。 opt5: 将相应index置入指定的表空间。可选项,若不指定填null,表示仍然使用原有表空间。
更新数据
test=# update test set c_name = 'TRE-6' where id <2000000;
UPDATE 1999999 更新后表大小,表已膨胀
TEST=# \dt+ test
List of relations
Schema | Name | Type | Owner | Size | Description
--------+------+-------+--------+--------+-------------
public | test | table | system | 223 MB |
(1 row) 更新数据后查看死亡元祖是1999999:
TEST=# select * from sys_stat_user_tables where relname='test';
relid | schemaname | relname | seq_scan | seq_tup_read | idx_scan | idx_tup_fetch | n_tup_ins | n_tup_upd | n_tup_del | n_tup_hot_upd | n_live_tup | n_dead_tup | n_mod_since_analyze | last_va
cuum | last_autovacuum | last_analyze | last_autoanalyze | vacuum_count | autovacuum_count | analyze_count | autoanalyze_count
-------+------------+---------+----------+--------------+----------+---------------+-----------+-----------+-----------+---------------+------------+------------+---------------------+-----------------
--------------+-------------------------------+--------------+-------------------------------+--------------+------------------+---------------+-------------------
25746 | public | test | 6 | 20000000 | 1 | 1999999 | 4000000 | 5999997 | 0 | 0 | 4000668 | 1999999 | 1999999 | 2023-04-23 16:22
:54.344454+08 | 2023-04-23 16:26:50.718373+08 | | 2023-04-23 16:26:53.339778+08 | 1 | 2 | 0 | 3
(1 row) 示例执行squeeze:可以看到过程中生成了new table,new index,并行relfilenode改变 TEST=# SELECT squeeze.squeeze_table('public', 'test', null, null, null);
NOTICE: Now begin to squeeze the table.
NOTICE: Trying to setup logical decoding.
NOTICE: This step needs acquire lock and may be block if there is long time not ending transaction,if this step is not done in a long time(e.g. 1min) please cancel the session and try again when the transaction is end.
NOTICE: Setup logical decoding done.
NOTICE: Now create transient table.
NOTICE: New table 'test' locates at [base/12145/25751]
NOTICE: Now cp the data to new created table.
NOTICE: Now create index on the new created table.
NOTICE: New index 'test_pkey' locates at [base/12145/25754].
NOTICE: Now process the concurrent changes via logical decoding.
NOTICE: The data has been moved to new table, now release the replication slot.
NOTICE: Now swap the filenode.
NOTICE: Delete the old table.
NOTICE: The squeeze process is done.
squeeze_table
--------------- (1 row)
表膨胀占用空间已被释放
TEST=# \dt+ test
List of relations
Schema | Name | Type | Owner | Size | Description
--------+------+-------+--------+--------+-------------
public | test | table | system | 154 MB |
(1 row)
squeeze后死亡元祖已清空
TEST=# select * from sys_stat_user_tables where relname='test';
relid | schemaname | relname | seq_scan | seq_tup_read | idx_scan | idx_tup_fetch | n_tup_ins | n_tup_upd | n_tup_del | n_tup_hot_upd | n_live_tup | n_dead_tup | n_mod_since_analyze | last_va
cuum | last_autovacuum | last_analyze | last_autoanalyze | vacuum_count | autovacuum_count | analyze_count | autoanalyze_count
-------+------------+---------+----------+--------------+----------+---------------+-----------+-----------+-----------+---------------+------------+------------+---------------------+-----------------
--------------+-------------------------------+--------------+-------------------------------+--------------+------------------+---------------+-------------------
25746 | public | test | 5 | 16000000 | 1 | 1999999 | 4000000 | 3999998 | 0 | 0 | 4000668 | 0 | 0 | 2023-04-23 16:22
:54.344454+08 | 2023-04-23 16:26:50.718373+08 | | 2023-04-23 16:26:53.339778+08 | 1 | 2 | 0 | 3
(1 row)

总结

sys_squeeze需要使用logical replication,所以需要设置足够的slots,而且必须注意可能与standby或者使用了逻辑复制功能争抢slots复制槽,要保证slots足够用。

虽然sys_squeeze可以自动收缩,但对于比较繁忙的数据库,建议不要在业务高峰期启用,避免对业务带来性能损耗风险。

注意sys_squeeze插件的使用条件,尤其确保表具有主键或唯一约束。这是处理sys_squeeze工作时的必要条件。

KingbaseES V8R6 sys_squeeze 使用的更多相关文章

  1. KingbaseES V8R6集群维护案例之--单实例数据迁移到集群案例

    案例说明: 生产环境是单实例,测试环境是集群,现需要将生产环境的数据迁移到集群中运行,本文档详细介绍了从单实例环境恢复数据到集群环境的操作步骤,可以作为生产环境迁移数据的参考. 适用版本: Kingb ...

  2. KingbaseES V8R6集群维护案例之---停用集群node_export进程

    案例说明: 在KingbaseES V8R6集群启动时,会启动node_exporter进程,此进程主要用于向kmonitor监控服务输出节点状态信息.在系统安全漏洞扫描中,提示出现以下安全漏洞: 对 ...

  3. KingbaseES V8R6集群维护案例之---将securecmdd通讯改为ssh案例

    案例说明: 在KingbaseES V8R6的后期版本中,为了解决有的主机之间不允许root用户ssh登录的问题,使用了securecmdd作为集群部署分发和通讯的服务,有生产环境通过漏洞扫描,在88 ...

  4. KingbaseES V8R6集群部署案例之---Windows环境配置主备流复制(异机复制)

    案例说明: 目前KingbaseES V8R6的Windows版本不支持数据库sys_rman的物理备份,可以考虑通过建立主备流复制实现数据库的异机物理备份.本案例详细介绍了,在Windows环境下建 ...

  5. KingbaseES V8R6集群部署案例之---Windows环境配置主备流复制(同一主机)

    案例说明: 目前KingbaseES V8R6的Windows版本不支持数据库sys_rman的物理备份,可以考虑通过建立主备流复制实现数据库的异机物理备份.本案例详细介绍了,在Windows环境下建 ...

  6. KingbaseES V8R6兼容Oracle的exp-imp导出导入工具使用

    说明: KingbaseES V8R6版本中的兼容Oracle的exp-imp导入导出工具,支持完全模式.用户模式和表模式的导出功能. 本次案例数据库版本: test=# select version ...

  7. KingbaseES V8R6集群管理运维案例之---repmgr standby switchover故障

    案例说明: 在KingbaseES V8R6集群备库执行"repmgr standby switchover"时,切换失败,并且在执行过程中,伴随着"repmr stan ...

  8. KingbaseES V8R6备份恢复案例之---同一数据库创建不同stanza备份

    案例说明: 在生产环境,有的应用需要调用数据库的sys_rman做备份,为了区分数据库自身的sys_rman备份和应用的备份,可以使用不同的stanza name创建备份.本案例介绍了,如何在King ...

  9. kingbaseES V8R6集群备份恢复案例之---备库作为repo主机执行物理备份

    ​ 案例说明: 此案例是在KingbaseES V8R6集群环境下,当主库磁盘空间不足时,执行sys_rman备份,将集群的备库节点作为repo主机,执行备份,并将备份存储在备库的磁盘空间. 集群架构 ...

  10. KingbaseES V8R6备份恢复案例之--删除test数据库后sys_backup.sh备份

    案例说明: KingbaseES V8R6通过sys_backup.sh执行物理备份,默认sys_backup.sh执行备份初始化时,需要连接test数据库进行身份的认证:在一些生产环境为了安全需求, ...

随机推荐

  1. win32 - Screen to bmp file(BYTE)

    void WINAPI CaptureScreenIntoFile() { BITMAPFILEHEADER bfHeader; BITMAPINFOHEADER biHeader; HGDIOBJ ...

  2. 细说Spring Boot初始化DispatcherServlet

    DispatcherServlet概述 在Spring Boot框架未出现之前,要开发一个基于Spring MVC框架的项目,通常需要在Java web项目的描述符文件web.xml中添加如下配置: ...

  3. 文心一言 VS 讯飞星火 VS chatgpt (201)-- 算法导论15.2 6题

    六.用go语言,证明:对 n 个元素的表达式进行完全括号化,恰好需要 n-1 对括号. 文心一言,代码正常运行: 在Go语言中,证明对n个元素的表达式进行完全括号化恰好需要n-1对括号,可以通过数学归 ...

  4. lock锁,Semaphore信号量,Event事件,进程队列Queue,生产者消费者模型,JoinableQueue---day31

    1.lock锁 # ### 锁 lock from multiprocessing import Process,Lock import json,time # (1) lock的基本语法 " ...

  5. NodeJS本地公用类库

    git + npm link 先来看一下npm install 文档. npm 支持安装 git 仓库,支持 git , git+ssh , git+http , git+https , or git ...

  6. 【Azure 应用服务】azure function powershell 调用 New-AzADServicePrincipal -DisplayName $sp -PasswordCredential $spCred

    问题描述 powershell 调用New-AzADServicePrincipal -DisplayName $sp -PasswordCredential $spCred,出现如下错误: Reso ...

  7. 如何运维多集群数据库?58 同城 NebulaGraph Database 运维实践

    图计算业务背景介绍 我们为什么选择 NebulaGraph? 在公司各个业务线中,有不少部门都有着关系分析等图探索场景,随着业务发展,相关的需求越来越多.大量需求使用多模数据库来实现,开发成本和管理成 ...

  8. Java // 使用二维数组打印 10 行杨辉三角

    1 // 使用二维数组打印 10 行杨辉三角 2 public static void main(String[] args) 3 { 4 //1.声明 并初始化二维数组 5 int[][]yangh ...

  9. xxl-job的基本使用

    xxl-job的基本使用 xxl-job是分布式的调度平台调度执行器执行任务,使用的是DB锁(for update)来保证集群分布式调用的一致性,学习简单,操作容易,成本不高. 准备阶段 服务端配置 ...

  10. PowerShell alias - cmd中设置别名 快捷的执行命令

    Step. 1: 发现需求 最近学nest.js发现,都是用命令创建工程文件,然后教程里面都是用的快捷命令 比如 pd = pnpm run dev pb = pnpm run build 但是我这里 ...