目前在使用的greenplum是基于postgresql 8.2.*版本的
之前写过一篇文章,可以使用vacuum freeze来冻结年龄
但是正常情况下,Greenplum是用作OLAP来使用的,所以数据量会比较大,手工做全库的freeze明显是不现实的
目前实际情况是大批的临时表存在,而且年龄很高,
这个估计是8.2版本的bug,因为临时表都是随着session结束而消失的。但是这里一直存在,而且年龄无法回收,导致整个集群的年龄都很高
那么,现在我们需要人为干预,删除这些临时表
1.创建函数:
cat /home/gpadmin/drop_tmp_function
create or replace function drop_tmp_table() returns int
as $$
declare
ns_name text;
rel_name text;
v_tablename text;
begin
for ns_name,rel_name in
(select b.nspname,a.relname from pg_class a ,pg_namespace b
where a.relnamespace=b.oid
and b.nspname ~ 'pg_temp'
and a.relkind='r' order by age(a.relfrozenxid) desc)
loop
v_tablename := ns_name||'.'||rel_name;
execute 'drop table '||v_tablename;
end loop;
RAISE NOTICE 'The all temp table be successful droped !';
return 1;
end;
$$ LANGUAGE plpgsql;
2.cat drop_tmp_sh.sh
#!/bin/bash
source /home/gpadmin/.bash_profile
for host in `cat /home/gpadmin/segment_hosts_file`;do
PGOPTIONS="-c gp_session_role=utility" psql -h ${host} -p xxx -d warehouse -f /home/gpadmin/drop_tmp_function;
PGOPTIONS="-c gp_session_role=utility" psql -h ${host} -p xxx -d warehouse -c "select * from drop_tmp_table()";
done
echo "All table of the greenplum has be deleted!"
segment_hosts_file 内容是对应的greenplum下面的segment节点地址或者主机名
3.后台执行脚本,删除临时表
nohup sh drop_tmp_sh.sh > drop_tmp_sh.log 2>&1 &
另外的话还有外部表年龄也会逐渐升高,生产环境用了很多文件的外部表,而且外部表不能做vacuum,所以目前的方法只能是删除后重建。