Spec-Zone.ru › MySQL 5.7

6.4.5.6 Чтение файлов журнала аудита

Плагин журнала аудита поддерживает функции, предоставляющие SQL-интерфейс для чтения файлов журнала аудита в формате JSON. (Эта возможность не применяется к файлам журналов, записанным в других форматах.)

При инициализации и настройке плагина журнала аудита для записи в формате JSON он использует каталог, содержащий текущий файл журнала аудита, в качестве места поиска читаемых файлов журнала аудита. Плагин определяет расположение файла, базовое имя и суффикс по значению системной переменной audit_log_file, затем ищет файлы с именами, соответствующими следующему шаблону, где [...] обозначает необязательные части имени файла:

basename[.timestamp].suffix[.gz][.enc]

Если имя файла заканчивается на .enc, файл зашифрован, и для чтения его незашифрованного содержимого требуется пароль дешифрования, полученный из хранилища ключей. Дополнительную информацию о зашифрованных файлах журнала аудита см. в разделе Шифрование файлов журнала аудита.

Плагин игнорирует файлы, которые были переименованы вручную и не соответствуют шаблону, а также файлы, зашифрованные паролем, больше не доступным в хранилище ключей. Плагин открывает каждый оставшийся кандидатный файл, проверяет, что файл действительно содержит JSON события аудита, и сортирует файлы по меткам времени из первого события каждого файла. Результатом является последовательность файлов, доступ к которым осуществляется с помощью функций чтения журналов:

  • audit_log_read() считывает события из журнала аудита или закрывает процесс чтения.

  • audit_log_read_bookmark() возвращает закладку для самого последнего события журнала аудита. Эта закладка подходит для передачи функции audit_log_read() для указания места начала чтения.

audit_log_read() принимает необязательный JSON строковый аргумент, и результатом успешного вызова любой из функций является JSON строка.

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

  • Вызовите audit_log_read() для чтения событий, начиная с заданной позиции или текущей позиции, или для закрытия чтения:

    • Для инициализации последовательности чтения журнала аудита передайте аргумент, указывающий позицию начала. Один из способов сделать это — передать закладку, возвращаемую audit_log_read_bookmark():

      SELECT audit_log_read(audit_log_read_bookmark());
      
    • Для продолжения чтения с текущей позиции в последовательности вызовите audit_log_read() без указания позиции:

      SELECT audit_log_read();
      
    • Для явного закрытия последовательности чтения передайте JSON null аргумент:

      SELECT audit_log_read('null');
      

      Явное закрытие чтения не является необходимым. Чтение закрывается неявно при завершении сессии или инициализации новой последовательности чтения путем вызова audit_log_read() с аргументом, указывающим позицию начала.

  • Успешный вызов audit_log_read() для чтения событий возвращает JSON строку, содержащую массив событий аудита:

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

    • Если последнее значение возвращаемого массива является JSON null значением, в текущей последовательности чтения больше событий для чтения не осталось.

    Каждый элемент массива, не являющийся null, представляет собой событие, представленное JSON хешем. Например:

    [
      {
        "timestamp": "2020-05-18 13:39:33", "id": 0,
        "class": "connection", "event": "connect",
        ...
      },
      {
        "timestamp": "2020-05-18 13:39:33", "id": 1,
        "class": "general", "event": "status",
        ...
      },
      {
        "timestamp": "2020-05-18 13:39:33", "id": 2,
        "class": "connection", "event": "disconnect",
        ...
      },
      null
    ]
    

    Дополнительную информацию о содержимом событий аудита в формате JSON см. в разделе Формат файла журнала аудита JSON.

  • Вызов audit_log_read() для чтения событий без указания позиции приводит к ошибке в следующих случаях:

    • Последовательность чтения еще не была инициализирована путем передачи позиции в audit_log_read().

    • В текущей последовательности чтения больше событий для чтения не осталось; то есть audit_log_read() ранее возвратил массив, заканчивающийся JSON null значением.

    • Последняя последовательность чтения была закрыта путем передачи JSON null значения в audit_log_read().

    Для чтения событий в этих случаях необходимо сначала инициализировать последовательность чтения, вызвав audit_log_read() с аргументом, указывающим позицию.

Для указания позиции в audit_log_read() передайте закладку, которая является JSON хешем, содержащим timestamp и id элементы, уникально идентифицирующие определенное событие. Вот пример закладки, полученной путем вызова функции audit_log_read_bookmark():

mysql> SELECT audit_log_read_bookmark();
+-------------------------------------------------+
| audit_log_read_bookmark()                       |
+-------------------------------------------------+
| { "timestamp": "2020-05-18 21:03:44", "id": 0 } |
+-------------------------------------------------+

Передача текущей закладки функции audit_log_read() инициализирует чтение событий, начиная с позиции закладки:

mysql> SELECT audit_log_read(audit_log_read_bookmark());
+-----------------------------------------------------------------------+
| audit_log_read(audit_log_read_bookmark())                             |
+-----------------------------------------------------------------------+
| [ {"timestamp":"2020-05-18 22:41:24","id":0,"class":"connection", ... |
+-----------------------------------------------------------------------+

Аргумент функции audit_log_read() является необязательным. Если он присутствует, он может быть JSON null значением для закрытия последовательности чтения или JSON хешем.

Внутри хеш-аргумента функции audit_log_read() элементы являются необязательными и управляют аспектами операции чтения, такими как позиция начала чтения или количество считываемых событий. Следующие элементы значимы (другие элементы игнорируются):

  • timestamp, id: Позиция в журнале аудита первого события для чтения. Если позиция опущена из аргумента, чтение продолжается с текущей позиции. Элементы timestamp и id вместе образуют закладку, уникально идентифицирующую конкретное событие. Если аргумент функции audit_log_read() включает любой из этих элементов, он должен включать оба для полного указания позиции, иначе произойдет ошибка.

  • max_array_length: Максимальное количество событий для чтения из журнала. Если этот элемент опушен, по умолчанию считывается до конца журнала или до заполнения буфера чтения, что произойдет раньше.

Примеры аргументов, принимаемых функцией audit_log_read():

  • Чтение событий, начиная с события, имеющего точное значение метки времени и идентификатора события:

    audit_log_read('{ "timestamp": "2020-05-24 12:30:00", "id": 0 }')
    
  • Как в предыдущем примере, но не более 3 событий:

    audit_log_read('{ "timestamp": "2020-05-24 12:30:00", "id": 0, "max_array_length": 3 }')
    
  • Чтение событий с текущей позиции в последовательности чтения:

    audit_log_read()
    
  • Чтение не более 5 событий, начиная с текущей позиции в последовательности чтения:

    audit_log_read('{ "max_array_length": 5 }')
    
  • Закрытие текущей последовательности чтения:

    audit_log_read('null')
    

Для использования бинарной JSON строки с функциями, требующими небинарной строки (например, функциями, обрабатывающими JSON значения), выполните преобразование в utf8mb4. Предположим, что вызов для получения закладки возвращает это значение:

mysql> SET @mark := audit_log_read_bookmark();
mysql> SELECT @mark;
+-------------------------------------------------+
| @mark                                           |
+-------------------------------------------------+
| { "timestamp": "2020-05-18 16:10:28", "id": 2 } |
+-------------------------------------------------+

Вызов audit_log_read() с этим аргументом может вернуть несколько событий. Чтобы ограничить audit_log_read() чтением не более N событий, преобразуйте строку в utf8mb4, а затем добавьте к ней элемент max_array_length с этим значением. Например, чтобы прочитать одно событие, измените строку следующим образом:

mysql> SET @mark = CONVERT(@mark USING utf8mb4);
mysql> SET @mark := JSON_SET(@mark, '$.max_array_length', 1);
mysql> SELECT @mark;
+----------------------------------------------------------------------+
| @mark                                                                |
+----------------------------------------------------------------------+
| {"id": 2, "timestamp": "2020-05-18 16:10:28", "max_array_length": 1} |
+----------------------------------------------------------------------+

Изменённая строка, при передаче в audit_log_read(), производит результат, содержащий не более одного события, независимо от того, сколько их доступно.

Чтобы прочитать определённое количество событий, начиная с текущей позиции, передайте JSON хэш, который включает значение max_array_length, но не позицию. Это утверждение, вызываемое многократно, возвращает пять событий каждый раз, пока не закончатся события:

SELECT audit_log_read('{"max_array_length": 5}');

Чтобы установить ограничение на количество байтов, которые audit_log_read() считывает, установите системную переменную audit_log_read_buffer_size. Начиная с MySQL 5.7.23, значение этой переменной по умолчанию составляет 32 КБ и может быть установлено во время выполнения. Каждый клиент должен установить значение своей сессии audit_log_read_buffer_size соответствующим образом для своего использования audit_log_read(). До MySQL 5.7.23, audit_log_read_buffer_size имеет значение по умолчанию 1 МБ, влияет на всех клиентов и может быть изменено только при запуске сервера.

Для дополнительной информации о функциях чтения журнала аудита, см. Функции журнала аудита.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/audit-log-file-reading.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API