mysql存储过程加异常监控

-- 日志记录表
DROP TABLE IF EXISTS `proc_exec_log`;
CREATE TABLE `proc_exec_log` (
  `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `proc_name` varchar(100) DEFAULT NULL COMMENT '存储过程名称',
  `begin_time` datetime DEFAULT NULL COMMENT '开始时间',
  `end_time` datetime DEFAULT NULL COMMENT '结束时间',
  `exec_cost_time_s` float DEFAULT NULL COMMENT '执行时间,秒',
  `exec_status` varchar(10) DEFAULT NULL COMMENT '执行状态',
  `exec_msg` text COMMENT '异常信息',
  PRIMARY KEY (`id`),
  KEY `idx_begin_time` (`begin_time`),
  KEY `idx_end_time` (`end_time`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='日志记录';

-- 插入日志的方法
DROP PROCEDURE IF EXISTS `proc_insert_log`;
DELIMITER ;;
CREATE PROCEDURE `proc_insert_log`(IN pName varchar(250),IN startTime datetime,IN endTime datetime,IN pStatus varchar(10),IN pMsg text)
BEGIN
-- 记录存储过程执行日志
INSERT INTO proc_exec_log(`proc_name`,`begin_time`,`end_time`,`exec_status`,`exec_msg`,`exec_cost_time_s`)VALUES(pName,startTime,endTime,pStatus,pMsg,timestampdiff(SECOND,startTime,endTime));
END
;;
DELIMITER ;

-- 业务存储过程
DROP PROCEDURE IF EXISTS `xxx`;
DELIMITER ;;
CREATE  PROCEDURE `xxx`()
BEGIN 
	-- 设置日志变量
	DECLARE log_name varchar(255);
	DECLARE log_starttime datetime;
	DECLARE log_endtime datetime;
	DECLARE result_code varchar(10) DEFAULT '0';
	DECLARE result_msg text;

	-- 捕获异常
	DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
	BEGIN
		-- 获取异常code,异常信息
		GET DIAGNOSTICS CONDITION 1
			result_code = RETURNED_SQLSTATE, result_msg = MESSAGE_TEXT;
			SET log_endtime = now();
			-- 插入日志
			CALL p_insert_log(log_name,log_starttime,log_endtime,result_code,result_msg);
	END;

	SET log_name = 'xxx';
	SET log_starttime = now();

        -- 业务开始

        -- 业务结束

	-- 记录日志
	CALL p_insert_log(log_name,log_starttime,now(),'0','success');
END
;;
DELIMITER ;

posted @ 2020-03-16 15:28  剑小破  阅读(511)  评论(0编辑  收藏  举报