GreenPlum 触发执行vacuum
目录
- 场景描述
- 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相关推荐
- greenplum 中的 vacuum
vaccum 函数 exec_simple_query->PortalRun->PortalRunMulti->PortalRunUtility->ProcessUtility ...
- Greenplum中的vacuum
vacuum,该选项主要是清理数据库表中的垃圾空间. 对于delete或update操作造成的实际物理空间没有从所对应的表中移除的话,vacuum操作可以将此磁盘释放出来,所以对那些经常性更新的表很有 ...
- 定时执行vacuum
写一个dat格式文件,内容如下: @echo off echo PostgreSQL8.4 Version is starting echo Please wait ........ cd \ @ ...
- 通过JMS监听Oracle AQ,在数据库变化时触发执行Java程序
环境说明 一Oracle高级消息队列AQ 创建消息负荷payload 创建队列表 创建队列并启动 队列的停止和删除 入队消息 出队消息 二Java使用JMS监听并处理Oracle AQ队列 创建连接参 ...
- 络达开发----RACE指令之---DSP中AudioLoopbackTest如何触发执行
芯片型号:AB1565 功能模块:RACE之AudioLoopbackTest 功能描述:DSP中音频流的处理 一.指令介绍 AB1565的SDK支持串口指令的调试和控制,在SDK中叫作RACE模块, ...
- java监听oracle aq,透过JMS监听Oracle AQ,在数据库变化时触发执行Java程序
环境说明 一Oracle高级消息队列AQ创建消息负荷payload 创建队列表 创建队列并启动 队列的停止和删除 入队消息 出队消息 二Java使用JMS监听并处理Oracle AQ队列创建连接参数类 ...
- greenplum vacuum清理删除数据命令
官方文档 http://docs.greenplum.org/6-4/ref_guide/sql_commands/VACUUM.html greenplum数据删除后不会释放存储空间,需要命令VAC ...
- 如何检测、清理Greenplum膨胀、垃圾
转自:digoal 背景 Greenplum通过多版本支持数据的删除和更新的并发和回滚,在删除数据时(使用DELETE删除),对记录的头部xmax值进行标记.在删除记录时,对记录的头部进行标记,同时插 ...
- Greenplum 实时数据仓库实践(9)——Greenplum监控与运维
目录 9.1 权限与角色管理 9.1.1 Greenplum中的角色与权限 9.1.2 管理角色及其成员 9.1.3 管理对象权限 9.1.4 口令加密 9.2 数据导入导出 9.2.1 file协议 ...
最新文章
- 【TensorFlow】TF-tf.nn.dropout
- 你一定会用的18个linux网络监控工具
- 实现同步请求_Redis的复制是如何实现的?
- python 港股交易数据_GitHub - 116pythonZS/futuquant: 富途量化平台 API
- 程序员常见保健方法【转贴】
- server sql 统计信息 过时_sql-server – 何时更新统计信息?
- php phar效率,PHP的Phar包原来性能这么强
- Custom Function in MS Reporter
- .NET读、写、查、删、改XML文件
- 视频教程-sql注入系列课程-渗透测试
- R语言学习之R程序包安装
- 计算机硬盘驱动器可以删吗,有关删除存储驱动器上的数据的注意事项
- 如何用安卓手机运行Python代码
- mysql c盘满了 怎么办_C盘太满清理技巧
- 八大资管业务类型汇总
- 算法题(六十二)头条2017年笔试题——头条校招
- 形容计算机专业好句子,形容专业水平高的词句
- 人工智能的应用实例介绍,人工智能有哪些应用领域?
- DTV 学习(一) 基本概念、分类
- activiti7入门体验(2)
热门文章
- GPU百科全书(1)方程与几何
- 64位和32位有什么区别?到底哪个更快?——硬核科普
- cpu负载过高产生的原因及排查
- 刚刚从GitHub 上扒下来,标星 75k,超牛的《Java面试突击版》,这么高标星果真有原因的
- 深度学习之GPU显存与利用率 浅析小结
- 树莓派 EC20 mini pcie 开机自动拨号
- vs code + mingw64配置C语言环境
- 感慨鸿蒙谁为情种,开辟鸿蒙,谁为情种……
- %-3d 、 219、\1、%-5d、%-4d、%121d、%9.6f都是什么意思
- 《管理学》计划、激励、沟通的摘要笔记