首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >通过psql脚本返回值判断Greenplum任务是否执行成功

通过psql脚本返回值判断Greenplum任务是否执行成功

原创
作者头像
岳涛
修改于 2021-10-08 09:59:35
修改于 2021-10-08 09:59:35
2.6K0
举报
文章被收录于专栏:大数据生态大数据生态

说明

本文描述问题及解决方法同样适用于 腾讯云 云数据仓库 PostgreSQL(CDWPG)

背景

由于psql在执行sql脚本文件的过程中,默认是遇到错误继续执行不停止,所以导致我们无法通过其执行的最终返回值来判断该脚本是否有发生错误。

  • 用来测试的SQL文件
代码语言:sql
AI代码解释
复制
[gpadmincloud@mdw-snova-90g4jkrm ~]$ cat test.sql 
DROP TABLE IF EXISTS test_demo;
CREATE TABLE test_demo(name varchar, time timestamp);
INSERT INTO test_timestamp VALUES('test',now());
INSERT INTO test_timestamp VALUES('test',111);
SELECT * FROM test_timestamp;
[gpadmincloud@mdw-snova-90g4jkrm ~]$ 

测试文件的第4条SQL,对time字段写入了一个非法时间戳,所以该条SQL一定会执行出错。

代码语言:sql
AI代码解释
复制
[gpadmincloud@mdw-snova-90g4jkrm ~]$ psql -d dy_test -U dy1 -h 10.0.38.133 -f test.sql
psql:test.sql:1: NOTICE:  table "test_demo" does not exist, skipping
DROP TABLE
psql:test.sql:2: NOTICE:  Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'name' as the Greenplum Database data distribution key for this table.
HINT:  The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
CREATE TABLE
INSERT 0 1
psql:test.sql:4: ERROR:  column "time" is of type timestamp without time zone but expression is of type integer
LINE 1: INSERT INTO test_timestamp VALUES('test',111);
                                                 ^
HINT:  You will need to rewrite or cast the expression.
 name |            time            
------+----------------------------
 test | 2021-03-17 19:00:29.765707
 test | 2021-03-17 19:47:04.543494
(2 rows)

[gpadmincloud@mdw-snova-90g4jkrm ~]$ echo $?
0
[gpadmincloud@mdw-snova-90g4jkrm ~]$ 

经过测试,确实是报错了,但是执行并没有中断,而是继续执行了下去。相应的,最终返回值也是不符合预期的0(true),这样则无法根据最终返回值来判断SQL脚本是否执行成功了。所以,这里我们介绍两个方案来实现该需求。

解决方案

方案一:使用psql -c来代替psql -f

代码语言:shell
AI代码解释
复制
[gpadmincloud@mdw-snova-90g4jkrm ~]$ cat test.sh 
#!/bin/bash

psql -d dy_test -U dy1 -h 10.0.38.133 -c "
DROP TABLE IF EXISTS test_demo;
CREATE TABLE test_demo(name varchar, time timestamp);
INSERT INTO test_timestamp VALUES('test',now());
INSERT INTO test_timestamp VALUES('test',111);
SELECT * FROM test_timestamp;"
[gpadmincloud@mdw-snova-90g4jkrm ~]$ bash test.sh 
NOTICE:  Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'name' as the Greenplum Database data distribution key for this table.
HINT:  The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
ERROR:  column "time" is of type timestamp without time zone but expression is of type integer
LINE 5: INSERT INTO test_timestamp VALUES('test',111);
                                                 ^
HINT:  You will need to rewrite or cast the expression.
[gpadmincloud@mdw-snova-90g4jkrm ~]$ echo $?
1
[gpadmincloud@mdw-snova-90g4jkrm ~]$ 

可以看到,psql -c的方式,遇到错误会立刻中断,并返回一个非0(false)的值,可以满足我们通过返回值来判断SQL是否全部执行成功的需求。只是这种方式需要嵌套一层shell,不太优雅,介意慎入。

方案二:使用psql参数来指定执行遇错时中断

代码语言:sql
AI代码解释
复制
[gpadmincloud@mdw-snova-90g4jkrm ~]$ psql -d dy_test -U dy1 -h 10.0.38.133 -v ON_ERROR_STOP=1 -f test.sql
DROP TABLE
psql:test.sql:2: NOTICE:  Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'name' as the Greenplum Database data distribution key for this table.
HINT:  The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
CREATE TABLE
INSERT 0 1
psql:test.sql:4: ERROR:  column "time" is of type timestamp without time zone but expression is of type integer
LINE 1: INSERT INTO test_timestamp VALUES('test',111);
                                                 ^
HINT:  You will need to rewrite or cast the expression.
[gpadmincloud@mdw-snova-90g4jkrm ~]$ echo $?
3
[gpadmincloud@mdw-snova-90g4jkrm ~]$

相对方案一,这种方式就显得更加灵活了,堪称完美。

特别注意

不管是使用方案一还是方案二,如果想确认SQL最终是否执行成功,那么一定要要判断返回值是否为0。因为与其他语言不同的是,bash shell的返回值为0才是成功,非0则是失败。再次注意这里,失败是非0,非0,非0,而不是1,重要的话说三遍。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用psql客户端免交互执行Greenplum SQL
本文描述问题及解决方法同样适用于 腾讯云 云数据仓库 PostgreSQL(CDWPG)。
岳涛
2021/03/17
2.7K0
使用psql客户端免交互执行Greenplum SQL
Greenplum基于角色的细粒度权限控制
本文描述问题及解决方法同样适用于 腾讯云 云数据仓库 PostgreSQL(CDWPG)。
岳涛
2021/04/29
2.1K3
Greenplum基于角色的细粒度权限控制
Greenplum 计算能力估算
Greenplum master节点是用来存储元数据的,包括: 序列,表,临时表,分区,函数,视图,类型,操作符,规则,触发器 等。
AiDBA宝典
2023/11/27
3330
Greenplum 计算能力估算
GreenPlum 7.1.0新特性介绍
GreenPlum 7.0.0于2023-09-28发布,大约半年后,GreenPlum 7.1.0于2024-02-09发布。
AiDBA宝典
2024/02/26
1.1K1
GreenPlum 7.1.0新特性介绍
Greenplum集群主机名问题及修复
昨天写了一篇Greenplum数据仓库迁移小记,看起来一起都在计划中,一切都在掌握中,今天早上的时候,统计组的同学反馈说写入GP的时候报了下面的错误。
jeanron100
2018/07/26
1.2K0
Differences between ROWTYPE, TYPE, and RECORD in postgresql?
How to understand differences between ROWTYPE, TYPE, and RECORD in postgresql? Official documentatio
公众号guangcity
2022/12/02
4450
Greenplum gpload命令使用
Runs a load job as defined in a YAML formatted control file.
小徐
2018/12/20
2.9K0
Greenplum  gpload命令使用
将0000-00-00 00:00:00等非法时间戳写入Greenplum
本文描述问题及解决方法同样适用于 腾讯云 云数据仓库 PostgreSQL(CDWPG)。
岳涛
2021/03/17
1.4K0
将0000-00-00 00:00:00等非法时间戳写入Greenplum
GreenPlum管理数据库
在后备Master主机上,移动或者移除数据目录gpseg-1。这个例子移动该目录:
AiDBA宝典
2023/11/16
5430
GreenPlum管理数据库
Greenplum 实时数据仓库实践(9)——Greenplum监控与运维
想要一个数据库长久健康的运行,离不开完备的运维工作,切忌只运而不维。针对Greenplum分布式数据库,集群由大量服务器组成,对运维人员或DBA,不仅要关注数据库本身,还要注意集群中各硬件的状况,及时发现并处理问题。本篇介绍权限与角色管理、数据导入导出、性能优化、例行监控、例行维护、推荐的监控与维护任务六方面常规工作内容,目标是满足Greenplum系统维护、使用等方面的要求,保证提供稳定高效的数据库服务。
用户1148526
2022/04/13
4.2K0
GreenPlum备份和恢复工具之gpbackup和gprestore
Greenplum数据库支持并行和非并行方法来备份和还原数据库。并行操作可扩展,而与系统中段的数量无关,因为段主机各自将数据同时写入本地磁盘存储中。对于非并行备份和还原操作,必须通过网络将数据从网段发送到主服务器,主服务器将所有数据写入其存储中。除了将I/O限制在一台主机之外,非并行备份还要求主服务器具有足够的本地磁盘存储空间来存储整个数据库。
AiDBA宝典
2023/11/06
2.3K1
GreenPlum备份和恢复工具之gpbackup和gprestore
Greenplum 实时数据仓库实践(6)——实时数据装载
上一篇详细讲解了如何用Canal和Kafka,将MySQL数据实时全量同步到Greenplum。对照本专题第一篇中图1-1的数据仓库架构,我们已经实现了ETL的实时抽取过程,将数据同步到RDS中。本篇继续介绍如何实现后面的数据装载过程。实现实时数据装载的总体步骤可归纳为:
用户1148526
2021/12/29
2.7K0
Greenplum 实时数据仓库实践(6)——实时数据装载
Greenplum 集群性能测试
114.112.77.199 master、segment 210.73.209.103 standby master、segment 140.210.73.67 segment
用户1148526
2021/12/07
8070
Greenplum 7 新特性整理
参考:https://www.xmmup.com/zaidockerzhongkuaisutiyangreenplum-7-0-0.html
AiDBA宝典
2023/10/16
1.5K0
Greenplum 7 新特性整理
Greenplum数据库使用总结(干货满满)--常见创建TABLE方式
create table test_head(id int primary key) distributed by (id);
小徐
2019/08/05
3.1K0
Greenplum数据库使用总结(干货满满)--常见创建TABLE方式
Greenplum高级使用
stagging=#  select gp_segment_id,count(1) from  tablename  group by 1;
小徐
2019/01/28
1.6K1
Greenplum高级使用
Greenplum数据库使用总结(干货满满)--高级使用
stagging=# select gp_segment_id,count(1) from tablename group by 1;
小徐
2019/08/05
3.9K0
Greenplum测试环境部署
本实例是部署实验环境,采用的是Citrix的虚拟化环境,分配了3台RHEL6.4的主机。
Alfred Zhao
2019/05/24
1.8K0
GreenPlum装载和卸载工具(外部表、gpfdist、gpload等)
在创建外部表定义时,必须指定文件格式和文件位置 三种用来访问外部表数据源的协议:gpfdist, gpfdists和gphdfs
AiDBA宝典
2023/11/01
2.1K0
GreenPlum装载和卸载工具(外部表、gpfdist、gpload等)
greenplum 检测表倾斜率高的shell脚本
greenplum-table-percentage 此项目主要检测greenplum集群中膨胀的表,经过检测会生成一个csv文件,以便技术人员分析原因及解决问题 项目结构介绍 greenplum-table-percentage.sh 主脚本,修改以下信息即可运行改脚本。 1、修改该脚本中的数据库连接信息 2、修改需要检测的schema_inspect,添加时请以英文逗号分割,例如:main,history 3、运行完改脚本会在log/20190603/table-percentage/下生成一
小徐
2019/06/05
1.8K2
greenplum 检测表倾斜率高的shell脚本
相关推荐
使用psql客户端免交互执行Greenplum SQL
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档