分区的原因
当前版本并不能对单表或者单个分区并行进行垃圾回收,包括单表的freeze也只能是单进程进行冻结和回收。但是对于多表或者多个分区就可以并行执行上述操作,所以在单表数据量过大会发生什么?
1. 当进行autovacuum垃圾回收时,如果该表的DML操作非常频繁的话,可能导致垃圾回收不过来,进而导致表迅速膨胀,占用过多的空间从而导致故障。 2. 单表过大会导致单表的freeze时间过长,可能会导致xid耗尽,此时就只能停库操作降低年龄之后才能正常运行。在PG 9.6以前的版本,大表的freeze带来的IOPS影响较大,体现在数据文件读写、WAL日志大量产生。但9.6及以后版本freeze有大幅改进,并不会产生大量的WAL日志了。 3. 表没分区的话,当要清理历史数据时就只能delete了,大批量的delete会产生大量的wal日志,从而导致从库延迟。并且大批量数据的delete事务时间过长,可能会导致表膨胀发生。如果大表分区了,我们可以通过drop历史分区或者truncate历史分区的方式清理历史数据,不用担心大量wal日志的产生,而且执行时间很快。 4. 单表的只能位于单个表空间,对应到单个目录,并不能像分区表那样将各个分区放到不同的表空间,不同的目录上去。这样就可能导致某个目录对应的盘IO很繁忙,但其他目录就很空闲的情况。IO不能分散从而导致性能问题的发生。
单表的逻辑备份恢复无法并行执行,数据全量同步时会很慢,并且异常中断后又需要重新开始这个大表的同步。
当然,pg_rewrite使用是有限制的:
不支持外部表分区。 非分区表一定要有PK。 分区表建议约束和非分区表保持一致, 例如not null,default value 等约束。
pg_rewrite安装及使用


wal_level = logical
max_replication_slots = 1 #或者在当前值上加1。
shared_preload_libraries = 'pg_rewrite' #将pg_rewrite添加到现有库中

pg_rewrite用法测试案例





pg_rewrite相关的变量
set rewrite.max_xlock_time to 100;

本文作者:魏 斌(上海新炬王翦团队)
本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




