Spec-Zone.ru › MySQL 9.2

7.1.9.3 Переменные системы, сохраняемые в памяти

Сервер MySQL поддерживает переменные системы, которые конфигурируют его работу. Переменная системы может иметь глобальное значение, влияющее на работу сервера в целом, сессионное значение, влияющее на текущую сессию, или оба значения. Многие переменные системы являются динамическими и могут быть изменены во время выполнения с помощью оператора SET, чтобы повлиять на работу текущей инстанции сервера. SET также может использоваться для сохранения определенных глобальных переменных системы в файл mysqld-auto.cnf в каталоге данных, чтобы повлиять на работу сервера при последующих запусках. RESET PERSIST удаляет сохраненные настройки из mysqld-auto.cnf.

В следующем обсуждении описываются аспекты сохранения переменных системы:

  • Обзор переменных системы, сохраняемых в памяти

  • Синтаксис сохранения переменных системы

  • Получение информации о переменных системы, сохраняемых в памяти

  • Формат и обработка сервером файла mysqld-auto.cnf

  • Сохранение конфиденциальных переменных системы

Обзор переменных системы, сохраняемых в памяти

Возможность сохранения глобальных переменных системы во время выполнения позволяет сохранять конфигурацию сервера при перезапуске. Хотя многие переменные системы могут быть установлены при запуске из файла опций my.cnf или во время выполнения с помощью оператора SET, эти методы конфигурации сервера либо требуют доступа к хосту сервера, либо не обеспечивают возможность постоянной конфигурации сервера во время выполнения или удаленно:

  • Изменение файла опций требует прямого доступа к этому файлу, что требует входа в систему на хосте сервера MySQL. Это не всегда удобно.

  • Изменение переменных системы с помощью оператора SET GLOBAL — это возможность во время выполнения, которая может быть выполнена из локальных клиентов или удаленных хостов, но изменения влияют только на текущую работающую инстанцию сервера. Эти настройки не сохраняются и не переносятся на последующие запуски сервера.

Для расширения административных возможностей конфигурации сервера сверх возможностей редактирования файлов опций или использования оператора SET GLOBAL, MySQL предоставляет варианты синтаксиса оператора SET, которые сохраняют настройки переменных системы в файл с именем mysqld-auto.cnf в каталоге данных. Примеры:

SET PERSIST max_connections = 1000;
SET @@PERSIST.max_connections = 1000;

SET PERSIST_ONLY back_log = 100;
SET @@PERSIST_ONLY.back_log = 100;

MySQL также предоставляет оператор RESET PERSIST для удаления сохраненных переменных системы из mysqld-auto.cnf.

Конфигурация сервера, выполняемая путем сохранения переменных системы, обладает следующими характеристиками:

  • Сохраненные настройки выполняются во время работы.

  • Сохраненные настройки постоянные. Они применяются при всех перезапусках сервера.

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

  • Для сохранения переменных системы не требуется доступ к хосту сервера MySQL или доступ к файлам опций. Возможность сохранения настроек контролируется системой привилегий MySQL. См. Раздел 7.1.9.1, «Привилегии переменных системы».

  • Администратор с достаточными привилегиями может переконфигурировать сервер, сохранив переменные системы, а затем заставить сервер немедленно использовать измененные настройки, выполнив оператор RESTART.

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

Синтаксис сохранения переменных системы

Эти варианты синтаксиса оператора SET доступны для сохранения переменных системы:

  • Чтобы сохранить глобальную переменную системы в файл опций mysqld-auto.cnf в каталоге данных, поместите перед именем переменной ключевое слово PERSIST или квалификатор @@PERSIST.:

    SET PERSIST max_connections = 1000;
    SET @@PERSIST.max_connections = 1000;
    

    Как и оператор SET GLOBAL, оператор SET PERSIST устанавливает глобальное значение переменной во время выполнения, но также записывает настройку переменной в файл mysqld-auto.cnf (заменяя любую существующую настройку переменной, если она есть).

  • Чтобы сохранить глобальную переменную системы в файл mysqld-auto.cnf без установки глобального значения переменной во время выполнения, поместите перед именем переменной ключевое слово PERSIST_ONLY или квалификатор @@PERSIST_ONLY.:

    SET PERSIST_ONLY back_log = 1000;
    SET @@PERSIST_ONLY.back_log = 1000;
    

    Как и оператор PERSIST, оператор PERSIST_ONLY записывает настройку переменной в файл mysqld-auto.cnf. Однако, в отличие от оператора PERSIST, оператор PERSIST_ONLY не изменяет текущее глобальное значение переменной. Это делает оператор PERSIST_ONLY подходящим для конфигурации только для чтения переменных системы, которые могут быть установлены только при запуске сервера.

Дополнительную информацию об операторе SET см. в разделе 15.7.6.1, «Синтаксис оператора SET для присвоения переменных».

Эти варианты синтаксиса оператора RESET PERSIST доступны для удаления сохраненных переменных системы:

  • Чтобы удалить все сохраненные переменные из mysqld-auto.cnf, используйте оператор RESET PERSIST без указания имени переменной системы:

    RESET PERSIST;
    
  • Чтобы удалить определенную сохраненную переменную из mysqld-auto.cnf, укажите ее имя в операторе:

    RESET PERSIST system_var_name;
    

    Это включает переменные системы плагинов, даже если плагин не установлен в данный момент. Если переменная отсутствует в файле, возникает ошибка.

  • Чтобы удалить определенную сохраненную переменную из mysqld-auto.cnf, но вместо ошибки вывести предупреждение, если переменная отсутствует в файле, добавьте в предыдущий синтаксис предложение IF EXISTS:

    RESET PERSIST IF EXISTS system_var_name;
    

Дополнительную информацию об операторе RESET PERSIST см. в разделе 15.7.8.7, «Оператор RESET PERSIST».

Использование оператора SET для сохранения глобальной переменной системы в значение DEFAULT или в ее литерное значение по умолчанию присваивает переменной ее значение по умолчанию и добавляет настройку переменной в mysqld-auto.cnf. Чтобы удалить переменную из файла, используйте оператор RESET PERSIST.

Некоторые переменные системы не могут быть сохранены. См. раздел 7.1.9.4, «Несохраняемые и ограниченные сохранением переменные системы».

Переменная системы, реализованная плагином, может быть сохранена, если плагин установлен во время выполнения оператора SET. Присвоение сохраненной переменной плагина вступает в силу при последующих перезапусках сервера, если плагин все еще установлен. Если плагин больше не установлен, переменная плагина отсутствует, когда сервер читает файл mysqld-auto.cnf. В этом случае сервер записывает предупреждение в журнал ошибок и продолжает работу:

currently unknown variable 'var_name'
was read from the persisted config file
Получение информации о сохранённых системных переменных

Таблица Performance Schema persisted_variables предоставляет SQL-интерфейс к файлу mysqld-auto.cnf, позволяя инспектировать его содержимое во время выполнения с помощью операторов SELECT. См. Раздел 29.12.14.2, «Таблица Performance Schema persisted_variables».

Таблица Performance Schema variables_info содержит информацию о том, когда и каким пользователем последняяжды была установлена каждая системная переменная. См. Раздел 29.12.14.3, «Таблица Performance Schema variables_info».

RESET PERSIST влияет на содержимое таблицы persisted_variables, так как содержимое таблицы соответствует содержимому файла mysqld-auto.cnf. С другой стороны, поскольку RESET PERSIST не изменяет значения переменных, он не оказывает влияния на содержимое таблицы variables_info, пока сервер не перезапущен.

Формат и обработка файла mysqld-auto.cnf сервером

Файл mysqld-auto.cnf использует формат JSON, например (небольшая переформатировка для читаемости):

{
  "Version": 1,
  "mysql_server": {
    "max_connections": {
      "Value": "152",
      "Metadata": {
        "Timestamp": 1519921341372531,
        "User": "root",
        "Host": "localhost"
      }
    },
    "transaction_isolation": {
      "Value": "READ-COMMITTED",
      "Metadata": {
        "Timestamp": 1519921553880520,
        "User": "root",
        "Host": "localhost"
      }
    },
    "mysql_server_static_options": {
      "innodb_api_enable_mdl": {
        "Value": "0",
        "Metadata": {
          "Timestamp": 1519922873467872,
          "User": "root",
          "Host": "localhost"
        }
      },
      "log_replica_updates": {
        "Value": "1",
        "Metadata": {
          "Timestamp": 1519925628441588,
          "User": "root",
          "Host": "localhost"
        }
      }
    }
  }
}

При запуске сервер обрабатывает файл mysqld-auto.cnf после всех других файлов параметров (см. Раздел 6.2.2.2, «Использование файлов параметров»). Сервер обрабатывает содержимое файла следующим образом:

  • Если системная переменная persisted_globals_load отключена, сервер игнорирует файл mysqld-auto.cnf.

  • Раздел "mysql_server_static_options" содержит только для чтения переменные, сохранённые с помощью SET PERSIST_ONLY. Раздел также может (несмотря на название) содержать некоторые динамические переменные, которые не являются только для чтения. Все переменные, присутствующие в этом разделе, добавляются к командной строке и обрабатываются вместе с другими параметрами командной строки.

  • Все остальные сохранённые переменные устанавливаются путём выполнения эквивалента оператора SET GLOBAL позже, непосредственно перед началом прослушивания сервером подключений клиентов. Таким образом, эти настройки вступают в силу только на поздней стадии процесса запуска, что может быть неприемлемо для некоторых системных переменных. Возможно, предпочтительнее устанавливать такие переменные в my.cnf, а не в mysqld-auto.cnf.

Управление файлом mysqld-auto.cnf должно осуществляться сервером. Изменение файла должно выполняться только с помощью операторов SET и RESET PERSIST, а не вручную:

  • Удаление файла приводит к потере всех сохранённых настроек при следующем запуске сервера. (Это допустимо, если вы хотите переконфигурировать сервер без этих настроек.) Чтобы удалить все настройки в файле, не удаляя сам файл, используйте этот оператор:

    RESET PERSIST;
    
  • Вручную внесенные изменения в файл могут привести к ошибке парсинга при запуске сервера. В этом случае сервер сообщает об ошибке и завершает работу. Если эта проблема возникает, запустите сервер с отключенной системной переменной persisted_globals_load или с параметром --no-defaults. В качестве альтернативы, удалите файл mysqld-auto.cnf. Однако, как отмечалось ранее, удаление этого файла приводит к потере всех сохранённых настроек.

Сохранение конфиденциальных системных переменных

MySQL 9.2 имеет возможность безопасно хранить сохранённые значения системных переменных, содержащих конфиденциальные данные, такие как закрытые ключи или пароли, и ограничивать просмотр этих значений. В настоящее время ни одна системная переменная MySQL Server не помечена как конфиденциальная, но эта возможность позволяет в будущем безопасно сохранять системные переменные, содержащие конфиденциальные данные. Файл конфигурации mysqld-auto.cnf, созданный MySQL 9.2, не может быть прочитан более старыми версиями MySQL Server.

Примечание

Для поддержки безопасного хранения сохранённых значений системных переменных на экземпляре MySQL Server должен быть включён компонент хранилища ключей, а не плагин хранилища ключей, который не поддерживает эту функцию. См. Раздел 8.4.4, «Хранилище ключей MySQL».

В файле конфигурации mysqld-auto.cnf имена и значения конфиденциальных системных переменных хранятся в зашифрованном формате, вместе с сгенерированным ключом файла для их расшифровки. Сгенерированный ключ файла, в свою очередь, зашифрован с использованием главного ключа (persisted_variables_key), хранящегося в хранилище ключей. При запуске сервера сохранённые конфиденциальные системные переменные расшифровываются и используются. По умолчанию, если в файле конфигурации присутствуют зашифрованные значения, но их невозможно успешно расшифровать при запуске, используются значения по умолчанию. Необязательная самая безопасная настройка заставляет сервер остановить запуск, если зашифрованные значения не могут быть расшифрованы.

Системная переменная persist_sensitive_variables_in_plaintext управляет тем, разрешено ли серверу хранить значения конфиденциальных системных переменных в незашифрованном формате, если поддержка компонента хранилища ключей недоступна в момент использования SET PERSIST для установки значения. Она также контролирует возможность запуска сервера, если зашифрованные значения не могут быть расшифрованы.

  • Значение по умолчанию, ON, шифрует значения, если доступна поддержка компонента хранилища ключей, и сохраняет их незашифрованными (с предупреждением), если нет. В следующий раз при установке любой сохранённой системной переменной, если поддержка хранилища ключей доступна в этот момент, сервер шифрует значения любых незашифрованных конфиденциальных системных переменных. Настройка ON также позволяет серверу начать работу, если зашифрованные значения системной переменной не могут быть расшифрованы, в этом случае выдаётся предупреждение, и используются значения по умолчанию для системных переменных. В этой ситуации их значения не могут быть изменены до тех пор, пока они не будут расшифрованы.

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

Права SENSITIVE_VARIABLES_OBSERVER позволяют обладателю просматривать значения конфиденциальных системных переменных в таблицах Performance Schema global_variables, session_variables, variables_by_thread и persisted_variables, выполнять операторы SELECT для возвращения их значений и отслеживать изменения в трекерах сессий для соединений. Пользователи без этих прав не могут просматривать или отслеживать эти значения системных переменных.

Если оператор SET вызывается для конфиденциальной системной переменной, запрос переписывается для замены значения на “<redacted>” перед его записью в общий журнал и журнал аудита. Это происходит даже в том случае, если безопасное хранение через компонент хранилища ключей недоступно на экземпляре сервера.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/persisted-system-variables.html

Spec-Zone.ru

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