【原创】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 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック

1.正しいインデックスを使用して、データの量を削減してデータ検索をスピードアップしました。テーブルの列を複数回検索する場合は、その列のインデックスを作成します。あなたまたはあなたのアプリが基準に従って複数の列からのデータが必要な場合、複合インデックス2を作成します2。選択した列のみを避けます。必要な列のすべてを選択すると、より多くのサーバーメモリを使用する場合にのみサーバーが遅くなり、たとえばテーブルにはcreated_atやupdated_atやupdated_atなどの列が含まれます。

MySQLプライマリキーは、データベース内の各行を一意に識別するキー属性であるため、空にすることはできません。主キーが空になる可能性がある場合、レコードを一意に識別することはできません。これにより、データの混乱が発生します。一次キーとして自己挿入整数列またはUUIDを使用する場合、効率やスペース占有などの要因を考慮し、適切なソリューションを選択する必要があります。

MySQLはJSONデータを返すことができます。 json_extract関数はフィールド値を抽出します。複雑なクエリについては、Where句を使用してJSONデータをフィルタリングすることを検討できますが、そのパフォーマンスへの影響に注意してください。 JSONに対するMySQLのサポートは絶えず増加しており、最新バージョンと機能に注意を払うことをお勧めします。

MySQLはAndroidで直接実行できませんが、次の方法を使用して間接的に実装できます。Androidシステムに構築されたLightWeight Database SQLiteを使用して、別のサーバーを必要とせず、モバイルデバイスアプリケーションに非常に適したリソース使用量が少ない。 MySQLサーバーにリモートで接続し、データの読み取りと書き込みのためにネットワークを介してリモートサーバー上のMySQLデータベースに接続しますが、強力なネットワーク依存関係、セキュリティの問題、サーバーコストなどの短所があります。

データ統合の簡素化:AmazonrdsmysqlとRedshiftのゼロETL統合効率的なデータ統合は、データ駆動型組織の中心にあります。従来のETL(抽出、変換、負荷)プロセスは、特にデータベース(AmazonrdsmysQlなど)をデータウェアハウス(Redshiftなど)と統合する場合、複雑で時間がかかります。ただし、AWSは、この状況を完全に変えたゼロETL統合ソリューションを提供し、RDSMYSQLからRedshiftへのデータ移行のための簡略化されたほぼリアルタイムソリューションを提供します。この記事では、RDSMysQl Zero ETLのRedshiftとの統合に飛び込み、それがどのように機能するか、それがデータエンジニアと開発者にもたらす利点を説明します。

MySQLは、複数の同時接続を処理し、マルチスレッド/マルチプロセスを使用して、各クライアントのリクエストに独立した実行環境を割り当てて、邪魔されないことを確認できます。ただし、同時接続の数は、システムリソース、MySQL構成、クエリパフォーマンス、ストレージエンジン、ネットワーク環境の影響を受けます。最適化では、コードレベル(効率的なSQLの書き込み)、構成レベル(MAX_Connectionの調整)、ハードウェアレベル(サーバー構成の改善)などの多くの要因を考慮する必要があります。

MySQLには、無料のコミュニティバージョンと有料エンタープライズバージョンがあります。コミュニティバージョンは無料で使用および変更できますが、サポートは制限されており、安定性要件が低く、技術的な能力が強いアプリケーションに適しています。 Enterprise Editionは、安定した信頼性の高い高性能データベースを必要とするアプリケーションに対する包括的な商業サポートを提供し、サポートの支払いを喜んでいます。バージョンを選択する際に考慮される要因には、アプリケーションの重要性、予算編成、技術スキルが含まれます。完璧なオプションはなく、最も適切なオプションのみであり、特定の状況に応じて慎重に選択する必要があります。

MySQLデータベースパフォーマンス最適化ガイドリソース集約型アプリケーションでは、MySQLデータベースが重要な役割を果たし、大規模なトランザクションの管理を担当しています。ただし、アプリケーションのスケールが拡大すると、データベースパフォーマンスのボトルネックが制約になることがよくあります。この記事では、一連の効果的なMySQLパフォーマンス最適化戦略を検討して、アプリケーションが高負荷の下で効率的で応答性の高いままであることを保証します。実際のケースを組み合わせて、インデックス作成、クエリ最適化、データベース設計、キャッシュなどの詳細な主要なテクノロジーを説明します。 1.データベースアーキテクチャの設計と最適化されたデータベースアーキテクチャは、MySQLパフォーマンスの最適化の基礎です。いくつかのコア原則は次のとおりです。適切なデータ型を選択し、ニーズを満たす最小のデータ型を選択すると、ストレージスペースを節約するだけでなく、データ処理速度を向上させることもできます。
