`
WindyQin
  • 浏览: 32436 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

关于shell调用MySQL存储过程的问题

 
阅读更多

前天收到一个任务,要统计每天ETL的运行情况,感觉每天从给的SQL语句一个一个的查询影响效率。

就行用写一个存储过程来实现,然后通过shell调用这个存储过程来自动跑数据,写到相应的文件里~

思路就是这样,废话不说,上一下写好的代码。

DELIMITER // 
create procedure sp_etl_info_day (in statis_date int)
begin
declare num_day int default 0;
declare num_month int default 0;
declare num_hour int default 0;
declare num_total int default 0;
declare num_add_lastday int default 0;
declare num_schedule_run int default 0;
declare num_run int default 0;
declare num_succeed int default 0;
declare num_failed int default 0;
declare num_failed1 int default 0;
declare num_killed int default 0;
declare num_waited int default 0;
declare num_norun int default 0;
declare num_man_run int default 0;
declare num_norun_lastday int default 0;
declare rate_wz_etl FLOAT default 0;
declare rate_js_etl FLOAT default 0;
select count(*) into num_day from schedule where isOnline=1 and scheduleOption like "%1#day%";
select count(*) into num_month from schedule where isOnline=1 and scheduleOption like "%1#month%";
select count(*) into num_hour from schedule where isOnline=1 and scheduleOption like "%1#hour%";
set num_total=num_day+num_month+num_hour;
select count(distinct scheduleId) into num_schedule_run from schedule_execution where DATE_FORMAT(startTime,'%Y%m%d')=statis_date and scheduleId in ( select id from schedule where isOnline=1);
select count(*) into num_run from (select count(*) as count, scheduleId,period from schedule_execution where DATE_FORMAT(startTime,'%Y%m%d')=statis_date and scheduleId in ( select id from schedule where isOnline=1) group by scheduleId) a;
select count(*) into num_failed from (select count(*) as count, scheduleId from schedule_execution where DATE_FORMAT(startTime,'%Y%m%d')=statis_date and scheduleId in ( select id from schedule where isOnline=1) and status="Failed" group by scheduleId) a where a.scheduleId not in (select scheduleId from schedule_execution where DATE_FORMAT(startTime,'%Y%m%d')=statis_date and scheduleId in ( select id from schedule where isOnline=1) and status="Succeed" group by scheduleId);
select count(*) into num_killed from (select count(*) as count, scheduleId from schedule_execution where DATE_FORMAT(startTime,'%Y%m%d')=statis_date and scheduleId in ( select id from schedule where isOnline=1) and status="Killed" group by scheduleId) a where a.scheduleId not in (select scheduleId from schedule_execution where DATE_FORMAT(startTime,'%Y%m%d')=statis_date and scheduleId in ( select id from schedule where isOnline=1) and status="Succeed" group by scheduleId);
set num_succeed=num_run-num_failed-num_killed;
set rate_wz_etl=round(num_succeed/num_run,4);
set num_failed1=num_failed+num_killed;
select CONCAT("日:",num_day,"个",",月:",num_month,"个",",小时:",num_hour,"个",",计划运行控制流",num_schedule_run,"个",",共",num_total,"个"
,',昨天共启动控制流:',num_run,'个',',正常执行成功',num_succeed,'个',',报错',num_failed1,'个',',昨天调度运行完整率:',rate_wz_etl) as "ETL日报";
select reserved2, flowName,source from flow where id in (
select originalFlowId from schedule where id in (
select distinct scheduleId from schedule_execution where DATE_FORMAT(startTime,'%Y%m%d')=statis_date and scheduleId in ( select id from schedule where isOnline=1) and status="Failed"
and scheduleId not in(
select scheduleId from schedule_execution where DATE_FORMAT(startTime,'%Y%m%d')=statis_date and scheduleId in ( select id from schedule where isOnline=1) and status="Succeed" )));

end ;//
DELIMITER ;

以上是mysql存储过程~很简单的~

过程写好,下面就开始编写shell调用该存储过程了~

#!/bin/sh  
  
##  用来统计ETL日运行情况  
##  the script is executed at 10 o'clock by every day.  
DATE=$(date +%Y%m%d --date '1 days ago')  
USER=user  
PASSWD=****** 
DATABASE=user  
time=$(date +%Y%m%d --date '1 days ago') 
FILE=/home/mysql/etl_log/log/ETL_$time.txt  

  
echo "the date:"${DATE}  
  
SQL="mysql -u${USER} -p${PASSWD} -D ${DATABASE} -e \"call sp_etl_info_day(${DATE})\""  
echo ${SQL}
echo $SQL>>${FILE} 
 
mysql -u${USER} -p${PASSWD} -D ${DATABASE} -e "call sp_etl_info_day(${DATE})">>$FILE

exit

然后设置crontab就可以了~

以后每天只要去对应的目录下查看文件就行啦~~

省去了不少时间~

我想这大概就是思路,在工作期间,尽量避免重复的工作量,把程序能做的让程序自动做~这样可以更高效的工作~

分享到:
评论

相关推荐

    kettle批量导出mysql存储过程

    总结来说,Kettle批量导出MySQL存储过程涉及到的关键知识点有:Kettle的数据流设计、MySQL的存储过程、数据库元数据获取、循环控制、文件生成和命令行脚本的创建。熟练掌握这些技能,将有助于我们在数据库管理和维护...

    mysql触发器+存储过程

    文件“MySQL存储过程.pdf”和“OReilly.MySQL.Stored.Procedure.Programming.rar”可能会提供关于如何创建、调用和管理MySQL存储过程的详细指南,而“MySQL触发器.rar”则可能包含触发器的创建、使用和优化方面的...

    实例解析MySQL中的存储过程及存储过程的调用方法

    看了如下存储过程实例,你会发现mysql存储过程和shell很像. 下面存储过程内容为:调用存储过程,并且传入用户名,密码参数。存储过程会将这她们存储到process_test表里面.看实例 一,创建数据库 mysql>create ...

    Mysql备份可以执行的shell脚本

    这里我们关注的是使用shell脚本来实现MySQL的自动化备份。shell脚本是一种强大的工具,能够帮助我们编写一系列命令,实现批处理操作,提高工作效率。下面我们将深入探讨如何利用shell脚本来执行MySQL备份。 首先,...

    shell脚本可配置多线程备份mysql5.7.8以后数据库.rar

    最后,关于标签"shell-mysql",它表明这个压缩包内容涉及到的是shell脚本和MySQL数据库的结合使用。shell脚本在这里的作用是管理和控制MySQL数据库的备份操作,而MySQL数据库的版本5.7.8及以上意味着它支持高级特性...

    mysql,linux shell学习进阶.zip

    - 触发器和存储过程:学习编写触发器来响应特定事件,以及创建和调用存储过程以封装复杂的逻辑。 2. Linux Shell基础: - Shell介绍:了解Shell的用途,熟悉常见的Shell类型,如Bash、Sh、Csh等。 - 命令行操作...

    shell简单处理mysql查询结果的方法

    这篇关于“shell简单处理mysql查询结果的方法”的文章旨在介绍如何在shell脚本中有效地处理MySQL查询返回的数据。 首先,我们需要理解shell脚本中的数组和字符串特性。在shell中,数组可以用来存储一组相关的值,...

    mysql-shell

    MySQL Shell 是一个强大的交互式工具,专为管理MySQL服务器、集群和存储引擎而设计。它提供了JavaScript、Python和SQL三种语言环境,使得数据库管理员和开发人员可以更方便地执行各种数据库操作,包括但不限于数据...

    mysql proc

    至于标签中的“工具”,可能是指用来操作 MySQL 存储过程的各种工具,包括官方的 MySQL Shell, 第三方的管理工具,以及集成开发环境(IDE),这些工具可以帮助开发者更高效地管理存储过程。 压缩包中的 "cvsearch" ...

    mysql压力测试脚本实例

    压力测试脚本执行时,可以通过调用这个存储过程,插入大量的数据,观察MySQL服务器的响应时间、CPU使用率、内存占用、磁盘I/O等指标,从而分析其在高并发情况下的表现。此外,还可以使用像sysbench、loadrunner这样...

    自动定时备份远程服务器的mysql数据库并存储在本地

    创建一个shell脚本,用于调用`mysqldump`命令。脚本应包含以下内容: - 登录远程服务器的凭据(用户名、密码)。 - 指定要备份的数据库名。 - 使用`--single-transaction`选项以确保在备份过程中保持数据一致性...

    Oracle+DataX+存储过程实现异构库之间的数据同步

    最后,"Oracle存储过程执行shell脚本"意味着在Oracle数据库内部,我们可以创建存储过程来调用这些shell脚本。存储过程是一组预先编译的SQL语句,可以接受参数,返回结果,甚至执行系统命令。通过存储过程,可以在...

    shell脚本可配置多线程备份mysql5.7.8以后数据库异常sendEmail25发邮件.rar

    本压缩包中的资源主要是关于如何利用shell脚本来配置多线程备份MySQL 5.7.8及以后版本的数据库,并在出现异常时通过sendEmail发送报警邮件。以下将详细讲解这些知识点。 1. **shell脚本**:Shell脚本是一种使用Bash...

    MySQL总结

    例如,`MySql存储过程Demo.txt`可能包含以下内容: ```sql CREATE PROCEDURE example_procedure(IN param1 INT, OUT param2 VARCHAR(50)) BEGIN SELECT column1 INTO param2 FROM table WHERE condition = param1;...

    shell脚本可配置多线程备份mysql5.7.8以后数据库异常mail465发邮件.rar

    总的来说,这个shell脚本提供了一个全面的解决方案,用于自动、高效且安全地备份MySQL数据库,并在出现问题时及时通知管理员。它展示了shell脚本在系统管理和自动化中的强大能力,以及如何集成各种工具以实现复杂的...

    mysql深入浅出

    《MySQL深入浅出》这份讲义全面覆盖了MySQL的基础知识,包括SQL语法、运算符、函数、字符类型以及存储过程等多个重要主题。以下是对这些关键知识点的详细解释: 1. **SQL基础**:SQL(Structured Query Language)...

    使用shell脚本来给mysql加索引的方法

    在本篇文章中,我们将探讨如何使用shell脚本来为MySQL数据库中的表添加索引。 首先,shell脚本是一种在Unix或Linux操作系统上广泛使用的命令行解释器,它可以执行一系列自动化任务,包括数据库操作。在给MySQL加...

    数据库备份Shell脚本.zip

    本文将详细介绍基于Xtrabackup的MySQL数据库备份Shell脚本及其相关知识点。 1. **Xtrabackup介绍**: Xtrabackup是由Percona公司开发的开源备份工具,支持InnoDB和XtraDB存储引擎的全量和增量备份。它能够实现在线...

    linux下安装mysql数据库

    - 添加MySQL路径到环境变量中,以方便在任何位置调用MySQL命令。 ``` echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile source /etc/profile ``` - 重启MySQL服务并在新终端中测试连接。 10. ...

    提供MySQL负载类型、关键统计、慢查询报告等健康信息-Perl-Shell-下载

    Shell脚本可以调用Perl脚本或其他MySQL命令行工具,实现定时执行健康检查。例如,你可以创建一个cron job,每隔一段时间运行一次检查,将结果发送至邮箱或日志文件。 ```bash #!/bin/bash perl mysql_health_check....

Global site tag (gtag.js) - Google Analytics