このセクションでは、エラーメッセージが MySQL 内でどのように生成されるか、およびエラーメッセージに含まれる要素について説明します。
エラーメッセージは、サーバー側またはクライアント側で発生する可能性があります:
-
サーバー側では、SQL ステートメントの実行中に発生する問題などの結果として、起動および停止プロセス中にエラーメッセージが表示される場合があります。
MySQL サーバーは、エラーログにいくつかのエラーメッセージを書き込みます。 これらは、データベース管理者にとって関心のある問題、または DBA アクションが必要な問題を示します。
サーバーは、ほかのエラーメッセージをクライアントプログラムに送信します。 これらは、特定のクライアントにのみ関連する問題を示します。 MySQL クライアントライブラリは、サーバーから受信したエラーを取得し、ホストクライアントプログラムで使用できるようにします。
クライアント側のエラーメッセージは MySQL クライアントライブラリ内から生成され、通常はサーバーとの通信に問題が発生します。
エラーログに書き込まれるサーバー側のエラーメッセージの例:
-
起動プロセス中に生成されるこのメッセージには、ステータスインジケータまたは進捗インジケータが表示されます:
2018-10-28T13:01:32.735983Z 0 [Note] [MY-010303] [Server] Skipping generation of SSL certificates as options related to SSL are specified.
-
このメッセージは、DBA アクションが必要な問題を示しています:
2018-10-02T03:20:39.410387Z 768 [ERROR] [MY-010045] [Server] Event Scheduler: [evtuser@localhost][myschema.e_daily] Unknown database 'mydb'
mysql クライアントによって表示される、クライアントプログラムに送信されるサーバー側のエラーメッセージの例:
mysql> SELECT * FROM no_such_table;
ERROR 1146 (42S02): Table 'test.no_such_table' doesn't exist
mysql クライアントによって表示される、クライアントライブラリ内からのクライアント側エラーメッセージの例:
shell> mysql -h no-such-host
ERROR 2005 (HY000): Unknown MySQL server host 'no-such-host' (0)
エラーがクライアントライブラリ内から発生したか、サーバーから受信されたかにかかわらず、MySQL クライアントプログラムは様々な方法で応答できます。 図のように、ユーザーが修正策を講じることができるように、クライアントにエラーメッセージが表示される場合があります。 かわりに、クライアントは内部的に失敗した操作を解決または再試行するか、他のアクションを実行できます。
エラーが発生した場合、エラー情報には複数の要素が含まれます: エラーコード、SQLSTATE 値、およびメッセージ文字列。 これらの要素には、次の特性があります:
-
エラーコード: この値は数値です。 MySQL 固有であり、他のデータベースシステムには移植できません。
各エラー番号には対応するシンボリック値があります。 例:
サーバーエラー番号
1146
の記号はER_NO_SUCH_TABLE
です。クライアントエラー番号
2005
の記号はCR_UNKNOWN_HOST
です。
エラーメッセージで使用されるエラーコードのセットは、個別の範囲にパーティション化されます。エラーコード範囲 を参照してください。
エラーコードは、特定の MySQL シリーズの General Availability (GA) リリース間で安定しています。 シリーズが GA ステータスになる前に、新しいコードがまだ開発中であり、変更される可能性があります。
-
SQLSTATE 値: この値は 5 文字の文字列 (
'42S02'
など) です。 SQLSTATE 値は ANSI SQL および ODBC から取得され、数値エラーコードよりも標準化されています。 SQLSTATE 値の最初の 2 文字はエラークラスを示しています。クラス =
'00'
は成功を示しています。クラス =
'01'
は警告を示しています。クラス =
'02'
は 「Not Found」 を示しています。 これは、カーソルのコンテキストに関係しており、カーソルがデータセットの最後に達したときの動作を制御するために使用します。 この状況は、行が取得されないSELECT ... INTO
ステートメントでも発生します。var_list
クラス >
'02'
は例外を示しています。
サーバー側エラーの場合、すべての MySQL エラー番号に対応する SQLSTATE 値があるわけではありません。 それらの場合は、
'HY000'
(一般エラー) が使用されます。クライアント側のエラーの場合、SQLSTATE 値は常に
'HY000'
(一般エラー) であるため、あるクライアントエラーを別のクライアントエラーと区別することは意味がありません。 メッセージ文字列: この文字列は、エラーのテキストによる説明を提供します。
エラーメッセージで使用されるエラーコードのセットは、それぞれ独自の目的を持つ個別の範囲にパーティション化されます:
-
1 から 999: グローバルエラーコード。 このエラーコード範囲は、サーバーおよびクライアントによって使用される共有範囲であるため、「global」 と呼ばれます。
この範囲のエラーがサーバー側で発生すると、サーバーはエラーコードをエラーログに書き込み、エラーコードの先頭にゼロを付けて 6 桁にし、
MY-
の接頭辞を追加します。この範囲のエラーがクライアント側で発生すると、クライアントライブラリはゼロ埋込みや接頭辞なしでクライアントプログラムで使用できるようになります。
1,000 から 1,999: クライアントに送信されるメッセージ用に予約されているサーバーエラーコード。
2,000 から 2,999: クライアントライブラリで使用するために予約されているクライアントエラーコード。
3,000 から 4,999: クライアントに送信されるメッセージ用に予約されているサーバーエラーコード。
5,000 から 5,999 : クライアントに送信されるメッセージ用に X プラグイン で使用するために予約されているエラーコード。
-
10,000 から 49,999: エラーログに書き込まれるメッセージ用に予約されているサーバーエラーコード (クライアントには送信されません)。
この範囲のエラーが発生すると、サーバーはエラーログに書き込み、エラーコードの先頭にゼロを 6 桁に埋め込み、
MY-
の接頭辞を追加します。 50,000 から 51,999: サードパーティが使用するために予約されたエラーコード。
サーバーは、エラーログに書き込まれたエラーメッセージを、クライアントに送信されたエラーメッセージとは異なる方法で処理します:
サーバーがエラーログにメッセージを書き込むと、エラーコードが先頭にゼロを付けて 6 桁に埋め込まれ、
MY-
の接頭辞が追加されます (例:MY-000022
,MY-010048
).サーバーがクライアントプログラムにメッセージを送信すると、エラーコードにゼロ埋込みや接頭辞は追加されません (例):
1036
,3013
).