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,新的统计信息有了最后一次的完成时间。

时间: 2024-09-19 23:18:01

pg_squeeze简单使用的相关文章

Win 8照片应用欣赏与简单编辑图片

在Win8照片应用中点击想要访问的分类,进入照片预览界面,为方便触控屏用户,Win8采用了横向浏览的方式,我们可以看到多个文件夹,触控屏用户只要滑动手指就能顺畅预览精美图片,鼠标操作可以滑动滚轮,操作都非常方便. 如果需要放大和缩小浏览图片,触控屏用户可以用手指开合来轻松操控,键鼠用户可以点击界面右下角的"+/-"按钮,或者用"Ctrl+鼠标滚轮"灵活缩放图片视图. Win8照片应用缺省按文件夹浏览,在文件夹浏览界面中,点击鼠标右键,屏幕下方会弹出几个选项:按日期浏

ps设计中国水墨风简单的烟雾骏马海报效果

  ps设计中国水墨风简单的烟雾骏马海报效果!简单粗暴,几步即可完成,不管是景观.动物.还是人物都适用,非常棒的设计参考 分类: PS入门教程

简单介绍Python2.x版本中的cmp()方法的使用

  这篇文章主要介绍了简单介绍Python2.x版本中的cmp()方法的使用,然而该方法在Python3.x版本中已并不再内置...需要的朋友可以参考下 cmp()方法比较两个列表的元素. 语法 以下是cmp()方法的语法: ? 1 cmp(list1, list2) 参数 list1 -- 这是要进行比较的第一个列表 list2 -- 这是要进行比较的第二个列表 返回值 如果元素是相同类型的,执行比较,并返回结果.如果元素是不同的类型,检查,看看他们是否是数字 如果是数字必要时强制进行数字比较

ajax同步异步的简单实现

本文为大家介绍下ajax同步异步的简单实现,感兴趣的朋友可以参考下 复制代码 代码如下: $("#btn_saveFWSB").click(function(){  var obj=checkData(arr);  if(obj.flag==true){  hideAddDiv();  $.ajax({  type : "POST",  url : "/vts/doInsertFWZT.do",  async: false ,//ajax同步 

php使用curl简单抓取远程url的方法

 这篇文章主要介绍了php使用curl简单抓取远程url的方法,涉及php操作curl的技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了php使用curl抓取远程url的方法.分享给大家供大家参考.具体如下: cURL是一个非常有用的php库,可以用来连接不通类型的服务器和协议,下面是一个最基本的范例用来抓取远程网页 ? 1 2 3 4 5 6 <?php $c = curl_init('http://www.w3mentor.com/robots.txt'); curl

php简单实现加减乘除计算器

 加减乘除计算器想必大家都有使用过吧,本文为大家介绍下使用php如何实现,下面有个不错的示例,感兴趣的朋友可以参考下 用php实现加减乘除计算器.代码很简单哦!  代码如下: <?php  header("content-type:text/html;charset=utf-8");  session_start();  ?>  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&quo

详细图解Win7安装完成后简单优化教程

1.首先,调整下语言选项栏.去除"EN".挪到任务栏右边. 点击最小化→点击三角弹出菜单→点击"任务栏中的其他图标"以取消勾选. 2.关闭UAC.UAC是啥?见百科. 如果你只是一个电脑菜鸟,不建议你关闭UAC,因为你不一定对木马.病毒有充份的防范!不要在意那点提示,看起来是比较烦,其实它是善意的!就像你年迈的父母一样的唠叨,不是么? 当然,如果你是一位老鸟,有足够的能力,那就另当别论了~ 关闭步骤如图. 3.删除"操作中心"图标,即那个讨厌的小

PHP+HTML简单实现BBS论坛与回帖

        本文主要讲述如何通过PHP+HTML简单实现BBS论坛和发帖/回帖的功能,这是提取我们php项目的部分内容.主要内容包括:         1.通过JavaScript和Iframe实现局部布局界面         2.PHP如何定义类实现访问数据库功能         3.实现简单的BBS论坛和发帖/回帖功能         由于这个项目是十个人在寒假完成,所以采用了SAE搭建在线的后台数据库,其他人在通过Apache本地设计网页.访问数据库的方法实现,相当于简单的BS三端访问

简单实现一个.net分页控件

最近写了一个.net的分页控件,放到园子里...你觉得好,就点个赞,不好呢,就告诉我为啥吧.... 是使用Request.QueryString的.... 参数: public int currentPageIndex = 0;//当前页数 public int pagesize = 16;//每页显示的条数 public int pagecount = 0;//页数 public int rowscount = 0;//总条数 public string prevtext = "前一页&quo