前言
通常,在PostgreSQL中,因为常常须要对表进行 UPDATE 和 DELETE,因而表会产生碎片空间。在 PostgreSQL中,应用VACUUM 仅仅对须要执行 VACUUM 表将已删除的空间标识为未应用,以便当前重用这些空间,然而不能立刻将占用的空间返还给操作系统,因而须要应用 VACUUM FULL,才能够开释空间,并立刻将空间返还给操作系统。
实现脚本
记录收集表创立
CREATE TABLE IF NOT EXISTS tab_vacuum_record(sqltext text);
收集须要VACUUM 表函数
CREATE OR REPLACE FUNCTION f_vacuum_tables()RETURNS void AS$FUNCTION$ DECLARE v_tablename text; v_dead_cond bigint; v_sql text; cur_tablename REFCURSOR; v_vacuum_record text; BEGIN v_vacuum_record := 'tab_vacuum_record'; OPEN cur_tablename FOR SELECT tablename FROM pg_tables WHERE tablename !~ '^pg|^sql'; LOOP FETCH cur_tablename INTO v_tablename; SELECT n_dead_tup INTO v_dead_cond FROM pg_stat_user_tables WHERE relname = v_tablename; IF v_dead_cond > 0 THEN v_sql := 'INSERT INTO ' || v_vacuum_record || ' VALUES(' || chr(39) ||'VACUUM FULL ' || v_tablename ||';'|| chr(39) ||')'; EXECUTE v_sql; END IF; EXIT WHEN NOT FOUND; END LOOP; CLOSE cur_tablename; END;$FUNCTION$LANGUAGE PLPGSQL;
SHELL脚本
#!/bin/bash#获取环境变量CURRDIR=$(cd "$(dirname $0)";pwd)TOPDIR=$(cd $CURRDIR/..;pwd)CONFIG=$TOPDIR/conf/host.iniCT_FILE=${TOPDIR}/sql/CREATE_VACCUM_TABLE_RECORD.sqlCT_FUNCTION=${TOPDIR}/sql/CHECK_NEEDS_VACUUM_TABLE_FUNCTION.sqlsource $CONFIGCONNINFO="psql -U $USER -d $DBNAME -h $HOSTADDR -p $PORT"function check_status(){ echo "查看数据库服务器状态是否失常 !" stat=`$CONNINFO -Aqt -c 'SELECT 1'` if [ "${stat}" == "1" ];then echo "服务器连贯失常" else echo "服务器连贯异样,退出" exit -1; fi}function create_table(){ echo "创立收集须要vacuum的表" $CONNINFO -f $CT_FILE}function create_function(){ echo "创立收集须要 vacuum 表的函数" $CONNINFO -f $CT_FUNCTION}check_statuscreate_tablecreate_function
执行形式
postgres=# SELECT * FROM f_vacuum_tables(); f_vacuum_tables ----------------- (1 row)--创立测试表postgres=# CREATE TABLE tab_test(id int);--插入数据postgres=# INSERT INTO tab_test SELECT id FROM generate_series(1,100000) as id;INSERT 0 100000--删除数据postgres=# DELETE FROM tab_Test WHERE id <= 10000;DELETE 10002postgres=# SELECT * FROM tab_vacuum_record ; sqltext ----------------------- VACUUM FULL tab_test;(1 row)
该脚本也能够本人依据须要进行批改,具体见github
https://github.com/OpenSource...