继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

【原创】MySQL 在读取异常错误缓冲区方面的提升(MySQL5.6)

largeQ
关注TA
已关注
手记 824
粉丝 92
获赞 585


 先来解释下什么是错误缓冲区?

在MySQL里面, 错误缓冲区只记录最近一次出现的错误, 只要是有新的错误产生,旧的就会被覆盖掉。 所以想知道产生了什么错误,

就得在每个有可能发生错误的语句后面紧跟着"show warnings" 或者 "show errors"。 最简单的方法是把输出的结果重定向到自己定义的

日志文件里面,这样就可以方便后续查看。当然如果想随时查看这些错误,我们就得通过MySQL提供的API来实现。

 

 

自从MySQL 5.6 这个革命性的版本出现后,问题得到了初步解决。虽然离我们想的还差好多。

 

MySQL 5.6 提供了 get diagnostic 语句来获取错误缓冲区的内容,然后把这些内容输出到不同范围域的变量里,以便我们后续灵活操作。

 

下来,我们就来看一个例子。

 

 

 

针对的表结构为:

 

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 

 

存储过程代码为:

 

 

DELIMITER $$ 

 

USE `new_t`$$ 

 

DROP PROCEDURE IF EXISTS `sp_do_update`$$ 

 

CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_do_update`( 

    IN f_id INT, 

    IN f_log_time VARCHAR(255), 

    IN f_end_time VARCHAR(255) 

    ) 

BEGIN 

      DECLARE i_con1 TINYINT DEFAULT 0; 

      DECLARE i_code CHAR(5) DEFAULT '00000'; 

      DECLARE i_msg TEXT; 

      DECLARE i_rows INT; 

      DECLARE i_con1 CONDITION FOR 1048; -- 这个错误代码代表字段限制不能NULL。 

      DECLARE CONTINUE HANDLER FOR i_con1 

      BEGIN 

        SET i_con1 = 1; 

        get diagnostics CONDITION 1 

          i_code = returned_sqlstate, i_msg = message_text; 

      END; 

      UPDATE t_datetime  

      SET log_time = IFNULL(f_log_time,NULL),  

          end_time = IFNULL(f_end_time,NULL)  

      WHERE id = f_id; 

      IF i_con1 = 0 THEN 

        get diagnostics i_rows = ROW_COUNT; 

        SET @i_result = CONCAT("Update succeeded, affected ", i_rows,'.'); 

      ELSE 

        SET @i_result = CONCAT('Update failed, error code is 1042, related message is ',i_msg,'.'); 

      END IF; 

      SELECT @i_result; 

    END$$ 

 

DELIMITER ; 

 

 

 

我们来执行上面的存储过程,完了后,就能把错误信息保存到SESSION 变量@i_result 中。这样,方便了后期进行各种输出。

 

 

CALL sp_do_update(1,NOW(),DATE_ADD(NOW(),INTERVAL 1 DAY)); 

Result. 

Update succeeded, affected 1. 

 

CALL sp_do_update(1,NULL,NULL); 

Result. 

Update failed, error code is 1042, related message is Column 'log_time' cannot be null. 

 

©著作权归作者所有:来自51CTO博客作者david_yeung的原创作品,如需转载,请注明出处,否则将追究法律责任

mysqlinnodbstore procedureMySQL性能优化


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP