13.6.7.7 MySQL의 진단 영역
SQL 문은 진단 영역을 채우는 진단 정보를 생성합니다. 표준 SQL에는 중첩 된 실행 컨텍스트 별 진단 영역을 포함한 진단 영역 스택이 있습니다. 표준 SQL은 또한 조건 핸들러의 실행 중에 두 번째 진단 영역을 참조하는
GET STACKED DIAGNOSTICS
구문도 지원하고 있습니다. MySQL은 MySQL 5.7까지 STACKED
키워드를 지원하지 않습니다. MySQL 5.6에서는 진단 영역에 쓰기를 행한 최근의 문에서 정보를 포함하는 하나의 진단 영역이 존재합니다. 이 섹션에서는 MySQL의 진단 영역의 구조, MySQL에 의해 인식되는 정보 항목 및 문 진단 영역을 클리어하고 구성하는 방법에 대해 설명합니다.
13.6.7.7.1 진단 영역의 구조
진단 영역에는 다음의 2 종류의 정보가 포함되어 있습니다.
발생 조건의 수와 영향을받은 행수 등의 문 정보.
오류 코드 및 메시지 등의 조건 정보. 문이 여러 조건을 발생시킨 경우 진단 영역이 부분에는 각 조건의 조건 영역이 포함되어 있습니다. 문이 어떤 조건도 발생시키지 않는 경우 진단 영역이 부분은 비어 있습니다.
3 개의 조건을 생성하는 명령문의 경우 진단 영역에는 다음과 같은 명령문 정보와 조건 정보가 포함되어 있습니다.
Statement information : row count ... other statement information items ... Condition area list : Condition area 1 : error code for condition 1 error message for condition 1 ... other condition information items ... Condition area 2 : error code for condition 2 : error message for condition 2 ... other condition information items ... Condition area 3 : error code for condition 3 error message for condition 3 ... other condition information items ...
13.6.7.7.2 진단 영역의 정보 항목
진단 영역에는 문 정보와 조건 정보 항목이 포함되어 있습니다. 수치 항목은 정수입니다. 문자 항목의 문자 세트는 UTF-8입니다. 어떤 항목도 NULL
은 없습니다. 진단 영역을 채우는 문에서 문 또는 조건 항목이 설정되어 있지 않은 경우, 그 값은 해당 항목의 데이터 형식에 따라 0 또는 빈 문자열입니다.
진단 영역의 문 정보 부분에는 다음 항목이 포함되어 있습니다.
NUMBER
: 정보가 포함되어있는 조건 영역의 수를 나타내는 정수입니다.ROW_COUNT
:이 문에 의해 영향을받은 행 수를 나타내는 정수입니다.ROW_COUNT
는ROW_COUNT()
함수와 같은 값이 포함되어 있습니다 ( 섹션 12.14 "정보 함수" 를 참조하십시오).
진단 영역의 조건 정보 부분에는 각 조건의 조건 영역이 포함되어 있습니다. 조건 영역에는 1에서 NUMBER
문 조건 항목 값의 번호가 매겨져 있습니다. NUMBER
가 0 인 경우, 조건 영역은 존재하지 않습니다.
각 조건 영역에는 다음 목록의 항목이 포함되어 있습니다. MySQL 확장이다 MYSQL_ERRNO
을 제외한 모든 항목이 표준 SQL입니다. 이러한 정의는 신호 이외 의해 (즉, SIGNAL
또는 RESIGNAL
문에 의해) 생성 된 조건에 적용됩니다. 신호 이외의 조건의 경우 MySQL은 항상 비어있는 것으로 표시되지 않은 조건 항목 만 채 웁니다. 조건 영역에 대한 신호의 영향에 대해서는 나중에 설명되어 있습니다.
CLASS_ORIGIN
RETURNED_SQLSTATE
값의 클래스가 포함 된 문자열.RETURNED_SQLSTATE
값이 SQL 표준 문서 ISO 9075-2 (섹션 24.1, SQLSTATE)에서 정의 된 클래스 값으로 시작하면CLASS_ORIGIN
은'ISO 9075'
입니다. 그렇지 않으면,CLASS_ORIGIN
는'MySQL'
입니다.SUBCLASS_ORIGIN
:RETURNED_SQLSTATE
값의 서브 클래스를 포함하는 문자열.CLASS_ORIGIN
이'ISO 9075'
이거나 또는RETURNED_SQLSTATE
가'000'
로 끝나는 경우SUBCLASS_ORIGIN
은'ISO 9075'
입니다. 그렇지 않으면,SUBCLASS_ORIGIN
는'MySQL'
입니다.RETURNED_SQLSTATE
:이 조건SQLSTATE
값을 나타내는 문자열입니다.MESSAGE_TEXT
:이 조건의 오류 메시지를 나타내는 캐릭터 라인.MYSQL_ERRNO
:이 조건의 MySQL 에러 코드를 나타내는 정수입니다.CONSTRAINT_CATALOG
,CONSTRAINT_SCHEMA
,CONSTRAINT_NAME
: 위반 한 제약 카탈로그, 스키마 및 이름을 나타내는 문자열입니다. 이들은 항상 비어 있습니다.CATALOG_NAME
,SCHEMA_NAME
,TABLE_NAME
,COLUMN_NAME
:이 조건에 관련된 카탈로그, 스키마, 테이블 및 컬럼을 나타내는 문자열입니다. 이들은 항상 비어 있습니다.CURSOR_NAME
: 커서 이름을 나타내는 문자열입니다. 이것은 항상 비어 있습니다.
RETURNED_SQLSTATE
, MESSAGE_TEXT
및 MYSQL_ERRNO
값의 특정 오류 내용은 섹션 B.3 "서버 오류 코드 및 메시지" 를 참조하십시오.
SIGNAL
(또는 RESIGNAL
) 문이 진단 영역을 채우는 경우 SET
절은 RETURNED_SQLSTATE
을 제외한 모든 조건 정보 항목에 해당 항목의 데이터 형식에 대해 정당한 임의의 값을 할당 할 수 있습니다. SIGNAL
또한 RETURNED_SQLSTATE
값도 설정하지만, 그 SET
절에서 직접 설정하는 것은 아닙니다. 그 값은 SIGNAL
문 SQLSTATE
인수에서 검색됩니다.
SIGNAL
은 문 정보 항목을 설정합니다. NUMBER
를 1로 설정하고 ROW_COUNT
내용은 오류의 경우는 -1, 그렇지 않으면 0으로 설정합니다.
13.6.7.7.3 진단 영역이 이입되는 방법
진단 제외한 대부분의 SQL 문은 진단 영역을 자동으로 채 웁니다 만, 그 내용은 SIGNAL
및 RESIGNAL
문을 사용하여 명시 적으로 설정할 수 있습니다. 진단 영역은 특정 항목을 추출하기 위해 GET DIAGNOSTICS
를 사용하여 또는 조건 또는 오류를 확인하기 위해 SHOW WARNINGS
또는 SHOW ERRORS
를 사용하여 확인할 수 있습니다.
SQL 문은 다음과 같이 진단 영역을 클리어 및 설정합니다.
서버가 문을 분석하고 그 실행을 시작할 때 테이블을 사용하는 진단 이외의 문은 진단 영역을 지 웁니다. 진단 문 진단 영역을 삭제하지 않습니다 (
SHOW WARNINGS
,SHOW ERRORS
,GET DIAGNOSTICS
).문이 조건을 발생시킨 경우에는 이전 문에 속하는 조건의 진단 영역이 클리어됩니다. 예외적으로
GET DIAGNOSTICS
및RESIGNAL
의해 발생 조건은 진단 영역에 그 영역을 클리어하지 않고 추가됩니다.
따라서 일반적으로 시작될 때 진단 영역을 클리어하지 않으면 문에도 그 문이 조건을 발생시킨 경우 진단 영역을 지 웁니다.
다음의 예는 진단 영역에 대한 다양한 문의 영향을 SHOW WARNINGS
을 사용하여 거기에 저장되어있는 조건에 대한 정보를 표시하여 보여줍니다.
다음 DROP TABLE
문은 테이블을 사용하기 때문에 진단 영역을 클리어 조건이 발생하면 그것을 채 웁니다.
mysql>DROP TABLE IF EXISTS test.no_such_table;
Query OK, 0 rows affected, 1 warning (0.01 sec) mysql>SHOW WARNINGS;
+-------+------+------------------------------------+ | Level | Code | Message | +-------+------+------------------------------------+ | Note | 1051 | Unknown table 'test.no_such_table' | +-------+------+------------------------------------+ 1 row in set (0.00 sec)
다음 SET
문은 테이블을 사용하지 않고 경고도 생성하지 않기 때문에 진단 영역을 변경되지 않은 상태로합니다.
mysql>SET @x = 1;
Query OK, 0 rows affected (0.00 sec) mysql>SHOW WARNINGS;
+-------+------+------------------------------------+ | Level | Code | Message | +-------+------+------------------------------------+ | Note | 1051 | Unknown table 'test.no_such_table' | +-------+------+------------------------------------+ 1 row in set (0.00 sec)
다음 SET
문은 오류를 생성하기 위해 진단 영역을 지우고 채 웁니다.
mysql>SET @x = @@x;
ERROR 1193 (HY000): Unknown system variable 'x' mysql>SHOW WARNINGS;
+-------+------+-----------------------------+ | Level | Code | Message | +-------+------+-----------------------------+ | Error | 1193 | Unknown system variable 'x' | +-------+------+-----------------------------+ 1 row in set (0.00 sec)
이전 SET
문은 하나의 조건을 생성했기 때문에 1이이 시점에서 GET DIAGNOSTICS
의 유일한 유효한 조건 번호입니다. 다음 문은 두 조건 번호를 사용하고 있습니다. 따라서 진단 영역에 그 영역을 클리어하지 않고 추가되는 경고가 생성됩니다.
mysql>GET DIAGNOSTICS CONDITION 2 @p = MESSAGE_TEXT;
Query OK, 0 rows affected, 1 warning (0.00 sec) mysql>SHOW WARNINGS;
+-------+------+------------------------------+ | Level | Code | Message | +-------+------+------------------------------+ | Error | 1193 | Unknown system variable 'xx' | | Error | 1753 | Invalid condition number | +-------+------+------------------------------+ 2 rows in set (0.00 sec)
이제 진단 영역에는 두 가지 조건이 존재하게 되었기 때문에, 같은 GET DIAGNOSTICS
문이 성공합니다.
mysql>GET DIAGNOSTICS CONDITION 2 @p = MESSAGE_TEXT;
Query OK, 0 rows affected (0.00 sec) mysql>SELECT @p;
+--------------------------+ | @p | +--------------------------+ | Invalid condition number | +--------------------------+ 1 row in set (0.01 sec)
13.6.7.7.4 진단 영역 관련 시스템 변수
특정 시스템 변수가 진단 영역의 여러 측면을 제어하거나 그와 관련되어 있습니다.
max_error_count
진단 영역의 조건 영역의 수를 제어합니다. 더 많은 조건이 발생했을 경우, MySQL은 초과 한 조건에 관한 정보를 암묵적으로 파기합니다. (RESIGNAL
의해 추가 된 조건은 항상 추가됩니다. 여유를 만들기 위해 기존 조건이 필요한 경우 삭제됩니다.)warning_count
는 발생 조건의 수를 나타냅니다. 여기에는 오류, 경고 및주의가 포함되어 있습니다. 일반적으로NUMBER
및warning_count
은 동일합니다. 그러나 생성 된 조건의 수가max_error_count
을 초과하면 진단 영역은 더 조건이 저장되지 않으므로warning_count
값이 계속 늘어나는 대해NUMBER
는max_error_count
에 상한이 설정된 상태로 유지 합니다.error_count
은 발생한 오류의 수를 나타냅니다. 이 값은 "누락"과 예외 조건이 포함되지만, 경고 및주의는 제외됩니다.warning_count
과 마찬가지로, 그 값은max_error_count
을 초과 할 수 있습니다.sql_notes
시스템 변수가 0으로 설정되어있는 경우주의는 저장되지 않고warning_count
도 증가하지 않습니다.
예 : max_error_count
가 10 인 경우, 진단 영역에는 최대 10 개의 조건부 영역을 포함 할 수 있습니다. 문이 20 개의 조건을 생성하고 그 중 12 개가 오류라고합니다. 이 경우 진단 영역에는 처음 10 개의 조건이 포함되어 NUMBER
는 10 warning_count
은 20 error_count
는 12입니다.
max_error_count
값을 변경해도 다음 진단 영역을 변경하려고 할 때까지는 아무런 효과도 없습니다. 진단 영역에 10 개의 조건 영역이 포함되어있을 때 max_error_count
이 5로 설정 된 경우 그 진단 영역의 크기 또는 내용에 즉각적인 영향은 아무것도 없습니다.
MySQL 5.6 이전에는 문 정보 항목을 직접 사용할 수 없습니다. ROW_COUNT
는 ROW_COUNT()
함수를 호출함으로써 얻을 수 있습니다. NUMBER
는 warning_count
시스템 변수의 값에 의해 근사됩니다. 그러나 NUMBER
가 max_error_count
값에 상한이 설정되는 반면 warning_count
에는 제한이 없습니다.