【原创】mysql 错误缓冲堆栈_MySQL
什么是错误缓冲堆栈呢? 举个很简单的例子,比如执行下面一条语句:
mysql>INSERTINTOt_datetimeVALUES(2,'4','5'); ERROR1292(22007):Incorrectdatetimevalue:'4'forcolumn'log_time'atrow1
上面1292这个代码指示的错误信息保存在哪里呢? 就保存在错误缓冲堆栈, 在MySQL里面叫 DIAGNOSTICS AREA。 关于这个概念,一直在MySQL5.7才得到确定的更新。
在MySQL5.5之前,想要得到这块区域的数据,就只能通过C的API来获取,从SQL层面是无法检索到的。MySQL5.5 先推出了这个概念。
在MySQL5.6发布后,不但可以检索这块区域,而且还可以重新封装,得到我们想要的数据。但是这块区域依然是只能保存一次错误代码,很容易被重置。
在MySQL5.7发布后,可以更加容易的检索这块区域,而且把这里的数据放到一个STACK里,重置的条件更加宽松。以下举例子来说明。
示例表结构如下,
CREATETABLE`t_datetime`( `id`int(11)NOTNULL, `log_time`timestampNOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP, `end_time`datetimeNOTNULL, PRIMARYKEY(`id`) )ENGINE=InnoDBDEFAULTCHARSET=utf8;
用来记录错误数据的日志表。
CREATETABLEtb_log(errornoint,errortextTEXT,error_timestampDATETIME);
在MySQL5.6环境下,我要这样写一段繁杂的代码来获取错误信息。
DELIMITER$$ USE`new_feature`$$ DROPPROCEDUREIFEXISTS`sp_do_insert`$$ CREATEDEFINER=`root`@`localhost`PROCEDURE`sp_do_insert`( INf_idINT, INf_log_timeVARCHAR(255), INf_end_timeVARCHAR(255) ) BEGIN DECLAREdone1TINYINTDEFAULT0;--保存是否发生异常的布尔值。 DECLAREiTINYINTDEFAULT1; DECLAREv_errcountINTDEFAULT0;--获取一次错误数据条数 DECLAREv_errnoINTDEFAULT0;--获取错误代码 DECLAREv_msgTEXT;--获取错误详细信息 DECLARECONTINUEHANDLERFORSQLEXCEPTION--定义一个异常处理块 BEGIN SETdone1=1;--发生异常,设置为1. getdiagnosticsv_errcount=number; SETv_msg=''; WHILEi<=v_errcount DO GETDIAGNOSTICSCONDITIONi 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,';'); PREPAREs1FROM@stmt; EXECUTEs1; SETi=i+1; ENDWHILE; DROPPREPAREs1; END; INSERTINTOt_datetime(id,log_time,end_time)VALUES(f_id,f_log_time,f_end_time); IFdone1=1THEN--把错误数据记录到表tb_log里。 SETi=1; WHILEi<=v_errcount DO SET@stmt=CONCAT('insertintotb_log'); SET@stmt=CONCAT(@stmt,'select@errno',i,',@msg',i,',@log_timestamp'); PREPAREs1FROM@stmt; EXECUTEs1; SETi=i+1; ENDWHILE; DROPPREPAREs1; ENDIF; END$$ DELIMITER;
MySQL5.7发布后,现在可以精简我的代码了。
DELIMITER$$ USE`new_feature`$$ DROPPROCEDUREIFEXISTS`sp_do_insert`$$ CREATEDEFINER=`root`@`localhost`PROCEDURE`sp_do_insert`( INf_idINT, INf_log_timeVARCHAR(255), INf_end_timeVARCHAR(255) ) BEGIN DECLAREiTINYINTDEFAULT1; DECLAREv_errcountINTDEFAULT0;--获取一次错误数据条数 DECLAREv_errnoINTDEFAULT0;--获取错误代码 DECLAREv_msgTEXT;--获取错误详细信息 DECLARECONTINUEHANDLERFORSQLEXCEPTION--定义一个异常处理块 BEGIN getstackeddiagnosticsv_errcount=number; WHILEi<=v_errcount DO GETstackedDIAGNOSTICSCONDITIONi--把错误数据分别保存在变量里 v_errno=MYSQL_ERRNO,v_msg=MESSAGE_TEXT; INSERTINTOtb_logVALUES(v_errno,v_msg,NOW()); SETi=i+1; ENDWHILE; END; INSERTINTOt_datetime(id,log_time,end_time)VALUES(f_id,f_log_time,f_end_time); END$$ DELIMITER;
现在来执行下:
mysql>callsp_do_insert(2,'4','5'); QueryOK,1rowaffected(0.01sec)
来检索表tb_log的数据。
mysql>select*fromtb_log\G ***************************1.row*************************** errorno:1265 errortext:Datatruncatedforcolumn'log_time'atrow1 error_timestamp:2015-11-1711:53:10 ***************************2.row*************************** errorno:1265 errortext:Datatruncatedforcolumn'end_time'atrow1 error_timestamp:2015-11-1711:53:10 ***************************3.row*************************** errorno:1062 errortext:Duplicateentry'2'forkey'PRIMARY' error_timestamp:2015-11-1711:53:10 3rowsinset(0.00sec)
总结下, 如果先用到DIAGNOSTICS AREA, 最好是在存储过程里面写代码封装SQL。
以上就是【原创】mysql 错误缓冲堆栈_MySQL的内容,更多相关内容请关注PHP中文网(www.php.cn)!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

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

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

MySQL 數據庫中,用戶和數據庫的關係通過權限和表定義。用戶擁有用戶名和密碼,用於訪問數據庫。權限通過 GRANT 命令授予,而表由 CREATE TABLE 命令創建。要建立用戶和數據庫之間的關係,需創建數據庫、創建用戶,然後授予權限。

MySQL 有免費的社區版和收費的企業版。社區版可免費使用和修改,但支持有限,適合穩定性要求不高、技術能力強的應用。企業版提供全面商業支持,適合需要穩定可靠、高性能數據庫且願意為支持買單的應用。選擇版本時考慮的因素包括應用關鍵性、預算和技術技能。沒有完美的選項,只有最合適的方案,需根據具體情況謹慎選擇。

數據集成簡化:AmazonRDSMySQL與Redshift的零ETL集成高效的數據集成是數據驅動型組織的核心。傳統的ETL(提取、轉換、加載)流程複雜且耗時,尤其是在將數據庫(例如AmazonRDSMySQL)與數據倉庫(例如Redshift)集成時。然而,AWS提供的零ETL集成方案徹底改變了這一現狀,為從RDSMySQL到Redshift的數據遷移提供了簡化、近乎實時的解決方案。本文將深入探討RDSMySQL零ETL與Redshift集成,闡述其工作原理以及為數據工程師和開發者帶來的優勢。

要填寫 MySQL 用戶名和密碼,請:1. 確定用戶名和密碼;2. 連接到數據庫;3. 使用用戶名和密碼執行查詢和命令。

1.使用正確的索引索引通過減少掃描的數據量來加速數據檢索select*fromemployeeswherelast_name='smith';如果多次查詢表的某一列,則為該列創建索引如果您或您的應用根據條件需要來自多個列的數據,則創建複合索引2.避免選擇*僅選擇那些需要的列,如果您選擇所有不需要的列,這只會消耗更多的服務器內存並導致服務器在高負載或頻率時間下變慢例如,您的表包含諸如created_at和updated_at以及時間戳之類的列,然後避免選擇*,因為它們在正常情況下不需要低效查詢se

MySQL適合初學者使用,因為它安裝簡單、功能強大且易於管理數據。 1.安裝和配置簡單,適用於多種操作系統。 2.支持基本操作如創建數據庫和表、插入、查詢、更新和刪除數據。 3.提供高級功能如JOIN操作和子查詢。 4.可以通過索引、查詢優化和分錶分區來提升性能。 5.支持備份、恢復和安全措施,確保數據的安全和一致性。

MySQL數據庫性能優化指南在資源密集型應用中,MySQL數據庫扮演著至關重要的角色,負責管理海量事務。然而,隨著應用規模的擴大,數據庫性能瓶頸往往成為製約因素。本文將探討一系列行之有效的MySQL性能優化策略,確保您的應用在高負載下依然保持高效響應。我們將結合實際案例,深入講解索引、查詢優化、數據庫設計以及緩存等關鍵技術。 1.數據庫架構設計優化合理的數據庫架構是MySQL性能優化的基石。以下是一些核心原則:選擇合適的數據類型選擇最小的、符合需求的數據類型,既能節省存儲空間,又能提升數據處理速度

數據庫ACID屬性詳解ACID屬性是確保數據庫事務可靠性和一致性的一組規則。它們規定了數據庫系統處理事務的方式,即使在系統崩潰、電源中斷或多用戶並發訪問的情況下,也能保證數據的完整性和準確性。 ACID屬性概述原子性(Atomicity):事務被視為一個不可分割的單元。任何部分失敗,整個事務回滾,數據庫不保留任何更改。例如,銀行轉賬,如果從一個賬戶扣款但未向另一個賬戶加款,則整個操作撤銷。 begintransaction;updateaccountssetbalance=balance-100wh
