目录

  • 场景描述
  • touch_vacuum_table_record
  • wait_touch_vacuum_table_record
  • req_touchid_vacuum
  • hastable
  • insert_touch_vacuum_table_record
  • sp_vacuum
  • vacuum_analyze_tb.sh
  • 配置定时调度

场景描述

  • 问题:GreenPlum中,vacuum只能自己管理自己的表,并且不能在函数或者匿名程序块中动态进行vacuum
  • 思路:设计一个触发表,将需要做vacuum的表名插入到该触发表中,在linux配置定时任务,每隔1分钟扫描该触发表,对没有执行的过的vacuum执行,然后回写状态。
  • 都在gpload用户下操作的

touch_vacuum_table_record

drop table if exists touch_vacuum_table_record;
create table touch_vacuum_table_record (touchid int primary key,touchuser varchar(64),schemaname varchar(64),tablename varchar(64),status varchar(7) default 'wait',touchsql varchar(32767),errmsg text,createtime timestamp default current_timestamp,begintime timestamp,endtime timestamp
) distributed by (touchid);
comment on table touch_vacuum_table_record is '触发执行 vacuum analyze 表的记录';
comment on column touch_vacuum_table_record.touchid is $$select nextval('req_touchid_vacuum');$$;
comment on column touch_vacuum_table_record.touchuser is $$触发用户$$;
comment on column touch_vacuum_table_record.schemaname is $$模式名$$;
comment on column touch_vacuum_table_record.tablename is $$表名$$;
comment on column touch_vacuum_table_record.status is $$状态,wait(等待)、running(运行中)、run(运行完毕)$$;
comment on column touch_vacuum_table_record.touchsql is $$等待运行的sql$$;
comment on column touch_vacuum_table_record.errmsg is $$报错信息$$;
comment on column touch_vacuum_table_record.createtime is $$触发时间$$;
comment on column touch_vacuum_table_record.begintime is $$运行开始时间$$;
comment on column touch_vacuum_table_record.endtime is $$运行结束时间$$;

wait_touch_vacuum_table_record

create or replace view wait_touch_vacuum_table_record as
select touchid,touchsql,$$update gpload.touch_vacuum_table_record set status = 'running',begintime = current_timestamp where status = 'wait' and touchid = $$||touchid||$$;$$ as beforesql,'update gpload.touch_vacuum_table_record set status = ''run'',errmsg = ''$'||'{ERRMSG}'||''',endtime = current_timestamp where status = ''running'' and touchid = '||touchid||';' as aftersql
from touch_vacuum_table_record
where status = 'wait';

req_touchid_vacuum

create sequence gpload.req_touchid_vacuumincrement by 1minvalue 1maxvalue 9223372036854775807start 1;

hastable

create or replace function hastable(table_name character varying, schema_name character varying default ("current_user"())::character varying(64))returns booleanlanguage plpgsql
as $function$
/** 作者 : v-yuzhenc* 功能 : 判断表是否存在,不存在则返回false,存在返回true* table_name : 表名* schema_name : 模式名,默认当前用户* */
declare existbj int;  --存在标记ret boolean := false;  --返回值
beginselect 1into existbjfrom pg_tables where tablename = lower(table_name)and schemaname = lower(schema_name)limit 1;if existbj = 1 then ret := true;end if;return ret;
end;
$function$
;
grant execute on function hastable(varchar,varchar) to public;

insert_touch_vacuum_table_record

create or replace function insert_touch_vacuum_table_record(touch_user varchar,schema_name varchar,table_name varchar
)returns voidlanguage plpgsqlsecurity definer
as $function$
begin insert into gpload.touch_vacuum_table_record (touchid,touchuser,schemaname,tablename,touchsql)values (nextval('gpload.req_touchid_vacuum'),touch_user,schema_name,table_name,'vacuum analyze "'||schema_name||'"."'||table_name||'";');
end;
$function$;
grant execute on function insert_touch_vacuum_table_record(varchar,varchar,varchar) to public;

sp_vacuum

create or replace function sp_vacuum(tablename varchar,schemaname varchar default user::varchar
)returns voidlanguage plpgsql
as $function$
/* 作者 : v-yuzhenc* 功能 : 触发执行vacuum analyze 模式.表名 (最多延迟1分钟)* tablename : 需要 vacuum analyze 的表名* schemaname : 需要 vacuum analyze 的表名所在的模式名* */
declare p_tablename varchar := lower(tablename);p_schemaname varchar := lower(schemaname);p_user varchar := user::varchar;
begin--表名为空if tablename is null then raise exception '表名不能为空!';end if;--自己的表自己管理if p_schemaname <> p_user then raise exception '只能自己的表自己管理';end if;--先判断表是否存在if hastable(p_tablename,p_schemaname) = false then raise exception '%.% 表不存在!',p_schemaname,p_tablename;end if;--插入数据perform gpload.insert_touch_vacuum_table_record(p_user,p_schemaname,p_tablename);
end;
$function$
;
grant execute on function sp_vacuum(varchar,varchar) to public;

vacuum_analyze_tb.sh

#! /bin/bashsource /usr/local/greenplum-db/greenplum_path.shwhile true ; doV_SQL=`echo 'select beforesql,aftersql,touchsql from gpload.wait_touch_vacuum_table_record limit 1;' | psql etl -At`if [ -z "${V_SQL}" ];thenexit 0fi#前置sql更新状态BEFORESQL=`echo ${V_SQL} | awk -F '|' '{print $1}'`#实际执行的sqlTOUCHSQL=`echo ${V_SQL} | awk -F '|' '{print $3}'`#先更新状态UPDATEBJ=`echo ${BEFORESQL} | psql etl -At`if [ "${UPDATEBJ}" = "UPDATE 1" ]; thenERRMSG=`echo ${TOUCHSQL} | psql etl -At`#后置sql更新状态AFTER=`echo ${V_SQL} | awk -F '|' '{print $2}'`AFTER=$(echo "$AFTER" | sed "s/\${ERRMSG}/${ERRMSG}/g")psql etl -At <<SQL
$AFTER
\q
SQLsleep 1fi
done

配置定时调度

crontab -e
*/1 * * * * /home/gpadmin/gpshell/vacuum_analyze_tb.sh

GreenPlum 触发执行vacuum相关推荐

  1. greenplum 中的 vacuum

    vaccum 函数 exec_simple_query->PortalRun->PortalRunMulti->PortalRunUtility->ProcessUtility ...

  2. Greenplum中的vacuum

    vacuum,该选项主要是清理数据库表中的垃圾空间. 对于delete或update操作造成的实际物理空间没有从所对应的表中移除的话,vacuum操作可以将此磁盘释放出来,所以对那些经常性更新的表很有 ...

  3. 定时执行vacuum

    写一个dat格式文件,内容如下: @echo off echo PostgreSQL8.4 Version is starting   echo Please wait ........ cd \ @ ...

  4. 通过JMS监听Oracle AQ,在数据库变化时触发执行Java程序

    环境说明 一Oracle高级消息队列AQ 创建消息负荷payload 创建队列表 创建队列并启动 队列的停止和删除 入队消息 出队消息 二Java使用JMS监听并处理Oracle AQ队列 创建连接参 ...

  5. 络达开发----RACE指令之---DSP中AudioLoopbackTest如何触发执行

    芯片型号:AB1565 功能模块:RACE之AudioLoopbackTest 功能描述:DSP中音频流的处理 一.指令介绍 AB1565的SDK支持串口指令的调试和控制,在SDK中叫作RACE模块, ...

  6. java监听oracle aq,透过JMS监听Oracle AQ,在数据库变化时触发执行Java程序

    环境说明 一Oracle高级消息队列AQ创建消息负荷payload 创建队列表 创建队列并启动 队列的停止和删除 入队消息 出队消息 二Java使用JMS监听并处理Oracle AQ队列创建连接参数类 ...

  7. greenplum vacuum清理删除数据命令

    官方文档 http://docs.greenplum.org/6-4/ref_guide/sql_commands/VACUUM.html greenplum数据删除后不会释放存储空间,需要命令VAC ...

  8. 如何检测、清理Greenplum膨胀、垃圾

    转自:digoal 背景 Greenplum通过多版本支持数据的删除和更新的并发和回滚,在删除数据时(使用DELETE删除),对记录的头部xmax值进行标记.在删除记录时,对记录的头部进行标记,同时插 ...

  9. Greenplum 实时数据仓库实践(9)——Greenplum监控与运维

    目录 9.1 权限与角色管理 9.1.1 Greenplum中的角色与权限 9.1.2 管理角色及其成员 9.1.3 管理对象权限 9.1.4 口令加密 9.2 数据导入导出 9.2.1 file协议 ...

最新文章

  1. 【TensorFlow】TF-tf.nn.dropout
  2. 你一定会用的18个linux网络监控工具
  3. 实现同步请求_Redis的复制是如何实现的?
  4. python 港股交易数据_GitHub - 116pythonZS/futuquant: 富途量化平台 API
  5. 程序员常见保健方法【转贴】
  6. server sql 统计信息 过时_sql-server – 何时更新统计信息?
  7. php phar效率,PHP的Phar包原来性能这么强
  8. Custom Function in MS Reporter
  9. .NET读、写、查、删、改XML文件
  10. 视频教程-sql注入系列课程-渗透测试
  11. R语言学习之R程序包安装
  12. 计算机硬盘驱动器可以删吗,有关删除存储驱动器上的数据的注意事项
  13. 如何用安卓手机运行Python代码
  14. mysql c盘满了 怎么办_C盘太满清理技巧
  15. 八大资管业务类型汇总
  16. 算法题(六十二)头条2017年笔试题——头条校招
  17. 形容计算机专业好句子,形容专业水平高的词句
  18. 人工智能的应用实例介绍,人工智能有哪些应用领域?
  19. DTV 学习(一) 基本概念、分类
  20. activiti7入门体验(2)

热门文章

  1. GPU百科全书(1)方程与几何
  2. 64位和32位有什么区别?到底哪个更快?——硬核科普
  3. cpu负载过高产生的原因及排查
  4. 刚刚从GitHub 上扒下来,标星 75k,超牛的《Java面试突击版》,这么高标星果真有原因的
  5. 深度学习之GPU显存与利用率 浅析小结
  6. 树莓派 EC20 mini pcie 开机自动拨号
  7. vs code + mingw64配置C语言环境
  8. 感慨鸿蒙谁为情种,开辟鸿蒙,谁为情种……
  9. %-3d 、 219、\1、%-5d、%-4d、%121d、%9.6f都是什么意思
  10. 《管理学》计划、激励、沟通的摘要笔记