什么是错误缓冲堆栈呢? 举个非常简单的样例,比方运行以下一条语句:
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环境下,我要这样写一段繁杂的代码来获取错误信息。

  1. DELIMITER $$
  2.  
  3. USE `new_feature`$$
  4.  
  5. DROP PROCEDURE IF EXISTS `sp_do_insert`$$
  6.  
  7. CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_do_insert`(
  8. IN f_id INT,
  9. IN f_log_time VARCHAR(255),
  10. IN f_end_time VARCHAR(255)
  11. )
  12. BEGIN
  13. DECLARE done1 TINYINT DEFAULT 0; -- 保存是否发生异常的布尔值。
  14.  
  15. DECLARE i TINYINT DEFAULT 1;
  16. DECLARE v_errcount INT DEFAULT 0; -- 获取一次错误数据条数
  17. DECLARE v_errno INT DEFAULT 0; -- 获取错误代码
  18. DECLARE v_msg TEXT; -- 获取错误具体信息
  19. DECLARE CONTINUE HANDLER FOR SQLEXCEPTION -- 定义一个异常处理块
  20. BEGIN
  21. SET done1 = 1; -- 发生异常,设置为1.
  22. get diagnostics v_errcount = number;
  23. SET v_msg = '';
  24. WHILE i <= v_errcount
  25. DO
  26. GET DIAGNOSTICS CONDITION i
  27. v_errno = MYSQL_ERRNO, v_msg = MESSAGE_TEXT;
  28. SET @stmt = CONCAT('select ',v_errno,',"',v_msg,'","',NOW(),'" into @errno',i,',@msg',i,',@log_timestamp',i,';');
  29. PREPARE s1 FROM @stmt;
  30. EXECUTE s1;
  31. SET i = i + 1;
  32. END WHILE;
  33. DROP PREPARE s1;
  34. END;
  35. INSERT INTO t_datetime (id,log_time,end_time) VALUES(f_id,f_log_time,f_end_time);
  36. IF done1 = 1 THEN -- 把错误数据记录到表tb_log里。
  37.  
  38. SET i = 1;
  39. WHILE i <= v_errcount
  40. DO
  41. SET @stmt = CONCAT('insert into tb_log ');
  42. SET @stmt = CONCAT(@stmt,' select @errno',i,',@msg',i,',@log_timestamp');
  43. PREPARE s1 FROM @stmt;
  44. EXECUTE s1;
  45. SET i = i + 1;
  46. END WHILE;
  47. DROP PREPARE s1;
  48. END IF;
  49. END$$
  50.  
  51. DELIMITER ;

MySQL5.7公布后。如今能够精简我的代码了。

  1. DELIMITER $$
  2.  
  3. USE `new_feature`$$
  4.  
  5. DROP PROCEDURE IF EXISTS `sp_do_insert`$$
  6.  
  7. CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_do_insert`(
  8. IN f_id INT,
  9. IN f_log_time VARCHAR(255),
  10. IN f_end_time VARCHAR(255)
  11. )
  12. BEGIN
  13. DECLARE i TINYINT DEFAULT 1;
  14. DECLARE v_errcount INT DEFAULT 0; -- 获取一次错误数据条数
  15. DECLARE v_errno INT DEFAULT 0; -- 获取错误代码
  16. DECLARE v_msg TEXT; -- 获取错误具体信息
  17. DECLARE CONTINUE HANDLER FOR SQLEXCEPTION -- 定义一个异常处理块
  18. BEGIN
  19. get stacked diagnostics v_errcount = number;
  20. WHILE i <= v_errcount
  21. DO
  22. GET stacked DIAGNOSTICS CONDITION i -- 把错误数据分别保存在变量里
  23. v_errno = MYSQL_ERRNO, v_msg = MESSAGE_TEXT;
  24. INSERT INTO tb_log VALUES (v_errno,v_msg,NOW());
  25. SET i = i + 1;
  26. END WHILE;
  27. END;
  28. INSERT INTO t_datetime (id,log_time,end_time) VALUES(f_id,f_log_time,f_end_time);
  29. END$$
  30.  
  31. DELIMITER ;

如今来运行下:
mysql> call sp_do_insert(2,'4','5');
Query OK, 1 row affected (0.01 sec)

来检索表tb_log的数据。

  1. mysql> select * from tb_log\G
  2. *************************** 1. row ***************************
  3. errorno: 1265
  4. errortext: Data truncated for column 'log_time' at row 1
  5. error_timestamp: 2015-11-17 11:53:10
  6. *************************** 2. row ***************************
  7. errorno: 1265
  8. errortext: Data truncated for column 'end_time' at row 1
  9. error_timestamp: 2015-11-17 11:53:10
  10. *************************** 3. row ***************************
  11. errorno: 1062
  12. errortext: Duplicate entry '2' for key 'PRIMARY'
  13. error_timestamp: 2015-11-17 11:53:10
  14. 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 1811

    使用Pollard_rho算法就可以过了 #include <iostream> #include <cstdio> #include <algorithm> #i ...

  2. 在ActivityA中关闭还有一个ActivityB

    1.对于简单的两个Activity public class A_activity extends Activity { public static A_activity _instance = nu ...

  3. EJB学习(四)——Enterprise Bean(企业Bean)和Entity Bean(实体Bean)

        一.为什么使用EJB ? 企业Bean执行在EJB容器中.企业Bean实际上就是一个封装了业务逻辑的Java类,那么我们为什么要使用EJB呢 ? 1.最重要的原因:分布式.简要的说,分布式能够 ...

  4. Oracle数据的基本操作

    一.什么是Oracle 在学习DRP系统之前,非常多次提到过Oracle,也了解过,那么Oracle是什么?今天我最终揭开了它的神奇面纱. Oracle:是一个公司.当然我在这里说的是Oracle数据 ...

  5. 去哪网实习总结:JavaWeb中文传參乱码问题的解决(JavaWeb)

    本来是以做数据挖掘的目的进去哪网的.结构却成了系统开发... 只是还是比較认真的做了三个月.老师非常认同我的工作态度和成果... 实习立即就要结束了,总结一下几点之前没有注意过的变成习惯和问题,分享给 ...

  6. 【PLSQL】触发器trigger类型,状态,參数

    ************************************************************************   ****原文:blog.csdn.net/clar ...

  7. [Golang] 从零開始写Socket Server(3): 对长、短连接的处理策略(模拟心跳)

    通过前两章,我们成功是写出了一套凑合能用的Server和Client,并在二者之间实现了通过协议交流.这么一来,一个简易的socket通讯框架已经初具雏形了,那么我们接下来做的.就是想办法让这个框架更 ...

  8. 0x04 二分

    二分.三分其实没什么.. 但是真心觉得市面上的朴素二分打法千奇百怪,假如是像我的标程应该是比较稳妥的,然而poj2018那题(前缀和又想起来了)是向下取整,精度有点问题(经常拍出一些什么xxx.999 ...

  9. 捣鼓TinyMCE 粘贴图片并上传+Django后台

    前面一篇写了上传到Flask后台,但是我不熟悉Flask,原先想学习一下,据说是轻量级. 但是我发现,学习会浪费我大量的时间,因为我并不是以这个为生的,我的目标只是要完成功能,让我自己能尽早使用起来, ...

  10. 39.Qt XML

    1.使用QXmlStreamReader读取XML,可以读取内存中容纳不了的特大文件,或者读取在XML文档中定制的文档的内容. xml文件(in1.xml) <?xml version=&quo ...