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

13.6.7.7. MySQL Diagnostics Area

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

Этот раздел описывает структуру области диагностики в 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. Диагностика связанные с областью Системные Переменные

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

  • 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 не.