【greenplum】greenplum 如何删除临时schema(孤立schema)

参考:

1. Orphaned Temporary Schemas in Greenplum Database 

2. how to clean orphan temp schemas in greenplum 


      每个数据库会话都可以创建并使用临时模式来处理会话临时表。通常,这些模式在会话结束时被删除。但是,由于进程崩溃或其他非默认会话结束,会话完成后,这些临时模式仍然存在。

【greenplum】greenplum 如何删除临时schema(孤立schema)_第1张图片

这些临时模式通常不会产生麻烦,除非涉及事务管理并完成目录检查。在前一种情况下,这些临时模式(及其中的对象)是特定于会话的,因此VACUUM命令无法处理它们。在后一种情况下,它们会在gpcheckcat日志文件中提供很多噪音,并可能掩盖其他重要的目录不一致情况。

由于上述原因,建议删除这些“孤立”临时模式,特别是在使用gpcheckcat进行目录检查之前。gpcheckcat实用程序当然会识别它们并将它们指向它们,但是在运行该工具之前删除这些孤立的temp模式会更容易,更快速。建议数据库处于管理模式(无用户会话),因此可以轻松识别这些孤立模式。

删除方法:

drop schema if exists pg_temp_XXXX cascade;

批量删除:

select 
     'drop schema if exists ' || nspname || ' cascade;' 
from (
         select nspname from pg_namespace where nspname like 'pg_temp%' -- 查主节点临时schema
         union 
         select nspname from gp_dist_random('pg_namespace') where nspname like 'pg_temp%'  -- 查所欲节点上的临时schema
         except 
         select 'pg_temp_' || sess_id::varchar from pg_stat_activity  -- 除去当前session的零时schema
      ) as foo

批量删除所有库的:

psql -Atc "select datname from pg_database where datname != 'template0'" | while read a; 
do 
    echo "check for ${a}";
    psql -Atc "select 
                    'drop schema if exists ' || nspname || ' cascade;' 
               from 
                   (
                      select nspname from pg_namespace where nspname like 'pg_temp%' 
                      union select nspname from gp_dist_random('pg_namespace') where nspname like 'pg_temp%' 
                      except select 'pg_temp_' || sess_id::varchar from pg_stat_activity
                   ) as foo
              " ${a}; 
done

只删除主节点的临时schema:

SELECT
	'drop schema ' || nspname || ' cascade;'
FROM
	(
		SELECT nspname FROM pg_namespace WHERE nspname LIKE 'pg_temp%'
		EXCEPT
		SELECT 'pg_temp_' || sess_id :: VARCHAR FROM pg_stat_activity
	) AS foo

删除某个节点上的(gp5.0 之后不知道可不可以用):

select 
    'PGOPTIONS=''-c gp_session_role=utility'' psql -h ' || g.hostname || ' -p '||g.port || ' -c ' || '''drop schema '||p.nspname||' cascade;' 
from 
   gp_dist_random('pg_namespace') p,
   gp_segment_configuration g
where p.nspname like 'pg_temp%' 
and g.role='p' 
and g.content=p.gp_segment_id
and p.nspname not in (select 'pg_temp_' || sess_id::varchar from pg_stat_activity);



你可能感兴趣的:(Greenplum,数据库)