Spec-Zone.ru › MySQL 9.2

15.7.6.1 Синтаксис SET для присваивания переменным

SET variable = expr [, variable = expr] ...

variable: {
    user_var_name
  | param_name
  | local_var_name
  | {GLOBAL | @@GLOBAL.} system_var_name
  | {PERSIST | @@PERSIST.} system_var_name
  | {PERSIST_ONLY | @@PERSIST_ONLY.} system_var_name
  | [SESSION | @@SESSION. | @@] system_var_name
}

Синтаксис SET для присваивания переменным позволяет назначить значения различным типам переменных, которые влияют на работу сервера или клиентов:

  • Переменные, определённые пользователем. См. раздел 11.4, «Переменные, определённые пользователем».

  • Параметры и локальные переменные хранимых процедур и функций. См. раздел 15.6.4, «Переменные в хранимых программах».

  • Системные переменные. См. раздел 7.1.8, «Системные переменные сервера». Системные переменные также могут быть установлены при запуске сервера, как описано в разделе 7.1.9, «Использование системных переменных».

Оператор SET, который присваивает значения переменным, не записывается в бинарный журнал, поэтому в сценариях репликации он влияет только на хост, на котором вы его выполняете. Чтобы повлиять на все хосты репликации, выполните оператор на каждом хосте.

В следующих разделах описывается синтаксис SET для установки переменных. Они используют оператор присваивания =, но также допускается оператор присваивания := для этой цели.

  • Присваивание переменным, определённым пользователем

  • Присваивание параметров и локальных переменных

  • Присваивание системным переменным

  • Обработка ошибок SET

  • Присваивание множеству переменных

  • Ссылки на системные переменные в выражениях

Присваивание переменным, определённым пользователем

Переменные, определённые пользователем, создаются локально в сеансе и существуют только в контексте этого сеанса; см. раздел 11.4, «Переменные, определённые пользователем».

Переменная, определённая пользователем, записывается как @var_name и ей присваивается значение выражения следующим образом:

SET @var_name = expr;

Примеры:

SET @name = 43;
SET @total_tax = (SELECT SUM(tax) FROM taxable_transactions);

Как показано в этих операторах, expr может варьироваться от простого (литеральное значение) до более сложного (значение, возвращаемое скалярным подзапросом).

Таблица user_variables_by_thread схемы Performance содержит информацию о переменных, определённых пользователем. См. раздел 29.12.10, «Таблицы переменных, определённых пользователем, Performance Schema».

Присваивание параметров и локальных переменных

SET применяется к параметрам и локальным переменным в контексте хранимого объекта, в котором они определены. Следующая процедура использует параметр процедуры increment и локальную переменную counter:

CREATE PROCEDURE p(increment INT)
BEGIN
  DECLARE counter INT DEFAULT 0;
  WHILE counter < 10 DO
    -- ... do work ...
    SET counter = counter + increment;
  END WHILE;
END;
Назначение системных переменных

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

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

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

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

Чтобы сделать настройку глобальной системной переменной постоянной, чтобы она применялась при перезапусках сервера, можно сохранить её в файл mysqld-auto.cnf в каталоге данных. Также возможно внести постоянные изменения конфигурации, вручную изменив файл конфигурации my.cnf, но это более сложно, и ошибка в вручную введённой настройке может быть обнаружена гораздо позже. Операторы SET, которые сохраняют системные переменные, более удобны и исключают возможность неправильных настроек, так как настройки с синтаксическими ошибками не выполняются и не изменяют конфигурацию сервера. Более подробную информацию о сохранении системных переменных и файле mysqld-auto.cnf см. в Разделе 7.1.9.3, «Сохранённые системные переменные».

Примечание

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

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

  • Чтобы назначить значение глобальной системной переменной, добавьте перед именем переменной ключевое слово GLOBAL или квалификатор @@GLOBAL.:

    SET GLOBAL max_connections = 1000;
    SET @@GLOBAL.max_connections = 1000;
    
  • Чтобы назначить значение сессионной системной переменной, добавьте перед именем переменной ключевое слово SESSION или LOCAL, или квалификатор @@SESSION., @@LOCAL., или @@, или вообще не добавляйте ключевое слово или модификатор:

    SET SESSION sql_mode = 'TRADITIONAL';
    SET LOCAL sql_mode = 'TRADITIONAL';
    SET @@SESSION.sql_mode = 'TRADITIONAL';
    SET @@LOCAL.sql_mode = 'TRADITIONAL';
    SET @@sql_mode = 'TRADITIONAL';
    SET sql_mode = 'TRADITIONAL';
    

    Клиент может изменять свои собственные сессионные переменные, но не переменные других клиентов.

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

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

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

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

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

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

Чтобы установить глобальное значение системной переменной на значение по умолчанию, скомпилированное в MySQL, или сессионную системную переменную на текущее соответствующее глобальное значение, установите переменную на значение DEFAULT. Например, следующие два оператора идентичны по установке сессионного значения max_join_size на текущее глобальное значение:

SET @@SESSION.max_join_size = DEFAULT;
SET @@SESSION.max_join_size = @@GLOBAL.max_join_size;

Использование 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

Для отображения имён и значений системных переменных:

  • Используйте оператор SHOW VARIABLES; см. Раздел 15.7.7.41, «Оператор SHOW VARIABLES».

  • Несколько таблиц Performance Schema предоставляют информацию о системных переменных. См. Раздел 29.12.14, «Таблицы Performance Schema для системных переменных».

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

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

Обработка ошибок SET

Если присвоение значения переменной в операторе SET завершается ошибкой, весь оператор считается ошибочным, и никакие переменные не изменяются, а также не изменяется файл mysqld-auto.cnf.

Оператор SET генерирует ошибку в описанных выше обстоятельствах. Большинство примеров демонстрируют операторы SET с использованием ключевого синтаксиса (например, GLOBAL или SESSION), но принципы также справедливы для операторов с соответствующими модификаторами (например, @@GLOBAL. или @@SESSION.).

  • Использование SET (любой вариант) для присвоения значения только для чтения:

    mysql> SET GLOBAL version = 'abc';
    ERROR 1238 (HY000): Variable 'version' is a read only variable
    
  • Использование GLOBAL, PERSIST или PERSIST_ONLY для присвоения значения переменной, имеющей только сессионное значение:

    mysql> SET GLOBAL sql_log_bin = ON;
    ERROR 1228 (HY000): Variable 'sql_log_bin' is a SESSION
    variable and can't be used with SET GLOBAL
    
  • Использование SESSION для присвоения значения переменной, имеющей только глобальное значение:

    mysql> SET SESSION max_connections = 1000;
    ERROR 1229 (HY000): Variable 'max_connections' is a
    GLOBAL variable and should be set with SET GLOBAL
    
  • Опускание GLOBAL, PERSIST или PERSIST_ONLY для присвоения значения переменной, имеющей только глобальное значение:

    mysql> SET max_connections = 1000;
    ERROR 1229 (HY000): Variable 'max_connections' is a
    GLOBAL variable and should be set with SET GLOBAL
    
  • Использование PERSIST или PERSIST_ONLY для присвоения значения переменной, которая не может быть сохранена:

    mysql> SET PERSIST port = 3307;
    ERROR 1238 (HY000): Variable 'port' is a read only variable
    mysql> SET PERSIST_ONLY port = 3307;
    ERROR 1238 (HY000): Variable 'port' is a non persistent read only variable
    
  • Модификаторы @@GLOBAL., @@PERSIST., @@PERSIST_ONLY., @@SESSION. и @@ применяются только к системным переменным. Попытка их применения к пользовательским переменным, параметрам хранимых процедур или функций, или локальным переменным хранимых программ приводит к ошибке.

  • Не все системные переменные могут быть присвоены значению DEFAULT. В таких случаях присвоение DEFAULT приводит к ошибке.

  • Попытка присвоить DEFAULT пользовательским переменным, параметрам хранимых процедур или функций, или локальным переменным хранимых программ приводит к ошибке.

Присвоение значений нескольким переменным

Оператор SET может содержать несколько присваиваний, разделенных запятыми. Этот оператор присваивает значения пользовательской переменной и системной переменной:

SET @x = 1, SESSION sql_mode = '';

Если вы задаёте несколько системных переменных в одном операторе, используется последний ключевой параметр GLOBAL, PERSIST, PERSIST_ONLY или SESSION в операторе для последующих присваиваний без указания ключа.

Примеры присвоения значений нескольким переменным:

SET GLOBAL sort_buffer_size = 1000000, SESSION sort_buffer_size = 1000000;
SET @@GLOBAL.sort_buffer_size = 1000000, @@LOCAL.sort_buffer_size = 1000000;
SET GLOBAL max_connections = 1000, sort_buffer_size = 1000000;

Модификаторы @@GLOBAL., @@PERSIST., @@PERSIST_ONLY., @@SESSION. и @@ применяются только к непосредственно следующей системной переменной, а не к остальным системным переменным. Этот оператор задаёт глобальное значение sort_buffer_size равным 50000 и сессионное значение равным 1000000:

SET @@GLOBAL.sort_buffer_size = 50000, sort_buffer_size = 1000000;
Ссылок на системные переменные в выражениях

Чтобы обратиться к значению системной переменной в выражениях, используйте один из @@-модификаторов (кроме @@PERSIST. и @@PERSIST_ONLY., которые запрещены в выражениях). Например, вы можете получить значения системных переменных в операторе SELECT следующим образом:

SELECT @@GLOBAL.sql_mode, @@SESSION.sql_mode, @@sql_mode;
Примечание

Ссылка на системную переменную в выражении как @@var_name (с @@ вместо @@GLOBAL. или @@SESSION.) возвращает сессионное значение, если оно существует, и глобальное значение в противном случае. Это отличается от SET @@var_name = expr, которое всегда ссылается на сессионное значение.

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

Spec-Zone.ru

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