什么是错误缓冲堆栈呢? 举个非常简单的样例,比方运行以下一条语句:
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 的 错误堆栈缓冲的更多相关文章

  1. 在jsp页面上打印错误堆栈

    try{ .................... } catch(Exception e){ //定义一个流 ByteArrayOutputStream ostr = new ByteArrayOu ...

  2. 工作经验:Java 系统记录调用日志,并且记录错误堆栈

    前言:现在有一个系统,主要是为了给其他系统提供数据查询接口的,这个系统上线不会轻易更新,更不会跟随业务系统的更新而更新(这也是有一个数据查询接口系统的原因,解耦).这时,这个系统就需要有一定的方便的线 ...

  3. logger.error打印完整的错误堆栈信息

    使用Spring Boot项目中的日志打印功能的时候,发现调用Logger.errror()方法的时候不能完全地打印出网站的错误堆栈信息,只能打印出这个错误是一个什么错误. 为什么呢,原因在于这个方法 ...

  4. 利用Decorator和SourceMap优化JavaScript错误堆栈

    配合源码阅读体验更佳. 最近收到用户吐槽 @cloudbase/js-sdk(云开发Cloudbase的JavaScript SDK)的报错信息不够清晰,比如下面这条报错: 这属于业务型报错,对于熟悉 ...

  5. 利用Backtrace来捕获段错误堆栈信息

    具体参考文档:https://blog.csdn.net/gatieme/article/details/84189280 测试Demo: #include <execinfo.h> #i ...

  6. Mysql5.6 make 错误以及解决办法

    1.若make出现类似错误: CMake Error: CMake was unable to find a build program corresponding to "Unix Mak ...

  7. Mysql5.7 的错误日志中最常见的note级别日志解释

          在使用mysql5.7的时候,发现了不少在mysql5.6上不曾见过的日志,级别为note, 最常见的note日志以下三种,下面我们来逐个解释. 第一种,Aborted connectio ...

  8. Mysql5.7登录错误1045和1130的解决方法,亲测有用,希望能帮助到你们。

    Mysql (针对Mysql5.7版本,其他版本可能略有不同) 错误:1045 解决方法: 以管理员身份运行cmd(win8系统:win+x 键 ,再按 A键 ),进入Mysql安装目录下的bin目录 ...

  9. Mysql5.7安装错误处理与主从同步及!

    basedir=/iddbs/mysql-5.7.16 datadir=/iddbs/mysql5.7/data3306 一.自定义Mysql.5.7版本免编译安装: 1.Db-server1安装前期 ...

随机推荐

  1. 【POJ 3273】 Monthly Expense (二分)

    [POJ 3273] Monthly Expense (二分) 一个农民有块地 他列了个计划表 每天要花多少钱管理 但他想用m个月来管理 就想把这个计划表切割成m个月来完毕 想知道每一个月最少花费多少 ...

  2. 广东工业大学2016校赛决赛-网络赛 1169 Problem A: Krito的讨伐 优先队列

    Problem A: Krito的讨伐 Description Krito终于干掉了99层的boss,来到了第100层.第100层可以表示成一颗树,这棵树有n个节点(编号从0到n-1),树上每一个节点 ...

  3. c6----函数的声明和实现

    // // main.c // 函数的声明和定义 // // Created by xiaomage on 15/6/7. // Copyright (c) 2015年 xiaomage. All r ...

  4. mysqli数据库操作简单实例

    mysqli数据库操作简单实例 代码 结果

  5. Java-杂项:Java数组Array和集合List、Set、Map

    ylbtech-Java-杂项:Java数组Array和集合List.Set.Map 1.返回顶部 1. 之前一直分不清楚java中的array,list.同时对set,map,list的用法彻底迷糊 ...

  6. CALayer初认识

    CALayer :CA就是coreAnimation 核心动画 它是同时支持 Mac OS 和 iOS系统的 所有的核心动画都是通过CALayer来实现的 UIView本身是不具备显示功能的 是它内部 ...

  7. SQL学习——小结练习(1)

    到处淘来的SQL题 1. 用一条SQL 语句 查询出每门课都大于80 分的学生姓名 name   kecheng   fenshu 张三     语文       81张三     数学       ...

  8. c# rc4算法,加密解密类

    rc4算法,原理,以密匙生成256位的密匙流,然后以车轮式滚过源数据异或加密. /* * 由SharpDevelop创建. * 用户: YISH * 日期: 04/04/2015 * 时间: 03:0 ...

  9. asp实现阿里大鱼短信API接口的方法

    阿里大鱼是阿里推出的产品,官方提供JAVA..NET.PHP等版本的SDK下载,不知为何,唯独不提供ASP版本的SDK. 不提供没关系,自己写就是了,参照官方提供的API写一个就是了. 本来以为无非是 ...

  10. windows下git server搭建

    使用gitblit1.8搭建 首先要安装JDK 然后下载gitblit,这里给一个CSDN下载 https://download.csdn.net/download/nietzsche0/104826 ...