在渣滓数据清算方面 这个工具恐怕曾经施展到了极致!

pg_squeeze 简介

它是一个 PostgreSQL 裁减,用于删除表中未经常使用的空间,并可选用依据特定索引对元组启动排序(就像在惯例读/写运转的同时,口头CLUSTER命令一样)。理想上,pg_squeeze 试图用来交流pg_repack裁减。

虽然提供的性能十分相似,但pg_squeeze驳回了不同的方法:

1. 齐全在服务端成功性能。

2. 应用 PostgreSQL 数据库主机最新提供的才干。

与同时经常使用了服务端和客户端代码的pg_repack相比,(1) 不只简化了性能和经常使用,还可以经常使用后盾上班进程顺利成功智能化解决。

至于 (2),除了经常使用后盾上班进程,一个关键的区别是,咱们经常使用逻辑解码而不是触发器来捕捉并发的修正。

注销表启动惯例解决

首先,确保您的表具备主键或惟一解放。这是在pg_squeeze上班时解决其余事务或许启动的更改所必需的。

要让pg_squeeze裁减知道该表,须要在squeeze.tables表中拔出一条记载。在参与后,它会活期审核表上的统计消息。只需表满足"收缩"规范,就会向队列中参与一个"义务"。义务会依照创立的顺序依次解决。

最便捷的"注销"是这样的:

  squeeze tabschema tabname schedule       

还可以选用指定其余的列,例如:

  squeeze tabschematabnameschedulefree_space_extravacuum_max_agemax_retry

以下是表的元数据的完整描画。

•tabschema和tabname区分是形式名和表名。

•schedule列会指定什么时刻应该对表启动审核,并或许启动收缩。schedule 由上方的复合数据类型的值来描画,相似于一个 crontab 条目:

  schedule  minuteshoursdays_of_month dommonthsdays_of_weekdow

在这里,minutes(0-59)和hours(0-23)指定了一天内的审核时期,而days_of_month(1-31)、months(1-12)和days_of_week(0-7,其中 0 和 7 都代表星期日)则选择了审核的日期。假设minute、hour和month都与时期戳相婚配,则会口头审核,而 NULL 值区分示意恣意分钟、小时和月份。至于days_of_month和days_of_week,须要至少有一个与时期戳婚配,或许两个都为 NULL,才干启动审核。例如,上方的条目通知咱们,应在每周三和周五的 22:30 审核表public.bar。

•free_space_extra是触宣布解决所需的extra free space的最小百分比。extra描画词指的是,从fillfactor失掉的闲暇空间,并不会触宣布的收缩。例如,假设fillfactor等于 60,那么在反常运转时期,每个页面至少应有 40% 的空间是可用的。假设要让 pg_squeeze 解决到表的可用空间能到达 70%,可将free_space_extra设置为 30(即 70% 的可用空间减去因fillfactor而发生的 40% 可用空间)。free_space_extra的自动值为 50。

•min_size是表必需占用的最小磁盘空间(以 MB 为单位)。自动值为 8。

•vacuum_max_age是自上一次性 VACUUM 成功后,以为闲暇空间映射表(FSM)已清算的最长时期。一旦过了这个时时期隔,死元组的比例或许会很大,因此须要破费比便捷审核 FSM 更多的精神,来评价pg_squeeze的潜在影响 。自动值为 1 小时。

•max_retry是在相应义务第一次性解决失败后,额外尝试收缩表的最大次数。重试解决的典型要素是在收缩表时,表定义出现了更改。假设到达重试次数,则以为表的解决曾经成功。一旦抵达下一个预约时期,就会立刻创立下一个义务。max_retry的自动值为 0(即不重试)。

•clustering_index是解决过的表的现有索引。解决成功后,表中的元组将依据该索引的键启生物理排序。

•rel_tablespace是表应移动到的现有表空间。NULL 示意表应留在原处。

•ind_tablespaces是一个二维数组,其中每一行都指定了索引的表空间映射。第一列和第二列区分代表索引称号和表空间称号。一切未指定映射的索引都将保管在原来的表空间中。对于表空间,有一种不凡状况值得一提:假设为表指定了表空间,但没有为索引指定表空间,则表会被移动到该表空间,但索引会保管在原来的表空间(也就是说,表的表空间不是索引的自动表空间)。

•skip_analyze示意在表解决之后不应口头 ANALYZE 命令。自动值为false,示意自动口头 ANALYZE。

squeeze.table是用户惟一应该修正的表。假设您想修正其余表,请确保您齐全明确自己在做什么。

对任何表启动暂时解决

也可以在不注销的状况下手动收缩表(即无需在squeeze.tables中拔出相应的记载),并且无需事前审核实践收缩的状况。

函数签名:

squeezesqueeze_tabletabchema nametabname nameclustering_index namerel_tablespace nameind_tablespaces name

口头样例:

 squeezesqueeze_table 

启用/禁用表的解决

要解决收缩的表,请以超级用户运转此语句:

 squeezestart_worker

该函数会启动一个后盾上班进程(scheduler worker),活期审核有哪些已注销的表须要启动收缩审核,并为每个表创立一个义务。只需特定数据库存在义务,就会启动另一个上班进程(squeeze worker)。

假设数据库已在运转scheduler worker,函数不会报错,但新的上班进程会立刻分开。

假设有上班进程正在数据库中运转,可以经常使用上方语句中止它们:

 squeezestop_worker

只要本文档中提到的函数才应视为用户接口。假设您想调用其余函数,请确保您齐全明确自己在做什么。

假设宿愿后盾上班进程在整个 PostgreSQL 实例启动时智能启动,请在postgresql.conf文件中参与如下条目:

squeezeworker_autostart  squeezeworker_role  postgres

下次启动实例时,将为my_database启动两个或多个上班进程(即一个scheduler worker,和一个或多个squeeze workers),并为your_database启动雷同的上班进程。请留意,假设您驳回这种方法并满足上方任一条件,任何上班进程都会拒绝启动,或许中止而不做任何上班:

1.pg_squeeze裁减不存在于数据库中,或

2.squeeze.worker_role参数指定了不具备超级用户权限的角色。

虽然实践上有两个上班进程,但上述函数/性能变量经常使用了复数方式的worker。这是由于在以前的 pg_squeeze 版本中只要一个上班进程,它同时担任义务的调度和口头。在更新环节中,强迫一切用户调整性能文件或许并不值得。

控制对其余后端进程的影响

虽然被收缩的表在大局部时期里都可以被其余事务读写,但它在成功解决时须要失掉排他锁。假设 pg_squeeze 偶然看下来阻塞了对表的访问,可以思考设置 GUC 参数squeeze.max_xlock_time。例如:

 squeezemax_xlock_time  

设置排他锁的坚持时期不应超越 0.1 秒(100 毫秒)。假设最后阶段须要更多时期,pg_squeeze 会监禁排他锁,解决两边其余事务提交的更改,并再次尝试最后阶段。假设再次超越锁的继续时期,就会报错。假设出现这种状况,要么参与设置,要么将解决疑问表的时期布置在写入优惠较少的另一天。

每个数据库运转多个上班进程

假设以为单个收缩上班进程不可接待负载,可思考将squeeze.workers_per_database性能变量的值设置为大于 1。这样,pg_squeeze裁减就能同时解决多个表,每个收缩上班进程解决一个表。不过,请留意这一设置会影响一切经常使用pg_squeeze裁减的数据库。实例中一切收缩上班进程(包括"调度上班进程")的总数,不能超越内核性能变量max_worker_processes。

监控

•squeeze.log表中,每个成功收缩的表都会蕴含一个条目。tabschema和tabname这两列标识解决的表。started和finished这两列标识解决的开局和成功时期。ins_initial是在 "初始加载阶段 "拔出到新表存储中的元组数,即解决开局前表中存在的元组数。另一方面,ins、upd和del是在表解决环节中由运行程序拔出、更新和删除的元组数。(这些 "并发的数据更改" 也必需合入收缩的表,否则就会失落数据)。

•squeeze.errors表中蕴含了收缩环节中出现的失误。此处报告的一个经常出现疑问是,有人更改了正在启动解决的表的定义(如参与或删除列)。

•squeeze.get_active_workers()函数前往一个收缩上班进程的表,这些收缩上班进程正在数据库中解决表。pid列蕴含了上班进程的系统 PID。其余列的含意与squeeze.log表中的对应列相反。squeeze.log表只显示已成功的收缩操作消息,而squeeze.get_active_workers()函数则可让您审核解决环节中的进展。

敞开注销表

假设不再须要对特定表启动活期收缩,只需从squeeze.tables表中删除相应行即可。

虽而后盾上班进程会活期敞开注销不存在的表,但敞开注销要删除的表也是一种好的做法。

并发性

1. 该裁减在解决的某些阶段并不阻止其余事务更改表。假设一个 "破坏性命令"(即ALTER TABLE,VACUUM FULL,CLUSTER或TRUNCATE)在收缩成功前提交,squeeze_table()函数就会中止,对表的一切更改都会回滚。squeeze.tables表的max_retry列选择了收缩上班进程重试的次数。此外,更改调度时期也可以防止终止。

2.与pg_repack一样,pg_squeeze也会扭转行的可见性,从而准许出现MVCC 提示第一段中描画的 MVCC 不安保行为。

磁盘空间要求

口头全表收缩所需的可用磁盘空间,大约是指标表及其索引的两倍。例如,假设要收缩的表和索引的总大小为 1GB,则须要额外的 2GB 磁盘空间。

您可能还会对下面的文章感兴趣: