8.4.5.4 Форматы файлов журналов аудита
Сервер MySQL вызывает плагин журнала аудита, чтобы записать запись аудита в свой файл журнала всякий раз, когда происходит событие, подлежащее аудиту. Обычно первая запись аудита, записанная после запуска плагина, содержит описание сервера и параметры запуска. Элементы, следующие за этим, представляют такие события, как подключение и отключение клиентов, выполняемые SQL-запросы и так далее. В журнал записываются только операторы верхнего уровня, а не операторы внутри хранимых программ, таких как триггеры или хранимые процедуры. Содержание файлов, на которые ссылаются операторы, такие как LOAD
DATA, не записывается в журнал.
Чтобы выбрать формат журнала, используемый плагином журнала аудита для записи файла журнала, установите системную переменную audit_log_format при запуске сервера. Доступны следующие форматы:
Формат XML нового стиля (
audit_log_format=NEW): Формат XML, который имеет лучшую совместимость с Oracle Audit Vault, чем формат XML старого стиля. MySQL 8.4 по умолчанию использует формат XML нового стиля.Формат XML старого стиля (
audit_log_format=OLD): Исходный формат журнала аудита, используемый по умолчанию в более старых версиях MySQL.Формат JSON (
audit_log_format=JSON): Записывает журнал аудита в виде JSON-массива. Только этот формат поддерживает необязательные статистические данные по времени и размеру запроса.
По умолчанию содержимое файла журнала аудита записывается в формате XML нового стиля без сжатия или шифрования.
Если вы измените audit_log_format, рекомендуется также изменить audit_log_file. Например, если вы установите audit_log_format на JSON, установите audit_log_file на audit.json. В противном случае новые файлы журналов будут иметь другой формат, чем старые файлы, но все они будут иметь одинаковое базовое имя без каких-либо указаний на то, когда изменился формат.
Формат файла журнала аудита XML нового стиля
Вот пример файла журнала в формате XML нового стиля (audit_log_format=NEW), слегка отформатированный для лучшей читаемости:
<?xml version="1.0" encoding="utf-8"?>
<AUDIT>
<AUDIT_RECORD>
<TIMESTAMP>2019-10-03T14:06:33 UTC</TIMESTAMP>
<RECORD_ID>1_2019-10-03T14:06:33</RECORD_ID>
<NAME>Audit</NAME>
<SERVER_ID>1</SERVER_ID>
<VERSION>1</VERSION>
<STARTUP_OPTIONS>/usr/local/mysql/bin/mysqld
--socket=/usr/local/mysql/mysql.sock
--port=3306</STARTUP_OPTIONS>
<OS_VERSION>i686-Linux</OS_VERSION>
<MYSQL_VERSION>5.7.21-log</MYSQL_VERSION>
</AUDIT_RECORD>
<AUDIT_RECORD>
<TIMESTAMP>2019-10-03T14:09:38 UTC</TIMESTAMP>
<RECORD_ID>2_2019-10-03T14:06:33</RECORD_ID>
<NAME>Connect</NAME>
<CONNECTION_ID>5</CONNECTION_ID>
<STATUS>0</STATUS>
<STATUS_CODE>0</STATUS_CODE>
<USER>root</USER>
<OS_LOGIN/>
<HOST>localhost</HOST>
<IP>127.0.0.1</IP>
<COMMAND_CLASS>connect</COMMAND_CLASS>
<CONNECTION_TYPE>SSL/TLS</CONNECTION_TYPE>
<CONNECTION_ATTRIBUTES>
<ATTRIBUTE>
<NAME>_pid</NAME>
<VALUE>42794</VALUE>
</ATTRIBUTE>
...
<ATTRIBUTE>
<NAME>program_name</NAME>
<VALUE>mysqladmin</VALUE>
</ATTRIBUTE>
</CONNECTION_ATTRIBUTES>
<PRIV_USER>root</PRIV_USER>
<PROXY_USER/>
<DB>test</DB>
</AUDIT_RECORD>
...
<AUDIT_RECORD>
<TIMESTAMP>2019-10-03T14:09:38 UTC</TIMESTAMP>
<RECORD_ID>6_2019-10-03T14:06:33</RECORD_ID>
<NAME>Query</NAME>
<CONNECTION_ID>5</CONNECTION_ID>
<STATUS>0</STATUS>
<STATUS_CODE>0</STATUS_CODE>
<USER>root[root] @ localhost [127.0.0.1]</USER>
<OS_LOGIN/>
<HOST>localhost</HOST>
<IP>127.0.0.1</IP>
<COMMAND_CLASS>drop_table</COMMAND_CLASS>
<SQLTEXT>DROP TABLE IF EXISTS t</SQLTEXT>
</AUDIT_RECORD>
...
<AUDIT_RECORD>
<TIMESTAMP>2019-10-03T14:09:39 UTC</TIMESTAMP>
<RECORD_ID>8_2019-10-03T14:06:33</RECORD_ID>
<NAME>Quit</NAME>
<CONNECTION_ID>5</CONNECTION_ID>
<STATUS>0</STATUS>
<STATUS_CODE>0</STATUS_CODE>
<USER>root</USER>
<OS_LOGIN/>
<HOST>localhost</HOST>
<IP>127.0.0.1</IP>
<COMMAND_CLASS>connect</COMMAND_CLASS>
<CONNECTION_TYPE>SSL/TLS</CONNECTION_TYPE>
</AUDIT_RECORD>
...
<AUDIT_RECORD>
<TIMESTAMP>2019-10-03T14:09:43 UTC</TIMESTAMP>
<RECORD_ID>11_2019-10-03T14:06:33</RECORD_ID>
<NAME>Quit</NAME>
<CONNECTION_ID>6</CONNECTION_ID>
<STATUS>0</STATUS>
<STATUS_CODE>0</STATUS_CODE>
<USER>root</USER>
<OS_LOGIN/>
<HOST>localhost</HOST>
<IP>127.0.0.1</IP>
<COMMAND_CLASS>connect</COMMAND_CLASS>
<CONNECTION_TYPE>SSL/TLS</CONNECTION_TYPE>
</AUDIT_RECORD>
<AUDIT_RECORD>
<TIMESTAMP>2019-10-03T14:09:45 UTC</TIMESTAMP>
<RECORD_ID>12_2019-10-03T14:06:33</RECORD_ID>
<NAME>NoAudit</NAME>
<SERVER_ID>1</SERVER_ID>
</AUDIT_RECORD>
</AUDIT>
Файл журнала аудита записывается в формате XML, используя кодировку UTF-8 (до 4 байтов на символ). Корневой элемент — <AUDIT>. Корневой элемент содержит <AUDIT_RECORD> элементы, каждый из которых предоставляет информацию об аудируемом событии. Когда плагин журнала аудита начинает запись нового файла журнала, он записывает объявление XML и открывающий <AUDIT> корневой элемент. Когда плагин закрывает файл журнала, он записывает закрывающий </AUDIT> корневой элемент. Закрывающего тега нет, пока файл открыт.
Элементы внутри <AUDIT_RECORD> элементов имеют следующие характеристики:
Некоторые элементы присутствуют в каждом
<AUDIT_RECORD>элементе. Другие являются необязательными и могут появляться в зависимости от типа записи аудита.Порядок элементов внутри
<AUDIT_RECORD>элемента не гарантируется.Значения элементов не имеют фиксированной длины. Длинные значения могут быть усечены, как указано в описаниях элементов позже.
Символы
<,>,"и&закодированы как<,>,"и&соответственно. Байты NULL (U+00) закодированы как символ?.-
Символы, не являющиеся допустимыми символами XML, кодируются с помощью числовых кодовых ссылок. Допустимые XML-символы:
#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
Следующие элементы являются обязательными в каждом <AUDIT_RECORD> элементе:
-
<NAME>Строка, представляющая тип инструкции, которая сгенерировала событие аудита, например, команда, полученная сервером от клиента.
Пример:
<NAME>Query</NAME>
Некоторые общие значения
<NAME>:Audit When auditing starts, which may be server startup time Connect When a client connects, also known as logging in Query An SQL statement (executed directly) Prepare Preparation of an SQL statement; usually followed by Execute Execute Execution of an SQL statement; usually follows Prepare Shutdown Server shutdown Quit When a client disconnects NoAudit Auditing has been turned off
Возможные значения:
Audit,Binlog Dump,Change user,Close stmt,Connect Out,Connect,Create DB,Daemon,Debug,Delayed insert,Drop DB,Execute,Fetch,Field List,Init DB,Kill,Long Data,NoAudit,Ping,Prepare,Processlist,Query,Quit,Refresh,Register Slave,Reset stmt,Set option,Shutdown,Sleep,Statistics,Table Dump,TableDelete,TableInsert,TableRead,TableUpdate,Time.Многие из этих значений соответствуют значениям команды
COM_, перечисленным в заголовке файлаxxxmy_command.h. Например,Create DBиChange userсоответствуютCOM_CREATE_DBиCOM_CHANGE_USERсоответственно.События, имеющие значения
<NAME>в видеTable, сопровождают событияXXXQuery. Например, следующее утверждение генерирует одно событиеQuery, два событияTableReadи одно событиеTableInsert:INSERT INTO t3 SELECT t1.* FROM t1 JOIN t2;
Каждое событие
Tableсодержит элементыXXX<TABLE>и<DB>для идентификации таблицы, к которой относится событие, и базы данных, содержащей таблицу. -
<RECORD_ID>Уникальный идентификатор записи аудита. Значение состоит из порядкового номера и метки времени в формате
. Когда плагин журнала аудита открывает файл журнала аудита, он инициализирует порядковый номер размером файла журнала аудита, а затем увеличивает его на 1 для каждой записанной записи. Метка времени — это значение UTC в форматеSEQ_TIMESTAMP, указывающее дату и время открытия файла плагином журнала аудита.YYYY-MM-DDThh:mm:ssПример:
<RECORD_ID>12_2019-10-03T14:06:33</RECORD_ID>
-
<TIMESTAMP>Строка, представляющая значение UTC в формате
, указывающая дату и время генерации события аудита. Например, событие, соответствующее выполнению SQL-запроса, полученного от клиента, имеет значениеYYYY-MM-DDThh:mm:ssUTC<TIMESTAMP>, которое появляется после завершения запроса, а не при получении.Пример:
<TIMESTAMP>2019-10-03T14:09:45 UTC</TIMESTAMP>
Следующие элементы являются необязательными в <AUDIT_RECORD> элементах. Многие из них встречаются только со специфическими значениями элемента <NAME>.
-
<COMMAND_CLASS>Строка, которая указывает тип выполненного действия.
Пример:
<COMMAND_CLASS>drop_table</COMMAND_CLASS>
Значения соответствуют счётчикам команд
statement/sql/. Например,xxxxxxсоответствуетdrop_tableиselectдля командDROP TABLEиSELECTсоответственно. Следующая команда отображает возможные имена:SELECT REPLACE(EVENT_NAME, 'statement/sql/', '') AS name FROM performance_schema.events_statements_summary_global_by_event_name WHERE EVENT_NAME LIKE 'statement/sql/%' ORDER BY name;
-
<CONNECTION_ATTRIBUTES>События со значением
<COMMAND_CLASS>равнымconnectмогут содержать элемент<CONNECTION_ATTRIBUTES>для отображения атрибутов подключения, переданных клиентом во время подключения. (Для получения информации об этих атрибутах, которые также доступны в таблицах Performance Schema, см. Раздел 29.12.9, «Таблицы атрибутов подключения Performance Schema».)Элемент
<CONNECTION_ATTRIBUTES>содержит по одному элементу<ATTRIBUTE>на каждый атрибут, каждый из которых содержит элементы<NAME>и<VALUE>для обозначения имени и значения атрибута соответственно.Пример:
<CONNECTION_ATTRIBUTES> <ATTRIBUTE> <NAME>_pid</NAME> <VALUE>42794</VALUE> </ATTRIBUTE> <ATTRIBUTE> <NAME>_os</NAME> <VALUE>macos0.14</VALUE> </ATTRIBUTE> <ATTRIBUTE> <NAME>_platform</NAME> <VALUE>x86_64</VALUE> </ATTRIBUTE> <ATTRIBUTE> <NAME>_client_version</NAME> <VALUE>8.4.0</VALUE> </ATTRIBUTE> <ATTRIBUTE> <NAME>_client_name</NAME> <VALUE>libmysql</VALUE> </ATTRIBUTE> <ATTRIBUTE> <NAME>program_name</NAME> <VALUE>mysqladmin</VALUE> </ATTRIBUTE> </CONNECTION_ATTRIBUTES>
Если атрибуты подключения отсутствуют в событии, они не регистрируются, и элемент
<CONNECTION_ATTRIBUTES>не появляется. Это может произойти, если попытка подключения не удалась, клиент не передал атрибуты или подключение произошло внутренне, например, во время запуска сервера или при инициализации плагином. -
<CONNECTION_ID>Беззнаковое целое число, представляющее идентификатор подключения клиента. Это совпадает со значением, возвращаемым функцией
CONNECTION_ID()внутри сессии.Пример:
<CONNECTION_ID>127</CONNECTION_ID>
-
<CONNECTION_TYPE>Состояние безопасности подключения к серверу. Разрешённые значения:
TCP/IP(TCP/IP-соединение установлено без шифрования),SSL/TLS(TCP/IP-соединение установлено с шифрованием),Socket(соединение через Unix-сокет),Named Pipe(соединение через именованную Windows-пайп), иShared Memory(соединение через общую память Windows).Пример:
<CONNECTION_TYPE>SSL/TLS</CONNECTION_TYPE>
-
<DB>Строка, представляющая имя базы данных.
Пример:
<DB>test</DB>
Для событий подключения этот элемент указывает базу данных по умолчанию; элемент пустой, если базы данных по умолчанию нет. Для событий доступа к таблицам элемент указывает базу данных, к которой принадлежит доступная таблица.
-
<HOST>Строка, представляющая имя хоста клиента.
Пример:
<HOST>localhost</HOST>
-
<IP>Строка, представляющая IP-адрес клиента.
Пример:
<IP>127.0.0.1</IP>
-
<MYSQL_VERSION>Строка, представляющая версию сервера MySQL. Это то же самое, что и значение функции
VERSION()или системной переменнойversion.Пример:
<MYSQL_VERSION>5.7.21-log</MYSQL_VERSION>
-
<OS_LOGIN>Строка, представляющая имя внешнего пользователя, используемого во время процесса аутентификации, заданное используемым плагином для аутентификации клиента. При использовании родной (встроенной) аутентификации MySQL или если плагин не установил значение, этот элемент пустой. Значение совпадает со значением системной переменной
external_user(см. Раздел 8.2.19, «Пользователи-прокси»).Пример:
<OS_LOGIN>jeffrey</OS_LOGIN>
-
<OS_VERSION>Строка, представляющая операционную систему, на которой был построен или работает сервер.
Пример:
<OS_VERSION>x86_64-Linux</OS_VERSION>
-
<PRIV_USER>Строка, представляющая имя пользователя, под которым сервер аутентифицировал клиента. Это имя пользователя, используемое сервером для проверки привилегий, и может отличаться от значения
<USER>.Пример:
<PRIV_USER>jeffrey</PRIV_USER>
-
<PROXY_USER>Строка, представляющая пользователя-прокси (см. Раздел 8.2.19, «Пользователи-прокси»). Значение пустое, если использование прокси-пользователей не активна.
Пример:
<PROXY_USER>developer</PROXY_USER>
-
<SERVER_ID>Беззнаковое целое число, представляющее идентификатор сервера. Это совпадает со значением системной переменной
server_id.Пример:
<SERVER_ID>1</SERVER_ID>
-
<SQLTEXT>Строка, представляющая текст SQL-команды. Значение может быть пустым. Длинные значения могут быть усечены. Строка, как и сам файл журнала аудита, записывается с использованием UTF-8 (до 4 байтов на символ), поэтому значение может быть результатом преобразования. Например, исходная команда могла быть получена от клиента в виде строки SJIS.
Пример:
<SQLTEXT>DELETE FROM t1</SQLTEXT>
-
<STARTUP_OPTIONS>Строка, представляющая параметры, заданные в командной строке или в файлах параметров при запуске сервера MySQL. Первый параметр — путь к исполняемому файлу сервера.
Пример:
<STARTUP_OPTIONS>/usr/local/mysql/bin/mysqld --port=3306 --log_output=FILE</STARTUP_OPTIONS>
-
<STATUS>Беззнаковое целое число, представляющее состояние команды: 0 для успеха, отличное от нуля, если произошла ошибка. Это совпадает со значением функции C API. См. описание
<STATUS_CODE>для информации о различиях со значением<STATUS>.Журнал аудита не содержит значение SQLSTATE или сообщение об ошибке. Чтобы увидеть соответствия между кодами ошибок, значениями SQLSTATE и сообщениями, см. .
Предупреждения не регистрируются.
Пример:
<STATUS>1051</STATUS>
-
<STATUS_CODE>Беззнаковое целое число, представляющее состояние команды: 0 для успеха, 1, если произошла ошибка.
Значение
STATUS_CODEотличается от значенияSTATUS:STATUS_CODEравно 0 для успеха и 1 для ошибки, что совместимо с потребителем EZ_collector для Audit Vault.STATUSявляется значением функции C API. Это 0 для успеха и отличное от нуля для ошибки, и, следовательно, не обязательно 1 для ошибки.Пример:
<STATUS_CODE>0</STATUS_CODE>
-
<TABLE>Строка, представляющая имя таблицы.
Пример:
<TABLE>t3</TABLE>
-
<USER>Строка, представляющая имя пользователя, отправленное клиентом. Это может отличаться от значения
<PRIV_USER>.Пример:
<USER>root[root] @ localhost [127.0.0.1]</USER>
-
<VERSION>Беззнаковое целое число, представляющее версию формата файла журнала аудита.
Пример:
<VERSION>1</VERSION>
Формат файла журнала аудита XML старого стиля
Вот пример файла журнала в формате XML старого стиля (audit_log_format=OLD), слегка переформатированный для удобства чтения:
<?xml version="1.0" encoding="utf-8"?>
<AUDIT>
<AUDIT_RECORD
TIMESTAMP="2019-10-03T14:25:00 UTC"
RECORD_ID="1_2019-10-03T14:25:00"
NAME="Audit"
SERVER_ID="1"
VERSION="1"
STARTUP_OPTIONS="--port=3306"
OS_VERSION="i686-Linux"
MYSQL_VERSION="5.7.21-log"/>
<AUDIT_RECORD
TIMESTAMP="2019-10-03T14:25:24 UTC"
RECORD_ID="2_2019-10-03T14:25:00"
NAME="Connect"
CONNECTION_ID="4"
STATUS="0"
STATUS_CODE="0"
USER="root"
OS_LOGIN=""
HOST="localhost"
IP="127.0.0.1"
COMMAND_CLASS="connect"
CONNECTION_TYPE="SSL/TLS"
PRIV_USER="root"
PROXY_USER=""
DB="test"/>
...
<AUDIT_RECORD
TIMESTAMP="2019-10-03T14:25:24 UTC"
RECORD_ID="6_2019-10-03T14:25:00"
NAME="Query"
CONNECTION_ID="4"
STATUS="0"
STATUS_CODE="0"
USER="root[root] @ localhost [127.0.0.1]"
OS_LOGIN=""
HOST="localhost"
IP="127.0.0.1"
COMMAND_CLASS="drop_table"
SQLTEXT="DROP TABLE IF EXISTS t"/>
...
<AUDIT_RECORD
TIMESTAMP="2019-10-03T14:25:24 UTC"
RECORD_ID="8_2019-10-03T14:25:00"
NAME="Quit"
CONNECTION_ID="4"
STATUS="0"
STATUS_CODE="0"
USER="root"
OS_LOGIN=""
HOST="localhost"
IP="127.0.0.1"
COMMAND_CLASS="connect"
CONNECTION_TYPE="SSL/TLS"/>
<AUDIT_RECORD
TIMESTAMP="2019-10-03T14:25:32 UTC"
RECORD_ID="12_2019-10-03T14:25:00"
NAME="NoAudit"
SERVER_ID="1"/>
</AUDIT>
Файл журнала аудита записывается в формате XML с использованием кодировки UTF-8 (до 4 байтов на символ). Корневой элемент — <AUDIT>. Корневой элемент содержит элементы <AUDIT_RECORD>, каждый из которых предоставляет информацию о событии аудита. Когда плагин журнала аудита начинает запись нового файла журнала, он записывает объявление XML и открывающий тег корневого элемента <AUDIT>. Когда плагин закрывает файл журнала, он записывает закрывающий тег корневого элемента </AUDIT>. Закрывающего тега нет, пока файл открыт.
Атрибуты элементов <AUDIT_RECORD> имеют следующие характеристики:
Некоторые атрибуты присутствуют в каждом элементе
<AUDIT_RECORD>. Другие являются необязательными и могут появляться в зависимости от типа записи аудита.Порядок атрибутов внутри элемента
<AUDIT_RECORD>не гарантируется.Значения атрибутов не имеют фиксированной длины. Длинные значения могут быть усечены, как указано в описаниях атрибутов ниже.
Символы
<,>,"и&кодируются как<,>,"и&соответственно. Байты NUL (U+00) кодируются как символ?.-
Символы, не являющиеся допустимыми символами XML, кодируются с помощью числовых ссылок на символы. Допустимые символы XML:
#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
Следующие атрибуты являются обязательными в каждом элементе <AUDIT_RECORD>:
-
NAMEСтрока, представляющая тип инструкции, которая сгенерировала событие аудита, например, команду, полученную сервером от клиента.
Пример:
NAME="Query"Некоторые распространенные значения
NAME:Audit When auditing starts, which may be server startup time Connect When a client connects, also known as logging in Query An SQL statement (executed directly) Prepare Preparation of an SQL statement; usually followed by Execute Execute Execution of an SQL statement; usually follows Prepare Shutdown Server shutdown Quit When a client disconnects NoAudit Auditing has been turned off
Возможные значения:
Audit,Binlog Dump,Change user,Close stmt,Connect Out,Connect,Create DB,Daemon,Debug,Delayed insert,Drop DB,Execute,Fetch,Field List,Init DB,Kill,Long Data,NoAudit,Ping,Prepare,Processlist,Query,Quit,Refresh,Register Slave,Reset stmt,Set option,Shutdown,Sleep,Statistics,Table Dump,TableDelete,TableInsert,TableRead,TableUpdate,Time.Многие из этих значений соответствуют значениям команды
COM_, перечисленным в заголовочном файлеxxxmy_command.h. Например,"Create DB"и"Change user"соответствуютCOM_CREATE_DBиCOM_CHANGE_USERсоответственно.События, имеющие значения
NAME, равныеTable, сопровождаются событиямиXXXQuery. Например, следующее утверждение генерирует одно событиеQuery, два событияTableReadи одно событиеTableInsert:INSERT INTO t3 SELECT t1.* FROM t1 JOIN t2;
Каждое событие
Tableимеет атрибутыXXXTABLEиDBдля идентификации таблицы, к которой относится событие, и базы данных, содержащей таблицу.События
Connectдля формата журнала аудита XML старого стиля не включают атрибуты подключения. -
RECORD_IDУникальный идентификатор записи аудита. Значение состоит из порядкового номера и метки времени в формате
. Когда плагин журнала аудита открывает файл журнала аудита, он инициализирует порядковый номер размером файла журнала аудита, затем увеличивает порядковый номер на 1 для каждой записанной записи. Метка времени — это значение UTC в форматеSEQ_TIMESTAMP, указывающее дату и время открытия файла плагином журнала аудита.YYYY-MM-DDThh:mm:ssПример:
RECORD_ID="12_2019-10-03T14:25:00" -
TIMESTAMPСтрока, представляющая значение UTC в формате
, указывающее дату и время генерации события аудита. Например, событие, соответствующее выполнению SQL-запроса, полученного от клиента, имеет значениеYYYY-MM-DDThh:mm:ssUTCTIMESTAMP, которое происходит после завершения запроса, а не при его получении.Пример:
TIMESTAMP="2019-10-03T14:25:32 UTC"
Следующие атрибуты являются необязательными в элементах <AUDIT_RECORD>. Многие из них встречаются только для элементов со специфическими значениями атрибута NAME.
-
COMMAND_CLASSСтрока, указывающая тип выполненного действия.
Пример:
COMMAND_CLASS="drop_table"Значения соответствуют счётчикам команд
statement/sql/. Например,xxxxxxсоответствуетdrop_tableиselectдля операторовDROP TABLEиSELECTсоответственно. Следующее выражение отображает возможные имена:SELECT REPLACE(EVENT_NAME, 'statement/sql/', '') AS name FROM performance_schema.events_statements_summary_global_by_event_name WHERE EVENT_NAME LIKE 'statement/sql/%' ORDER BY name;
-
CONNECTION_IDБеззнаковое целое число, представляющее идентификатор подключения клиента. Это то же значение, что и возвращаемое функцией
CONNECTION_ID()в сессии.Пример:
CONNECTION_ID="127" -
CONNECTION_TYPEСостояние безопасности подключения к серверу. Разрешённые значения —
TCP/IP(TCP/IP-соединение установлено без шифрования),SSL/TLS(TCP/IP-соединение установлено с шифрованием),Socket(соединение через Unix-сокет),Named Pipe(соединение через именованную Windows-трубу) иShared Memory(соединение через разделяемую память Windows).Пример:
CONNECTION_TYPE="SSL/TLS" -
DBСтрока, представляющая имя базы данных.
Пример:
DB="test"Для событий подключения это атрибут указывает базу данных по умолчанию; атрибут пуст, если база данных по умолчанию отсутствует. Для событий доступа к таблицам атрибут указывает базу данных, к которой принадлежит таблица.
-
HOSTСтрока, представляющая имя хоста клиента.
Пример:
HOST="localhost" -
IPСтрока, представляющая IP-адрес клиента.
Пример:
IP="127.0.0.1" -
MYSQL_VERSIONСтрока, представляющая версию сервера MySQL. Это то же значение, что и в функции
VERSION()или системной переменнойversion.Пример:
MYSQL_VERSION="5.7.21-log" -
OS_LOGINСтрока, представляющая имя внешнего пользователя, используемого во время процесса аутентификации, задаваемое используемым плагином для аутентификации клиента. При использовании собственной (встроенной) аутентификации MySQL или если значение не установлено плагином, этот атрибут пуст. Значение совпадает со значением системной переменной
external_user(см. Раздел 8.2.19, «Proxy Users»).Пример:
OS_LOGIN="jeffrey" -
OS_VERSIONСтрока, представляющая операционную систему, на которой сервер был собран или на которой он работает.
Пример:
OS_VERSION="x86_64-Linux" -
PRIV_USERСтрока, представляющая имя пользователя, под которым сервер аутентифицировал клиента. Это имя пользователя, которое сервер использует для проверки привилегий, и оно может отличаться от значения
USER.Пример:
PRIV_USER="jeffrey" -
PROXY_USERСтрока, представляющая пользователя-прокси (см. Раздел 8.2.19, «Proxy Users»). Значение пустое, если проксирование пользователя не используется.
Пример:
PROXY_USER="developer" -
SERVER_IDБеззнаковое целое число, представляющее идентификатор сервера. Это совпадает со значением системной переменной
server_id.Пример:
SERVER_ID="1" -
SQLTEXTСтрока, представляющая текст оператора SQL. Значение может быть пустым. Длинные значения могут быть усечены. Строка, подобно самому файлу журнала аудита, записана с использованием кодировки UTF-8 (до 4 байт на символ), поэтому значение может быть результатом преобразования. Например, исходный оператор мог быть получен от клиента как строка в кодировке SJIS.
Пример:
SQLTEXT="DELETE FROM t1" -
STARTUP_OPTIONSСтрока, представляющая параметры, заданные в командной строке или в файлах параметров при запуске сервера MySQL.
Пример:
STARTUP_OPTIONS="--port=3306 --log_output=FILE" -
STATUSБеззнаковое целое число, представляющее статус команды: 0 для успешного выполнения, ненулевое значение при возникновении ошибки. Это совпадает со значением функции C API. См. описание для
STATUS_CODE, чтобы узнать, чем оно отличается отSTATUS.Журнал аудита не содержит значения SQLSTATE или сообщения об ошибке. Чтобы увидеть соответствия между кодами ошибок, значениями SQLSTATE и сообщениями, см. .
Предупреждения не регистрируются.
Пример:
STATUS="1051" -
STATUS_CODEБеззнаковое целое число, представляющее статус команды: 0 для успешного выполнения, 1 при возникновении ошибки.
Значение
STATUS_CODEотличается от значенияSTATUS:STATUS_CODEравно 0 для успешного выполнения и 1 для ошибки, что совместимо с потребителем EZ_collector для Audit Vault.STATUS— это значение функции C API. Это 0 для успешного выполнения и ненулевое значение для ошибки, и поэтому необязательно 1 для ошибки.Пример:
STATUS_CODE="0" -
TABLEСтрока, представляющая имя таблицы.
Пример:
TABLE="t3" -
USERСтрока, представляющая имя пользователя, отправленное клиентом. Это может отличаться от значения
PRIV_USER. -
VERSIONБеззнаковое целое число, представляющее версию формата файла журнала аудита.
Пример:
VERSION="1"
Формат файла журнала аудита JSON
Для журналирования аудита в формате JSON (audit_log_format=JSON) содержимое файла журнала представляет собой массив JSON , где каждый элемент массива представляет собой аудиторское событие как JSON хеш пар ключ-значение. Примеры полных записей событий представлены позже в этом разделе. Ниже приведён фрагмент частичных событий:
[
{
"timestamp": "2019-10-03 13:50:01",
"id": 0,
"class": "audit",
"event": "startup",
...
},
{
"timestamp": "2019-10-03 15:02:32",
"id": 0,
"class": "connection",
"event": "connect",
...
},
...
{
"timestamp": "2019-10-03 17:37:26",
"id": 0,
"class": "table_access",
"event": "insert",
...
}
...
]
Файл журнала аудита записывается в кодировке UTF-8 (до 4 байт на символ). Когда плагин журнала аудита начинает запись нового файла журнала, он записывает открывающий маркер массива [. Когда плагин закрывает файл журнала, он записывает закрывающий маркер массива ]. Закрывающего маркера нет, пока файл открыт.
Элементы внутри записей аудита имеют следующие характеристики:
Некоторые элементы присутствуют в каждой записи аудита. Другие являются необязательными и могут появляться в зависимости от типа записи аудита.
Порядок элементов в записи аудита не гарантируется.
Значения элементов не имеют фиксированной длины. Длинные значения могут быть усечены, как указано в описаниях элементов позже.
Символы
"и\закодированы как\"и\\соответственно.
Формат JSON — единственный формат файла журнала аудита, который поддерживает необязательные статистику времени запроса и размер. Эти данные доступны в журнале медленных запросов для соответствующих запросов, и в контексте журнала аудита они аналогичным образом помогают обнаружить аномалии для анализа активности.
Чтобы добавить статистику запроса в файл журнала, необходимо настроить её как фильтр, используя функцию журнала аудита audit_log_filter_set_filter() как элемент сервиса в синтаксисе фильтрации JSON. Инструкции по выполнению этого действия см. в Добавление статистики запросов для обнаружения выбросов. Для того, чтобы поля bytes_sent и bytes_received были заполнены, необходимо установить системную переменную log_slow_extra в значение ON.
Следующие примеры демонстрируют форматы JSON-объектов для различных типов событий (как указано элементами class и event), слегка переформатированные для удобства чтения:
Событие запуска аудита:
{ "timestamp": "2019-10-03 14:21:56",
"id": 0,
"class": "audit",
"event": "startup",
"connection_id": 0,
"startup_data": { "server_id": 1,
"os_version": "i686-Linux",
"mysql_version": "5.7.21-log",
"args": ["/usr/local/mysql/bin/mysqld",
"--loose-audit-log-format=JSON",
"--log-error=log.err",
"--pid-file=mysqld.pid",
"--port=3306" ] } }
Когда плагин журнала аудита запускается в результате запуска сервера (в отличие от включения во время выполнения), connection_id устанавливается в 0, а account и login отсутствуют.
Событие завершения аудита:
{ "timestamp": "2019-10-03 14:28:20",
"id": 3,
"class": "audit",
"event": "shutdown",
"connection_id": 0,
"shutdown_data": { "server_id": 1 } }
Когда плагин журнала аудита удаляется в результате завершения работы сервера (в отличие от отключения во время выполнения), connection_id устанавливается в 0, а account и login отсутствуют.
Событие подключения или смены пользователя:
{ "timestamp": "2019-10-03 14:23:18",
"id": 1,
"class": "connection",
"event": "connect",
"connection_id": 5,
"account": { "user": "root", "host": "localhost" },
"login": { "user": "root", "os": "", "ip": "::1", "proxy": "" },
"connection_data": { "connection_type": "ssl",
"status": 0,
"db": "test",
"connection_attributes": {
"_pid": "43236",
...
"program_name": "mysqladmin"
} }
}
Событие разъединения:
{ "timestamp": "2019-10-03 14:24:45",
"id": 3,
"class": "connection",
"event": "disconnect",
"connection_id": 5,
"account": { "user": "root", "host": "localhost" },
"login": { "user": "root", "os": "", "ip": "::1", "proxy": "" },
"connection_data": { "connection_type": "ssl" } }
Событие запроса:
{ "timestamp": "2019-10-03 14:23:35",
"id": 2,
"class": "general",
"event": "status",
"connection_id": 5,
"account": { "user": "root", "host": "localhost" },
"login": { "user": "root", "os": "", "ip": "::1", "proxy": "" },
"general_data": { "command": "Query",
"sql_command": "show_variables",
"query": "SHOW VARIABLES",
"status": 0 } }
Событие запроса с необязательной статистикой запроса для обнаружения выбросов:
{ "timestamp": "2022-01-28 13:09:30",
"id": 0,
"class": "general",
"event": "status",
"connection_id": 46,
"account": { "user": "user", "host": "localhost" },
"login": { "user": "user", “os": "", “ip": "127.0.0.1", “proxy": "" },
"general_data": { "command": "Query",
"sql_command": "insert",
"query": "INSERT INTO audit_table VALUES(4)",
"status": 1146 }
"query_statistics": { "query_time": 0.116250,
"bytes_sent": 18384,
"bytes_received": 78858,
"rows_sent": 3,
"rows_examined": 20878 } }
Событие доступа к таблице (чтение, удаление, вставка, обновление):
{ "timestamp": "2019-10-03 14:23:41",
"id": 0,
"class": "table_access",
"event": "insert",
"connection_id": 5,
"account": { "user": "root", "host": "localhost" },
"login": { "user": "root", "os": "", "ip": "127.0.0.1", "proxy": "" },
"table_access_data": { "db": "test",
"table": "t1",
"query": "INSERT INTO t1 (i) VALUES(1),(2),(3)",
"sql_command": "insert" } }
Элементы в следующем списке появляются на верхнем уровне записей аудита в формате JSON: Каждое значение элемента — это скаляр или JSON хеш. Для элементов, имеющих значение хеш, в описании указаны только имена элементов внутри этого хеша. Для более подробных описаний элементов хеша второго уровня см. далее в этом разделе.
-
accountMySQL-аккаунт, связанный с событием. Значение — хеш, содержащий элементы, эквивалентные значению функции
CURRENT_USER()в разделе:user,host.Пример:
"account": { "user": "root", "host": "localhost" } -
classСтрока, представляющая класс события. Класс определяет тип события, если рассматривать его вместе с элементом
event, который указывает подкласс события.Пример:
"class": "connection"
Следующая таблица демонстрирует допустимые комбинации значений
classиevent.Таблица 8.33 Комбинации класса и события журнала аудита
Таблица 8.33 Комбинации класса и события журнала аудита Значение класса Допустимые значения события auditstartup,shutdownconnectionconnect,change_user,disconnectgeneralstatustable_access_dataread,delete,insert,update
-
connection_dataИнформация о подключении клиента. Значение — хеш, содержащий эти элементы:
connection_type,status,dbи возможноconnection_attributes. Этот элемент встречается только в записях аудита со значениемclassравнымconnection.Пример:
"connection_data": { "connection_type": "ssl", "status": 0, "db": "test" }События со значением
classравнымconnectionи значениемeventравнымconnectмогут включать элементconnection_attributesдля отображения атрибутов подключения, переданных клиентом во время подключения. (Для получения информации об этих атрибутах, которые также доступны в таблицах Performance Schema, см. Раздел 29.12.9, «Таблицы атрибутов подключения Performance Schema».)Значение
connection_attributes— хеш, представляющий каждый атрибут по его имени и значению.Пример:
"connection_attributes": { "_pid": "43236", "_os": "macos0.14", "_platform": "x86_64", "_client_version": "8.4.0", "_client_name": "libmysql", "program_name": "mysqladmin" }Если атрибуты подключения отсутствуют в событии, они не регистрируются, и элемент
connection_attributesне появляется. Это может произойти, если попытка подключения не удалась, клиент не передал атрибутов или подключение произошло внутри системы, например, во время запуска сервера или при инициализации плагином. -
connection_idБеззнаковое целое число, представляющее идентификатор подключения клиента. Это то же значение, что и возвращаемое функцией
CONNECTION_ID()в сеансе.Пример:
"connection_id": 5
-
eventСтрока, представляющая подкласс класса события. Подкласс определяет тип события, когда рассматривается вместе с элементом
class, указывающим класс события. Дополнительную информацию см. в описании элементаclass.Пример:
"event": "connect"
-
general_dataИнформация об исполненном операторе или команде. Значение — хеш, содержащий эти элементы:
command,sql_command,query,status. Этот элемент встречается только в записях аудита со значениемclass, равнымgeneral.Пример:
"general_data": { "command": "Query", "sql_command": "show_variables", "query": "SHOW VARIABLES", "status": 0 } -
idБеззнаковое целое число, представляющее идентификатор события.
Пример:
"id": 2
Для записей аудита с одинаковым значением
timestampих значенияidразличают их и образуют последовательность. В журнале аудита парыtimestamp/idуникальны. Эти пары служат метками, идентифицирующими местоположение событий в журнале. -
loginИнформация о том, как клиент подключился к серверу. Значение — хеш, содержащий эти элементы:
user,os,ip,proxy.Пример:
"login": { "user": "root", "os": "", "ip": "::1", "proxy": "" } -
query_statisticsНеобязательные статистические данные запроса для выявления аномалий. Значение — хеш, содержащий эти элементы:
query_time,rows_sent,rows_examined,bytes_received,bytes_sent. Инструкции по настройке статистических данных запроса см. в разделе Добавление статистических данных запроса для выявления аномалий.Пример:
"query_statistics": { "query_time": 0.116250, "bytes_sent": 18384, "bytes_received": 78858, "rows_sent": 3, "rows_examined": 20878 } -
shutdown_dataИнформация о завершении плагина журнала аудита. Значение — хеш, содержащий эти элементы:
server_id. Этот элемент встречается только в записях аудита со значениямиclassиevent, соответственно, равнымиauditиshutdown.Пример:
"shutdown_data": { "server_id": 1 } -
startup_dataИнформация об инициализации плагина журнала аудита. Значение — хеш, содержащий эти элементы:
server_id,os_version,mysql_version,args. Этот элемент встречается только в записях аудита со значениямиclassиevent, соответственно, равнымиauditиstartup.Пример:
"startup_data": { "server_id": 1, "os_version": "i686-Linux", "mysql_version": "5.7.21-log", "args": ["/usr/local/mysql/bin/mysqld", "--loose-audit-log-format=JSON", "--log-error=log.err", "--pid-file=mysqld.pid", "--port=3306" ] } -
table_access_dataИнформация о доступе к таблице. Значение — хеш, содержащий эти элементы:
db,table,query,sql_command. Этот элемент встречается только в записях аудита со значениемclass, равнымtable_access.Пример:
"table_access_data": { "db": "test", "table": "t1", "query": "INSERT INTO t1 (i) VALUES(1),(2),(3)", "sql_command": "insert" } -
timeЭтот поле аналогичен полю
timestamp, но значение является целым числом и представляет собой значение временной метки UNIX, указывающее дату и время создания события аудита.Пример:
"time" : 1618498687
Поле
timeпоявляется в файлах журналов в формате JSON только в том случае, если системная переменнаяaudit_log_format_unix_timestampвключена. -
timestampСтрока, представляющая значение UTC в формате
YYYY-MM-DD hh:mm:ss, указывающее дату и время создания события аудита. Например, событие, соответствующее выполнению SQL-запроса, полученного от клиента, имеет значениеtimestamp, которое появляется после завершения запроса, а не при его получении.Пример:
"timestamp": "2019-10-03 13:50:01"
Для записей аудита с одинаковым значением
timestampих значенияidразличают их и образуют последовательность. В журнале аудита парыtimestamp/idуникальны. Эти пары служат метками, идентифицирующими местоположение событий в журнале.
Эти элементы появляются внутри значений хешей, связанных с элементами верхнего уровня записей журналов аудита в формате JSON:
-
argsМассив опций, заданных в командной строке или файлах опций при запуске сервера MySQL. Первой опцией является путь к исполняемому файлу сервера.
Пример:
"args": ["/usr/local/mysql/bin/mysqld", "--loose-audit-log-format=JSON", "--log-error=log.err", "--pid-file=mysqld.pid", "--port=3306" ] -
bytes_receivedКоличество байтов, полученных от клиента. Этот элемент является частью необязательной статистики запросов. Для заполнения этого поля переменная системы
log_slow_extraдолжна быть установлена вON.Пример:
"bytes_received": 78858
-
bytes_sentКоличество байтов, отправленных клиенту. Этот элемент является частью необязательной статистики запросов. Для заполнения этого поля переменная системы
log_slow_extraдолжна быть установлена вON.Пример:
"bytes_sent": 18384
-
commandСтрока, представляющая тип инструкции, которая сгенерировала событие аудита, например, команду, полученную сервером от клиента.
Пример:
"command": "Query"
-
connection_typeСостояние безопасности подключения к серверу. Допустимые значения:
tcp/ip(TCP/IP-соединение установлено без шифрования),ssl(TCP/IP-соединение установлено с шифрованием),socket(соединение по Unix-сокету),named_pipe(соединение по именованной трубе Windows) иshared_memory(соединение по общей памяти Windows).Пример:
"connection_type": "tcp/tcp"
-
dbСтрока, представляющая имя базы данных. Для
connection_dataэто база данных по умолчанию. Дляtable_access_dataэто база данных таблиц.Пример:
"db": "test"
-
hostСтрока, представляющая имя хоста клиента.
Пример:
"host": "localhost"
-
ipСтрока, представляющая IP-адрес клиента.
Пример:
"ip": "::1"
-
mysql_versionСтрока, представляющая версию сервера MySQL. Она совпадает со значением функции
VERSION()или переменной системыversion.Пример:
"mysql_version": "5.7.21-log"
-
osСтрока, представляющая имя внешнего пользователя, используемого во время процесса аутентификации, заданное используемым для аутентификации клиента плагином. При использовании собственной (встроенной) аутентификации MySQL или если значение не задано плагином, этот атрибут пустой. Значение совпадает со значением переменной системы
external_user. См. Раздел 8.2.19, «Proxy Users».Пример:
"os": "jeffrey"
-
os_versionСтрока, представляющая операционную систему, на которой был построен или работает сервер.
Пример:
"os_version": "i686-Linux"
-
proxyСтрока, представляющая прокси-пользователя (см. Раздел 8.2.19, «Proxy Users»). Значение пустое, если проксирование пользователя не активно.
Пример:
"proxy": "developer"
-
queryСтрока, представляющая текст SQL-запроса. Значение может быть пустым. Длинные значения могут быть усечены. Строка, подобно самому файлу журнала аудита, записывается с использованием UTF-8 (до 4 байтов на символ), поэтому значение может быть результатом преобразования. Например, исходный запрос мог быть получен от клиента в виде строки SJIS.
Пример:
"query": "DELETE FROM t1"
-
query_timeВремя выполнения запроса в микросекундах (если выбран тип данных
longlong) или секундах (если выбран тип данныхdouble). Этот элемент является частью необязательной статистики запросов.Пример:
"query_time": 0.116250
-
rows_examinedКоличество строк, к которым был произведен доступ во время запроса. Этот элемент является частью необязательной статистики запросов.
Пример:
"rows_examined": 20878
-
rows_sentКоличество строк, отправленных клиенту в результате. Этот элемент является частью необязательной статистики запросов.
Пример:
"rows_sent": 3
-
server_idБеззнаковое целое число, представляющее идентификатор сервера. Это то же самое, что значение переменной системы
server_id.Пример:
"server_id": 1
-
sql_commandСтрока, указывающая тип SQL-запроса.
Пример:
"sql_command": "insert"
Значения соответствуют счетчикам команд
statement/sql/. Например,xxxxxxсоответствуетdrop_tableиselectдля запросовDROP TABLEиSELECTсоответственно. Следующее утверждение отображает возможные имена:SELECT REPLACE(EVENT_NAME, 'statement/sql/', '') AS name FROM performance_schema.events_statements_summary_global_by_event_name WHERE EVENT_NAME LIKE 'statement/sql/%' ORDER BY name;
-
statusБеззнаковое целое число, представляющее статус команды: 0 — успех, ненулевое значение — ошибка. Это совпадает со значением функции C API.
Журнал аудита не содержит значение SQLSTATE или сообщение об ошибке. Чтобы увидеть соответствия между кодами ошибок, значениями SQLSTATE и сообщениями, см. .
Предупреждения не регистрируются.
Пример:
"status": 1051
-
tableСтрока, представляющая имя таблицы.
Пример:
"table": "t1"
-
userСтрока, представляющая имя пользователя. Значение отличается в зависимости от элемента, в котором встречается
user:В элементах
account,user— это строка, представляющая пользователя, под которым сервер аутентифицировал клиента. Это имя пользователя, которое сервер использует для проверки привилегий.В элементах
login,user— это строка, представляющая имя пользователя, отправленное клиентом.
Пример:
"user": "root"
© 2025 Oracle
Licensed under the GPLv2 License.