MySQL5.7的错误堆栈缓冲_MySQL
什么是错误缓冲堆栈呢? 举个很简单的例子,比如执行下面一条语句:
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发布后,不但可以检索这块区域,而且还可以重新封装,得到我们想要的数据。但是这块区域依然是只能保存一次错误代码,很容易被重置。
在MySQL5.7发布后,可以更加容易的检索这块区域,而且把这里的数据放到一个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的错误堆栈缓冲_MySQL的内容,更多相关内容请关注PHP中文网(www.php.cn)!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

MySQL在Web应用中的主要作用是存储和管理数据。1.MySQL高效处理用户信息、产品目录和交易记录等数据。2.通过SQL查询,开发者能从数据库提取信息生成动态内容。3.MySQL基于客户端-服务器模型工作,确保查询速度可接受。

InnoDB使用redologs和undologs确保数据一致性和可靠性。1.redologs记录数据页修改,确保崩溃恢复和事务持久性。2.undologs记录数据原始值,支持事务回滚和MVCC。

MySQL与其他编程语言相比,主要用于存储和管理数据,而其他语言如Python、Java、C 则用于逻辑处理和应用开发。 MySQL以其高性能、可扩展性和跨平台支持着称,适合数据管理需求,而其他语言在各自领域如数据分析、企业应用和系统编程中各有优势。

MySQL的基本操作包括创建数据库、表格,及使用SQL进行数据的CRUD操作。1.创建数据库:CREATEDATABASEmy_first_db;2.创建表格:CREATETABLEbooks(idINTAUTO_INCREMENTPRIMARYKEY,titleVARCHAR(100)NOTNULL,authorVARCHAR(100)NOTNULL,published_yearINT);3.插入数据:INSERTINTObooks(title,author,published_year)VA

InnoDBBufferPool通过缓存数据和索引页来减少磁盘I/O,提升数据库性能。其工作原理包括:1.数据读取:从BufferPool中读取数据;2.数据写入:修改数据后写入BufferPool并定期刷新到磁盘;3.缓存管理:使用LRU算法管理缓存页;4.预读机制:提前加载相邻数据页。通过调整BufferPool大小和使用多个实例,可以优化数据库性能。

MySQL适合Web应用和内容管理系统,因其开源、高性能和易用性而受欢迎。1)与PostgreSQL相比,MySQL在简单查询和高并发读操作上表现更好。2)相较Oracle,MySQL因开源和低成本更受中小企业青睐。3)对比MicrosoftSQLServer,MySQL更适合跨平台应用。4)与MongoDB不同,MySQL更适用于结构化数据和事务处理。

MySQL通过表结构和SQL查询高效管理结构化数据,并通过外键实现表间关系。1.创建表时定义数据格式和类型。2.使用外键建立表间关系。3.通过索引和查询优化提高性能。4.定期备份和监控数据库确保数据安全和性能优化。

MySQL值得学习,因为它是强大的开源数据库管理系统,适用于数据存储、管理和分析。1)MySQL是关系型数据库,使用SQL操作数据,适合结构化数据管理。2)SQL语言是与MySQL交互的关键,支持CRUD操作。3)MySQL的工作原理包括客户端/服务器架构、存储引擎和查询优化器。4)基本用法包括创建数据库和表,高级用法涉及使用JOIN连接表。5)常见错误包括语法错误和权限问题,调试技巧包括检查语法和使用EXPLAIN命令。6)性能优化涉及使用索引、优化SQL语句和定期维护数据库。
