MySQL5.7 的 错误堆栈缓冲
mysql> INSERT INTO t_datetime VALUES(2,'4','5');
ERROR 1292 (22007): Incorrect datetime value: '4' for column 'log_time' at row 1
上面1292这个代码指示的错误信息保存在哪里呢? 就保存在错误缓冲堆栈。 在MySQL里面叫 DIAGNOSTICS AREA。 关于这个概念。一直在MySQL5.7才得到确定的更新。
在MySQL5.5之前。想要得到这块区域的数据。就仅仅能通过C的API来获取,从SQL层面是无法检索到的。MySQL5.5 先推出了这个概念。
在MySQL5.6公布后,不但能够检索这块区域,并且还能够又一次封装,得到我们想要的数据。可是这块区域依旧是仅仅能保存一次错误代码。非常easy被重置。
在MySQL5.7公布后,能够更加easy的检索这块区域,并且把这里的数据放到一个STACK里,重置的条件更加宽松。以下举样例来说明。
演示样例表结构例如以下,
CREATE TABLE `t_datetime` (
`id` int(11) NOT NULL,
`log_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`end_time` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
用来记录错误数据的日志表。
CREATE TABLE tb_log (errorno int,errortext TEXT,error_timestamp DATETIME);
在MySQL5.6环境下,我要这样写一段繁杂的代码来获取错误信息。
DELIMITER $$ USE `new_feature`$$ DROP PROCEDURE IF EXISTS `sp_do_insert`$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_do_insert`(
IN f_id INT,
IN f_log_time VARCHAR(255),
IN f_end_time VARCHAR(255)
)
BEGIN
DECLARE done1 TINYINT DEFAULT 0; -- 保存是否发生异常的布尔值。 DECLARE i TINYINT DEFAULT 1;
DECLARE v_errcount INT DEFAULT 0; -- 获取一次错误数据条数
DECLARE v_errno INT DEFAULT 0; -- 获取错误代码
DECLARE v_msg TEXT; -- 获取错误具体信息
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION -- 定义一个异常处理块
BEGIN
SET done1 = 1; -- 发生异常,设置为1.
get diagnostics v_errcount = number;
SET v_msg = '';
WHILE i <= v_errcount
DO
GET DIAGNOSTICS CONDITION i
v_errno = MYSQL_ERRNO, v_msg = MESSAGE_TEXT;
SET @stmt = CONCAT('select ',v_errno,',"',v_msg,'","',NOW(),'" into @errno',i,',@msg',i,',@log_timestamp',i,';');
PREPARE s1 FROM @stmt;
EXECUTE s1;
SET i = i + 1;
END WHILE;
DROP PREPARE s1;
END;
INSERT INTO t_datetime (id,log_time,end_time) VALUES(f_id,f_log_time,f_end_time);
IF done1 = 1 THEN -- 把错误数据记录到表tb_log里。 SET i = 1;
WHILE i <= v_errcount
DO
SET @stmt = CONCAT('insert into tb_log ');
SET @stmt = CONCAT(@stmt,' select @errno',i,',@msg',i,',@log_timestamp');
PREPARE s1 FROM @stmt;
EXECUTE s1;
SET i = i + 1;
END WHILE;
DROP PREPARE s1;
END IF;
END$$ DELIMITER ;
MySQL5.7公布后。如今能够精简我的代码了。
DELIMITER $$ USE `new_feature`$$ DROP PROCEDURE IF EXISTS `sp_do_insert`$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_do_insert`(
IN f_id INT,
IN f_log_time VARCHAR(255),
IN f_end_time VARCHAR(255)
)
BEGIN
DECLARE i TINYINT DEFAULT 1;
DECLARE v_errcount INT DEFAULT 0; -- 获取一次错误数据条数
DECLARE v_errno INT DEFAULT 0; -- 获取错误代码
DECLARE v_msg TEXT; -- 获取错误具体信息
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION -- 定义一个异常处理块
BEGIN
get stacked diagnostics v_errcount = number;
WHILE i <= v_errcount
DO
GET stacked DIAGNOSTICS CONDITION i -- 把错误数据分别保存在变量里
v_errno = MYSQL_ERRNO, v_msg = MESSAGE_TEXT;
INSERT INTO tb_log VALUES (v_errno,v_msg,NOW());
SET i = i + 1;
END WHILE;
END;
INSERT INTO t_datetime (id,log_time,end_time) VALUES(f_id,f_log_time,f_end_time);
END$$ DELIMITER ;
如今来运行下:
mysql> call sp_do_insert(2,'4','5');
Query OK, 1 row affected (0.01 sec)
来检索表tb_log的数据。
mysql> select * from tb_log\G
*************************** 1. row ***************************
errorno: 1265
errortext: Data truncated for column 'log_time' at row 1
error_timestamp: 2015-11-17 11:53:10
*************************** 2. row ***************************
errorno: 1265
errortext: Data truncated for column 'end_time' at row 1
error_timestamp: 2015-11-17 11:53:10
*************************** 3. row ***************************
errorno: 1062
errortext: Duplicate entry '2' for key 'PRIMARY'
error_timestamp: 2015-11-17 11:53:10
3 rows in set (0.00 sec)
总结下。 假设先用到DIAGNOSTICS AREA, 最好是在存储过程里面写代码封装SQL。
MySQL5.7 的 错误堆栈缓冲的更多相关文章
- 在jsp页面上打印错误堆栈
try{ .................... } catch(Exception e){ //定义一个流 ByteArrayOutputStream ostr = new ByteArrayOu ...
- 工作经验:Java 系统记录调用日志,并且记录错误堆栈
前言:现在有一个系统,主要是为了给其他系统提供数据查询接口的,这个系统上线不会轻易更新,更不会跟随业务系统的更新而更新(这也是有一个数据查询接口系统的原因,解耦).这时,这个系统就需要有一定的方便的线 ...
- logger.error打印完整的错误堆栈信息
使用Spring Boot项目中的日志打印功能的时候,发现调用Logger.errror()方法的时候不能完全地打印出网站的错误堆栈信息,只能打印出这个错误是一个什么错误. 为什么呢,原因在于这个方法 ...
- 利用Decorator和SourceMap优化JavaScript错误堆栈
配合源码阅读体验更佳. 最近收到用户吐槽 @cloudbase/js-sdk(云开发Cloudbase的JavaScript SDK)的报错信息不够清晰,比如下面这条报错: 这属于业务型报错,对于熟悉 ...
- 利用Backtrace来捕获段错误堆栈信息
具体参考文档:https://blog.csdn.net/gatieme/article/details/84189280 测试Demo: #include <execinfo.h> #i ...
- Mysql5.6 make 错误以及解决办法
1.若make出现类似错误: CMake Error: CMake was unable to find a build program corresponding to "Unix Mak ...
- Mysql5.7 的错误日志中最常见的note级别日志解释
在使用mysql5.7的时候,发现了不少在mysql5.6上不曾见过的日志,级别为note, 最常见的note日志以下三种,下面我们来逐个解释. 第一种,Aborted connectio ...
- Mysql5.7登录错误1045和1130的解决方法,亲测有用,希望能帮助到你们。
Mysql (针对Mysql5.7版本,其他版本可能略有不同) 错误:1045 解决方法: 以管理员身份运行cmd(win8系统:win+x 键 ,再按 A键 ),进入Mysql安装目录下的bin目录 ...
- Mysql5.7安装错误处理与主从同步及!
basedir=/iddbs/mysql-5.7.16 datadir=/iddbs/mysql5.7/data3306 一.自定义Mysql.5.7版本免编译安装: 1.Db-server1安装前期 ...
随机推荐
- [SQL]存储过程建表
create PROC [dbo].CreateUserTable ( @name NVARCHAR(60) ) AS DECLARE @a NVARCHAR(max) SET @a='create ...
- [Beginning SharePoint Designer 2010]Chapter5 主题和样式
本章概要: 1.什么是CSS 2.样式表的组成 3.如何管理CSS适应SPD的工具和特性 4.被SPS使用的关键的CSS类别 5.使用SPD应用样式到你的站点上
- 设计模式之二十:责任链模式(Chain of Responsibility)
感觉这个设计模式和组合模式一样是一种非常巧妙的设计模式,在须要使用它的地方假设不使用这样的设计模式代码会变的非常复杂,可是这样的设计模式的基本原理又是非常easy的. 责任链模式: 通过使多个对象都有 ...
- HDU 4358
看了题解那个弱化版后,马上就去做了HDU 3333这道题,发现有可用的地方.于是往这方面想,主要是处理如何确定一个数出现K次的问题.想到了从左往右把每个数出现的次数记下来,但感觉不是这样,呃,再看别人 ...
- leetCode 66.Plus One (+1问题) 解题思路和方法
Plus One Given a non-negative number represented as an array of digits, plus one to the number. The ...
- [GraphQL] Apollo React Query Component
In this lesson I refactor a React component that utilizes the graphql higher-order component to the ...
- 用jquery ajax做的select菜单,选中的效果
//用server端语言赋值给js变量 var departmentId = '<%=提交的值 %>', deviceId='<%=提交的值 %>' $(fun ...
- 2015.04.21,外语,读书笔记-《Word Power Made Easy》 11 “如何辱骂敌人” SESSION 31
1.no reverence iconoclast([ai'kɔnәklæst] n. 毁坏宗教神像的人, 提倡打破旧习的人)藐视传统.在青年的反叛期很容易出现iconoclasm([ai'kɔnә ...
- System.DirectoryServices Namespace
https://docs.microsoft.com/en-us/dotnet/api/system.directoryservices?view=netframework-4.7 The Syste ...
- pgpool中的配置参数的定义
/* * configuration parameters */typedef struct { char *listen_addresses; /* hostnames/ ...