使用pg_repack 回收表体积
對(duì)于某些常進(jìn)行archiver或者 purge操作的表而言,如果我們不定期回收表空間,則表體積會(huì)越漲越大。
但是pg自帶的 vacuum full 在回收的過(guò)程中會(huì)阻塞讀寫操作,不能在生產(chǎn)環(huán)境直接運(yùn)行。
因此,在生產(chǎn)環(huán)境 我們常用的表空間收縮工具是pg_squeeze 和 pg_repack。
這里先貼 pg_repack 的用法:
項(xiàng)目地址:? https://github.com/reorg/pg_repack
原理: 新建一個(gè)一模一樣的影子表,然后拷貝原表的數(shù)據(jù),最后rename替換原表。
注意: 待處理的表必須有主鍵
yum?install?centos-release-scl-rh yum?install?llvm-toolset-7-clangcd?/home/postgrestar?xf?pg_repack-ver_1.4.4.tar.gz?export?PATH=/usr/local/pgsql-11.5/bin:$PATH???--?需要載入環(huán)境變量,不然編譯過(guò)程中可能找不到pg_config這個(gè)文件cd?pg_repack-ver_1.4.4make?&&?make?install
另外,會(huì)生成一個(gè)可執(zhí)行的文件: /home/postgres/pg_repack-ver_1.4.4/bin/pg_repack?
修改配置文件:
vim? /usr/local/pgsql-11.5/data/postgresql.conf
shared_preload_libraries?=?'pg_repack'然后 ,重啟pg進(jìn)程
使用方法:
create?database?db1;\c?db1create?extension?pg_repack;create?table?testdata?(id?integer,course?int,grade?numeric(4,2),testtime?date); alter?table?testdata?add?primary?key?(id);insert?into?testdata?select?generate_series(1,100)?as?id,10?as?course,10.11?as?grade,'2017-07-06'?as?testtime;
然后,我們可以去看下PG datadir物理文件大小從1.1GB漲到了1.6GB了
?
然后,我們?cè)偈褂妹?/span> delete from testdata where id between 5000000 and 10000000;? 對(duì)testdata表刪除一半的數(shù)據(jù)?,此時(shí)可以看到物理文件沒(méi)有任何縮小。
?
然后,在外部使用pg_repack對(duì) color表做空間回收:
cd?/home/postgres/pg_repack-ver_1.4.4/bin./pg_repack?-h?127.0.0.1??--port?5434?-Upostgres?-d?db1?-t?testdata?-j?2?-D?-k返回的結(jié)果如下(根據(jù)實(shí)際表的大小,來(lái)決定這個(gè)結(jié)果等待的時(shí)長(zhǎng)):
NOTICE: Setting up workers.conns
INFO: repacking table "public.testdata"
pg_repack參數(shù)說(shuō)明:
?
我們?cè)偃ゲ榭次锢砦募笮?#xff0c;發(fā)現(xiàn)PG整個(gè)的文件大小又縮回到1.4G了(回收掉的200MB差不多就是一半的testdata表的空間大小)
?
?
最后, 我們可以使用腳本定時(shí)檢測(cè)對(duì)超過(guò)某些閾值的表定時(shí)執(zhí)行 pg_repack 操作,以便回收磁盤空間。
總結(jié)
以上是生活随笔為你收集整理的使用pg_repack 回收表体积的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 本原勾股数
- 下一篇: LeetCode 热题 HOT 100