7.1.9.3 Переменные системы, сохраняемые в памяти
Сервер MySQL поддерживает переменные системы, которые конфигурируют его работу. Переменная системы может иметь глобальное значение, влияющее на работу сервера в целом, сессионное значение, влияющее на текущую сессию, или оба значения. Многие переменные системы являются динамическими и могут быть изменены во время выполнения с помощью оператора SET, чтобы повлиять на работу текущей инстанции сервера. SET также может использоваться для сохранения определенных глобальных переменных системы в файл mysqld-auto.cnf в каталоге данных, чтобы повлиять на работу сервера при последующих запусках. RESET PERSIST удаляет сохраненные настройки из 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
Получение информации о переменных системы, сохраняемых в базе
Таблица persisted_variables схемы производительности предоставляет SQL-интерфейс к файлу mysqld-auto.cnf, позволяя просматривать его содержимое во время выполнения с помощью команд SELECT. См. Раздел 29.12.14.1, «Таблица Performance Schema persisted_variables».
Таблица variables_info схемы производительности содержит информацию о том, когда и каким пользователем последняя была установлена каждая переменная системы. См. Раздел 29.12.14.2, «Таблица 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 8.4 имеет возможность безопасно хранить сохранённые значения переменных системы, содержащие конфиденциальные данные, такие как закрытые ключи или пароли, и ограничивать просмотр этих значений. В настоящее время никакие переменные системы MySQL Server не помечены как конфиденциальные, но эта возможность позволяет в будущем безопасно сохранять в базе переменные системы, содержащие конфиденциальные данные.
Для поддержки безопасного хранения сохранённых значений переменных системы требуется включить компонент keyring на экземпляре MySQL Server, а не плагин keyring, который не поддерживает эту функцию. См. Раздел 8.4.4, «Система ключей MySQL».
В файле опций mysqld-auto.cnf имена и значения конфиденциальных переменных системы хранятся в зашифрованном формате вместе с сгенерированным ключом файла для их расшифровки. Сгенерированный ключ файла, в свою очередь, шифруется с помощью мастер-ключа (persisted_variables_key), который хранится в системе ключей. При запуске сервера сохранённые конфиденциальные переменные системы расшифровываются и используются. По умолчанию, если в файле опций присутствуют зашифрованные значения, но их нельзя успешно расшифровать при запуске, используются значения по умолчанию.
Переменная системы persist_sensitive_variables_in_plaintext управляет тем, разрешено ли серверу хранить значения конфиденциальных переменных в незашифрованном формате, если поддержка компонента keyring недоступна в момент использования SET
PERSIST для установки значения. Она также управляет тем, может ли сервер запускаться, если зашифрованные значения не могут быть расшифрованы.
Значение по умолчанию,
ON, шифрует значения, если доступна поддержка компонента keyring, и сохраняет их в незашифрованном виде (со предупреждением), если она недоступна. При следующем установлении любой сохранённой переменной системы, если поддержка keyring доступна в этот момент, сервер шифрует значения любых незашифрованных конфиденциальных переменных системы. НастройкаONтакже позволяет серверу запускаться, если зашифрованные значения переменных системы не могут быть расшифрованы, в этом случае выдаётся предупреждение и используются значения по умолчанию для переменных системы. В этой ситуации их значения не могут быть изменены до тех пор, пока они не будут расшифрованы.Наиболее безопасное значение,
OFF, означает, что конфиденциальные значения переменных системы не могут быть сохранены, если поддержка компонента keyring недоступна. НастройкаOFFтакже означает, что сервер не запускается, если зашифрованные значения переменных системы не могут быть расшифрованы.
Разрешение SENSITIVE_VARIABLES_OBSERVER позволяет держателю просматривать значения конфиденциальных переменных в таблицах схемы производительности global_variables, session_variables, variables_by_thread и persisted_variables, выполнять операторы SELECT для возвращения их значений и отслеживать изменения в трекерах сеансов для соединений. Пользователи без этого разрешения не могут просматривать или отслеживать эти значения переменных системы.
Если выдан оператор SET для конфиденциальной переменной системы, запрос переписывается, чтобы заменить значение на “<redacted>”, перед записью в общий журнал и журнал аудита. Это происходит даже в том случае, если безопасное хранение с помощью компонента keyring недоступно на экземпляре сервера.
© 2025 Oracle
Licensed under the GPLv2 License.