MySQL主动报错方法及实践应用调度依赖
yuyutoo 2025-05-08 22:04 10 浏览 0 评论
摘要: MySQL主动报错方法及实践应用调度依赖
关键词: MySQL、主动报错、调度依赖、数据库函数
整体说明
在使用 Dolphinscheduler 的时候,对接三方数据时,对方的数据完成时间不确定,需要找个简单的方法去堵塞任务,整理了一下解决思路,大致如下:
一、问题背景
1.1、对接三方数据
作为数据仓库建设方,需要对接三方数据,并不是我们自己的数据,没法天然的形成数据依赖
1.2、使用 Dolphinscheduler 平台
数据调度使用的是 Dolphinscheduler ,可以配置调度任务,数据集成使用的是 Datax ,用来集成三方数据
1.3、没有部署 Spark
由于项目是个小项目,没有部署大数据能力平台,也没有部署单节点的 Spark ,所以没法使用 Dolphinscheduler 的数据质量任务,
数据质量任务,有天然的表行数校验(复杂的用自定义 SQL)和对应的失败策略堵塞配置,此次没法使用,有兴趣的,可以研究下
1.4、存储数据库 MySQL
小项目存储数据,使用的是 MySQL,后续的主动报错也是基于 MySQL 写的
1.5、上游数据完成时间不是固定时间
由于对接的三方数据,也就是上游数据,并不是 OLTP 的业务系统,数据实时更新,而是一个分析系统,然后数据的生成时间随着机器的内存、CPU、或者他的数据依赖延迟而延迟,每天都不会是固定时间完成, 所以必须设置依赖,否则我们的数据生成任务,就会和源头数据错位,而导致不准确
1.6、有完成时间标记表
上游数据有不确定完成时间问题,所以他们也提供了数据完成的时间
具体表结构如下
CREATE TABLE `table_update_info` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
`table_name` varchar(255) DEFAULT NULL COMMENT '表名称',
`anal_date` varchar(32) DEFAULT NULL COMMENT '计算日期',
`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间'
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='更新信息表';
当他们昨日数据表计算完成时,就会向这个表插入一条数据
INSERT INTO `table_update_info` (`table_name`, `calc_date`) VALUES ( 'comp_table_name', '2025-04-14');
1.7、尽量简单,不开发
由于项目成本比较低,尽量不通过开发代码的方式去解决问题
二、问题分析
2.1、存在前置查询条件,可以依赖
由于上游给出了完成时间标记的表,那么我们可以通过查询来判断数据是否更新,
限定表名和计算日期为今天,通过是否有数据,来确定是否这个表已经更新
伪代码如下:
select table_name
from table_update_info
where table_name = '${完成结果表名}'
and calc_date = '${昨日时间}')
如果查询有数据,说明数据已更新,我们可以集成数据了
2.2、调度平台能够报错重试
前面已经确定了,通过 SQL 查询的方式,来判断数据是否已更新,
那就还剩一个问题,如果上游数据不更新,我们需要失败重试,
调度平台,是有这个功能的,截图如下:
三、解决方案
前面的解决方案,看似已经完美了,但是就是有一个问题!
SQL 查询 怎么才能在查不到数据的时候,报错!!!
3.1、尝试1:使用分母为 0方式报错
我们知道 MySQL 数据库,有个报错
ERROR 1365 (22012): Division by 0
这个报错是我最先想到的,当分母为 0 时 会报错
事实上,非常不幸,执行下面语句,并不会报错,只会返回 NULL,且会报一个 warning
select 1/0;
通过 语句查看得知,正是我们要的报错,但是他不是报错,而是 warning,并不能配合前面的报错重试
show WARNINGS;
然后就是去查询为什么不报错呢?
DeepSeek 大模型告诉我,是因为数据库的模式设置的不对,于是我查询数据库是不是严格模式,
可以看到返回的结果,是严格的模式
SELECT @@sql_mode;
这时候我就去,翻阅官方文档,发现,这个模式并不是适合所有语句,只适用于 INSERT 和 UPDATE
于是验证一下,发现确实报错了
CREATE TABLE test (x DECIMAL(5,2));
INSERT INTO test VALUES (1/0);
但是我要的查询的结果,不是插入。而且还要再新建一个表来插入,
结果:未采用!
3.2、尝试2:使用不存在字段方式报错
之后我又问了大模型,他给我这个方式,用不存在的字段,来主动报错
就是 举个例子,当条件是 0 时,不满足我们的条件,我们就查询一个没有字段 比如 invalid_column 来报错,
看起来貌似可以,但是!
无论,0 还是 1,都活报错,应该是 判断字段是否存在的顺利,在 case when 这样的判断之前,所以怎么都会报错
SELECT
CASE
WHEN 0 THEN (SELECT invalid_column FROM test)
ELSE 1
END AS result;
结果:未采用!
3.3、尝试3:使用 MySQL 函数主动报错
这次我不问大模型了,很多时候,DeepSeek 也不能解决我的问题,甚至回答的结果也是只言片语
这次我百度!
然后我找到了一个方案: 通过创建函数来主动报错,
函数如下:
DELIMITER $
CREATE FUNCTION ThrowIfNull(input_value VARCHAR(255))
RETURNS VARCHAR(255)
DETERMINISTIC
BEGIN
IF input_value IS NULL THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Result is NULL!';
END IF;
RETURN input_value;
END$
DELIMITER ;
这个函数很简单,直接能在 MySQL 中执行,逻辑也简单
输入值是 NULL 时,报错!
测试 ,得到我们想要的结果,报错了!
select ThrowIfNull(NULL);
四、最终解决
4.1、解决方式
使用上面的尝试 3 ,配合报错重试解决
SELECT ThrowIfNull(
(select table_name
from table_update_info
where table_name = 'comp_table_name' -- 表名
and anal_date = '$[last_day(yyyy-MM-dd)]' -- 昨天
) AS result
实际配置如下:
4.2、举一反三
- 对接数据依赖方案
- 这个方案可以作为数据对接调度依赖方案,简单实用
- 多调度平台依赖方案
- 拓展开来,多个平台,比如 Dolphinscheduler 如果不是唯一的调度平台,就像我,还有公司自研的调度平台,两个平台怎么互相依赖,
- 就可以采用读取平台后台表的方式,来解决
相关推荐
- IntelliJ IDEA插件开发(java开发idea插件)
-
引言IntelliJIDEA是JetBrains公司开发的一款广受欢迎的集成开发环境(IDE)。它不仅支持Java等多种编程语言,还通过插件系统提供了强大的扩展能力。本分享旨在介绍如何使用Java开...
- 如何验证自己的idea或者如何产生idea?小编教你如何检索……
-
申请专利前首先要做的是检索查重,如果你的构思已经被别人申请过专利,那么就不符合专利“新颖性”的要求。因此,如果你有了idea之后如何验证自己的idea具备新颖性,或者如何产生idea呢?今天,小编带着...
- idea激活码失效了,这样解决,稳定使用!
-
最近官网封控比较严格,正式版激活码是不是又掉线了?掉线请看这里,这里有一个解决的方法,就是让工具不联网就可以继续使用激活码了。激活码本来就叫离线激活码,现在要怎么使id工具不联网?·可以打开这里帮助,...
- 5分钟解决 IntelliJ IDEA 使用问题(免费激活至 2100 年)
-
直接进入正题!效果安装1.官网下载idea...
- 【中高级前端必看】- 结合代码实践,全面学习前端工程化
-
前言前端工程化,简而言之就是软件工程+前端,以自动化的形式呈现。就个人理解而言:前端工程化,从开发阶段到代码发布生产环境,包含了以下几个内容:开发构建测试部署...
- Android绘制流程(android界面绘制)
-
Android绘制流程来源:极客头条MFC、WTL、DuiLib、QT、Skia、OpenGL。Android里面的画图分为2D和3D两种:2D是由Skia来实现的,3D部分是由OpenGL实现...
- ExpandListView 的一种巧妙写法(g的另一种写法上下两个圈连起来怎么打)
-
ExpandListView大家估计也用的不少了,一般有需要展开的需求的时候,大家不约而同的都想到了它然后以前自己留过记录的一般都会找找以前自己的代码,没有记录习惯的就会百度、谷歌,这里吐槽一下,好几...
- 通过圆形载入View了解自定义View(圆形div怎么搞)
-
这是自定义View的第一篇文章,通过制作简单的自定义View来了解自定义View的流程。自定义View是Android学习和开发中必不可少的一部分。通过自定义View我们可以制作丰富绚丽的控件,自定...
- 鸿蒙开源第三方组件——自定义流式布局组件FlowLayout_ohos
-
前言基于安卓平台的自定义流式布局组件FlowLayout(https://blog.csdn.net/fzhhsa/article/details/103003019),实现了鸿蒙的功能化迁移和重构...
- 手把手带你写FlowLayout(流式布局)
-
流式布局在android中主要应用在搜索记录和用户标签,下面是效果图首先我们分析流式布局的原理。其实就是当一个子view加上之前的子view的宽度超过了父容器的宽度的时候就换行。接下来我们手把手书写流...
- Android View(android view使用mvvm架构)
-
AndroidUI界面架构每个Activity包含一个PhoneWindow对象,PhoneWindow设置DecorView为应用窗口的根视图,在里面就是TitleView和ContentView...
- 《教你步步为营掌握自定义View》一文读后感
-
今天读了简书作者[milter]的一篇文章《教你步步为营掌握自定义View》,大有裨益。作者以幽默风趣、通俗易懂的大白话一步步讲述了View的来龙去脉,甚是详尽,实属自定义View文集中的一篇非常优秀...
- Android面试官:你究竟有多大的勇气,在简历上写了“精通”?
-
所周知,简历上“了解=听过名字;熟悉=知道是啥;熟练=用过;精通=做过东西”。最近在面试,我现在十分后悔在简历上写了“精通”二字…先给大家看看我简历上的技能清单:良好的java基础,熟悉掌握面向对象思...
- iOS 视图---动画渲染机制探究(动画渲染用哪个软件最好)
-
腾讯Bugly特约作者:陈向文终端的开发,首当其冲的就是视图、动画的渲染,切换等等。用户使用App时最直接的体验就是这个界面好不好看,动画炫不炫,滑动流不流畅。UI就是App的门面,它的体验伴...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- IntelliJ IDEA插件开发(java开发idea插件)
- 如何验证自己的idea或者如何产生idea?小编教你如何检索……
- idea激活码失效了,这样解决,稳定使用!
- 5分钟解决 IntelliJ IDEA 使用问题(免费激活至 2100 年)
- 【中高级前端必看】- 结合代码实践,全面学习前端工程化
- Android绘制流程(android界面绘制)
- ExpandListView 的一种巧妙写法(g的另一种写法上下两个圈连起来怎么打)
- 通过圆形载入View了解自定义View(圆形div怎么搞)
- 鸿蒙开源第三方组件——自定义流式布局组件FlowLayout_ohos
- 「经典总结」一个View,从无到有会走的三个流程,你知道吗?
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)