什么是错误缓冲堆栈呢? 举个非常简单的样例,比方运行以下一条语句:
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. [HTML 5] aria-hidden

    You want to use aria-hidden to prevent screen reader to access some content should be hidden from us ...

  2. 逆向学习XXclient怎样仅仅执行一个实例

    个人觉得学习分两种, 一种是当面请教和直接从书本网络中的资料学习. 其二就是看着令你惊叹的作品-顿悟. 什么?顿悟不了?那我们就一起来逆向学习吧!差点忘了,我并不打算提供Demo,这并不重要,难道你打 ...

  3. DELL灵越 n4030笔记本安装win7之无线网卡驱动安装

    本人安装的是win7 32位专业版,安装完成后发现无线网卡找不到了.DELL灵越 n4030自己带无线网卡的.问题的根源在于无线网卡驱动没有安装或没有安装匹配的无线网卡驱动. 那么问题来了.什么无线网 ...

  4. 基于Linux环境Tomcat-MySQL的server搭建

    在开发日趋激烈的今天.我们可不能再仅仅会编码了.这样搞不好.就成了一辈子的码奴!所以这里简单的分享一下server的搭建,因为Linux的安全性等一切因素让它成为了server平台的首选环境!今天跟大 ...

  5. 使用Android Studo开发NDK之Gradle的配置(能debug C代码)

    配置: 用的版本号是AS1.5(也能够尝试更高版本号). Gradle地址是distributionUrl=https\://services.gradle.org/distributions/gra ...

  6. 【opencv】opencv在vs下的配置(持续更新)

    经常使用配置记录,会更新下去. 1.去掉ipch及.sdf文件 opencv在vs编译会得到很多文件.当中.dsf和ipch文件就有几十M.总是非常占空间,而这都是用来保存C++预编译的头文件和Int ...

  7. 创建逻辑dg

    逻辑备用DG   今天是2014-04-29,近期一直忙的事情,也没来的急写点东西.今天继续整理dg的相关内容,要说的是逻辑dg的创建过程和注意事项. 什么是逻辑dg呢?物理dg类似于主库的完整副本. ...

  8. Beginning Python From Novice to Professional (9) - Socket

    Socket 小型server: #!/usr/bin/env python import socket s = socket.socket() host = socket.gethostname() ...

  9. 什么是BOM头(字节顺序标记(ByteOrderMark))

    在utf-8编码文件中BOM在文件头部,占用三个字节,用来标示该文件属于utf-8编码,现在已经有很多软件识别bom头,但是还有些不能识别bom头,比如PHP就不能识别bom头,这也是用记事本编辑ut ...

  10. ROS-多机通信

    前言:一定要在同一路由的局域网下进行,就是两台电脑的ip要像这样:192.168.191.4和192.168.191.8,只有最后一位不同,这样就能ping通了,否则ping不同. 一.查看ip和主机 ...