Spec-Zone .ru
спецификации, руководства, описания, API

13.6.7.7. MySQL Diagnostics Area

SQL-операторы производят диагностическую информацию, которая заполняет область диагностики. У стандартного SQL есть стек области диагностики, содержа область диагностики для каждого вложенного контекста выполнения. Стандартный SQL также поддерживает GET STACKED DIAGNOSTICS синтаксис для того, чтобы обратиться к второй области диагностики во время выполнения обработчика особых ситуаций. MySQL поддерживает STACKED ключевое слово с MySQL 5.7. Перед этим MySQL не поддерживает STACKED; есть единственная область диагностики, содержащая информацию от нового оператора, который записал в это.

Этот раздел описывает структуру области диагностики в MySQL, единицы информации, распознанные MySQL, как четкие операторы и устанавливают область диагностики, и как области диагностики продвигаются к и выталкиваются от стека.

13.6.7.7.1. Структура области диагностики

Область диагностики содержит два вида информации:

  • Информация об операторе, такая как число условий, которые произошли или количество влиявших строк.

  • Информация об условии, такая как код ошибки и сообщение. Если оператор повышает многократные условия, у этой части области диагностики есть область условия для каждого. Если оператор не повышает условий, эта часть области диагностики пуста.

Для оператора, который производит три условия, область диагностики содержит оператор и информацию об условии как это:

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, нет никаких областей условия.

Каждая область условия содержит элементы в следующем списке. Все элементы являются стандартным SQL кроме MYSQL_ERRNO, который является расширением MySQL. Определения просят условия, сгенерированные кроме сигналом (то есть, a SIGNAL или RESIGNAL оператор). Для условий несигнала MySQL заполняет только те элементы условия, не описанные как всегда пустой. Эффекты сигналов на области условия описываются позже.

  • CLASS_ORIGIN: Строка, содержащая class RETURNED_SQLSTATE значение. Если RETURNED_SQLSTATE значение начинается со значения class, определенного в документе ISO 9075-2 стандартов SQL (раздел 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 значения для определенных ошибок, см. Раздел C.3, "Коды ошибки сервера и сообщения".

Если a 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 в этой точке. Следующий оператор использует число условия 2, который производит предупреждение, которое добавляется к области диагностики, не очищая его:

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. Как Работы Стека области Диагностики

Когда нажатие к стеку области диагностики происходит, первая (текущая) область диагностики становится второй (сложенной) областью диагностики, и новая текущая область диагностики создается как копия этого. Области диагностики продвигаются к и выталкиваются от стека при следующих обстоятельствах:

  • Выполнение сохраненной программы

    Нажатие происходит прежде, чем программа выполняется, и выталкивание происходит позже. Если сохраненная программа заканчивается, в то время как обработчики выполняются, может быть больше чем одна область диагностики, чтобы появиться; это происходит из-за исключения, для которого нет никаких соответствующих обработчиков или из-за RETURN в обработчике.

    Любое предупреждение или состояния ошибки, происходящие во время сохраненного выполнения программы тогда, добавляются к текущей области диагностики, за исключением того, что для триггеров только ошибки добавляются. Когда сохраненная программа заканчивается, вызывающая сторона видит эти условия в своем токе diagonstics область.

  • Выполнение обработчика особых ситуаций в пределах сохраненной программы

    Когда нажатие происходит в результате активации обработчика особых ситуаций, сложенной областью диагностики является область, которая была текущей в пределах сохраненной программы до нажатия. Новой теперь текущей областью диагностики является текущая область диагностики обработчика. GET [CURRENT] DIAGNOSTICS и GET STACKED DIAGNOSTICS может использоваться в пределах обработчика, чтобы получить доступ к содержанию тока (обработчик) и сложен (сохраненная программа) области диагностики. Первоначально, они возвращают тот же самый результат, но операторы, выполняющиеся в пределах обработчика, изменяют текущую область диагностики, очищая и устанавливая ее содержание согласно нормальным правилам (см. Раздел 13.6.7.7.3, "Как область Диагностики Заполняется"). Сложенная область диагностики не может быть изменена операторами, выполняющимися в пределах обработчика кроме RESIGNAL.

    Если обработчик выполняется успешно, ток (обработчик), область диагностики выталкивается и сложенный (сохраненная программа), область диагностики снова становится текущей областью диагностики. Условия, добавленные к области диагностики обработчика во время выполнения обработчика, добавляются к текущей области диагностики.

  • Выполнение RESIGNAL

    RESIGNAL оператор передает информацию о состоянии ошибки, которая доступна во время выполнения обработчика особых ситуаций в пределах составного оператора в сохраненной программе. RESIGNAL может изменить некоторых или всю информацию перед передачей этого, изменяя стек диагностики как описано в Разделе 13.6.7.4,"RESIGNAL Синтаксис".

13.6.7.7.5. Диагностика связанные с областью Системные Переменные

Определенные системные переменные управляют или связываются с некоторыми аспектами области диагностики:

  • 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, который не имеет никакого непосредственного эффекта на размер или контент области диагностики.