MySQL proporciona acceso a muchas variables de sistema y de conexión. Muchas variables pueden modificarse dinámicamente mientras el servidor se está ejecutando. Esto a menudo permite variar la operación del servidor sin tener que detenerlo y reiniciarlo.
El servidor mysqld mantiene dos clases de variables. Las variables globales afectan la operación general del servidor. Las variables de sesión actúan sobre la operación en conexiones de clientes individuales.
Cuando el servidor arranca, inicializa todas las variables
globales a sus valores predeterminados. Estos valores pueden ser
modificados por opciones especificadas en ficheros de opciones o
en la línea de comandos. Luego de que el servidor se inicia, las
variables globales pueden ser modificadas dinámicamente
conectándose y emitiendo una sentencia SET GLOBAL
var_name
. Para cambiar una
variable global debe tenerse el privilegio
SUPER
.
El servidor también mantiene un conjunto de variables de sesión
para cada cliente que se conecta. Las variables de sesión de
cliente se inicializan al momento de conectarse, empleando el
valor actual de la correspondiente variable global. Las variables
de sesión dinámicas pueden ser modificadas por el cliente
mediante una sentencia SET SESSION
var_name
. No se requieren
privilegios especiales para establecer el valor una variable de
sesión, pero un cliente puede modificar solamente sus propias
variables, no las de otros clientes.
Un cambio en una variable global es visible para cualquier cliente
que acceda esa variable. Sin embargo, afectará solamente a las
correspondientes variables de sesión de las conexiones que se
realicen luego del cambio. No afectará las variables de sesión
de los clientes actualmente conectados (ni siquiera las del
cliente que emitió la sentencia SET GLOBAL
).
Los valores de las variables globales y de sesión pueden
establecerse y recuperarse usando varias sintaxis diferentes. Los
siguientes ejemplos están basados en la variable
sort_buffer_size
.
Para establecer el valor de una variable
GLOBAL
, debe emplearse una de las siguientes
sintaxis:
mysql> SET GLOBAL sort_buffer_size=valor
; mysql> SET @@global.sort_buffer_size=valor
;
Para establecer el valor de una variable
SESSION
, debe emplearse una de las siguientes
sintaxis:
mysql> SET SESSION sort_buffer_size=valor
; mysql> SET @@session.sort_buffer_size=valor
; mysql> SET sort_buffer_size=valor
;
LOCAL
es un sinónimo de
SESSION
.
Si al establecer el valor de una variable no se utiliza
GLOBAL
, SESSION
, o
LOCAL
, por defecto se asume
SESSION
. Consulte Sección 13.5.3, “Sintaxis de SET
”.
Para recuperar el valor de una variable GLOBAL
debe utilizarse una de las siguientes sentencias:
mysql> SELECT @@global.sort_buffer_size; mysql> SHOW GLOBAL VARIABLES like 'sort_buffer_size';
Para recuperar el valor de una variable SESSION
debe utilizarse una de las siguientes sentencias:
mysql> SELECT @@sort_buffer_size; mysql> SELECT @@session.sort_buffer_size; mysql> SHOW SESSION VARIABLES like 'sort_buffer_size';
Aquí, también, LOCAL
es un sinónimo de
SESSION
.
Cuando se recupera una variable con SELECT
@@
nombre_var
(o sea, no se
especifica global.
,
session.
, o local.
), MySQL
devuelve el valor de SESSION
si existe y el
valor GLOBAL
en otro caso.
En el caso de SHOW VARIABLES
, si no se
especifica GLOBAL
, SESSION
,
o LOCAL
, MySQL devuelve los valores de
SESSION
.
La razón por la que la palabra clave GLOBAL
se
requiere para establecer el valor de variables que solamente
existen como GLOBAL
pero no para recuperar
dicho valor, es para prevenir futuros problemas. Si se elimina una
variable SESSION
con el mismo nombre que una
variable GLOBAL
, un cliente con el privilegio
SUPER
podría cambiar accidentalmente la
variable GLOBAL
en lugar de hacerlo solamente
sobre la variable SESSION
de su propia
conexión. Si se agrega una variable SESSION
con el mismo nombre que una GLOBAL
, un cliente
que intentase modificar la variable GLOBAL
podría encontrarse con que sólo se ha modificado su propia
variable SESSION
.
Puede encontrarse mayor información acerca de las opciones de inicio del sistema y de las variables de sistema en Sección 5.3.1, “Opciones del comando mysqld” y Sección 5.3.3, “Variables de sistema del servidor”. Una lista de las variables que pueden establecerse en tiempo de ejecución se brinda en Sección 5.3.3.1, “Variables de sistema dinámicas”.
MySQL 5.0 también soporta variables de sistema estructuradas. Una variable estructurada difiere de una variable de sistema convencional en dos aspectos:
-
Su valor es una estructura con componentes que especifican parámetros de servidor que se consideran estrechamente relacionados.
-
Pueden existir varias instancias de un determinado tipo de variable estructurada. Cada una tiene un nombre diferente y se refiere a un recurso mantenido por el servidor.
Actualmente, MySQL soporta un solo tipo de variable estructurada. Éste especifica parámetros que regulan el funcionamiento de los cachés de claves (key caches). Una variable estructurada de caché de claves tiene estos componentes:
-
key_buffer_size
-
key_cache_block_size
-
key_cache_division_limit
-
key_cache_age_threshold
Esta sección describe la sintaxis para referirse a variables
estructuradas. Para los ejemplos de sintaxis se emplean
variables de caché de claves, pero los detalles específicos
sobre cómo funcionan los cachés de claves se encuentran en
Sección 7.4.6, “La caché de claves de MyISAM
”.
Para referirse a un componente de una instancia de una variable
estructurada, se emplea un nombre compuesto con el formato
nombre_instancia.nombre_componente
. Ejemplos:
hot_cache.key_buffer_size hot_cache.key_cache_block_size cold_cache.key_cache_block_size
Siempre hay predefinida una instancia con el nombre
default
para cada variable de sistema
estructurada. Si se hace referencia a un componente de una
variable estructurada sin mencionar el nombre de instancia, se
utiliza default
. Por lo tanto,
default.key_buffer_size
y
key_buffer_size
se refieren a la misma
variable de sistema.
Las reglas para la denominación de instancias y componentes pertenecientes a variables estructuradas son las siguientes:
-
Para un determinado tipo de variable estructurada, cada instancia debe tener un nombre que sea único dentro de ese tipo de variable. Sin embargo, los nombres de instancia no necesitan ser únicos a través de distintos tipos de variable estructurada. Por ejemplo, cada variable estructurada tiene una instancia llamada
default
, así quedefault
no es único a través de distintos tipos de variable. -
Los nombres de los componentes de cada tipo de variable estructurada deben ser únicos a través de todos los nombres de variables de sistema. Si esto no fuese así (o sea, si dos tipos diferentes de variable estructurada compartiesen nombres de miembros), no sería posible determinar la variable estructurada por defecto a emplear cuando un nombre de miembro no estuviese precedido por un nombre de instancia.
-
Si un nombre de instancia de variable estructurada no fuese legal al usarlo como identificador sin delimitar, habrá que referirse a él delimitándolo con acentos graves (ASCII 96). Por ejemplo,
hot-cache
no es un nombre legal, pero`hot-cache`
lo es. -
global
,session
, ylocal
no son nombres legales de instancia. Esto evita conflictos con notaciones del tipo@@global.
nombre_var
, que se utilizan para hacer referencias a variables de sistema no estructuradas.
Actualmente, las primeras dos reglas no tienen posibilidad de ser infringidas, porque el único tipo de variable estructurada es el empleado para cachés de claves. Estas reglas cobrarán mayor significado si en el futuro se crean otros tipos de variable estructurada.
Con una excepción, se puede hacer referencia a los componentes de una variable estructurada utilizando nombres compuestos en cualquier contexto en que puedan aparecer nombres simples de variable. Por ejemplo, se puede asignar un valor a una variable estructurada empleando una opción de línea de comandos:
shell> mysqld --hot_cache.key_buffer_size=64K
En un fichero de opciones, se utilizaría:
[mysqld] hot_cache.key_buffer_size=64K
Si se inicia el servidor con esta opción, crea un caché de
claves llamado hot_cache
con un tamaño de
64KB adicionalmente al caché por defecto, que tiene un tamaño
predeterminado de 8MB.
Suponiendo que se inicie el servidor de esta manera:
shell> mysqld --key_buffer_size=256K \ --extra_cache.key_buffer_size=128K \ --extra_cache.key_cache_block_size=2048
En este caso, el servidor establece el tamaño del caché de
claves pedeterminado a 256KB. (También se podría haber escrito
--default.key_buffer_size=256K
.)
Adicionalmente, el servidor crea un segundo caché llamado
extra_cache
con un tamaño de 128KB, y fija
un tamaño de 2048 bytes para los buffers de bloque destinados
al caché de bloques de índice de tablas.
El siguiente ejemplo inicia el servidor con tres diferentes cachés de claves, manteniendo sus tamaños en una proporción de 3:1:1:
shell> mysqld --key_buffer_size=6M \ --hot_cache.key_buffer_size=2M \ --cold_cache.key_buffer_size=2M
Los valores de las variables estructuradas también pueden
establecerse y leerse en tiempo de ejecución. Por ejemplo, para
establecer a 10MB el tamaño de un caché de claves llamado
hot_cache
, pueden emplearse cualquiera de
estas sentencias:
mysql> SET GLOBAL hot_cache.key_buffer_size = 10*1024*1024; mysql> SET @@global.hot_cache.key_buffer_size = 10*1024*1024;
Para obtener el tamaño del caché, se realiza lo siguiente:
mysql> SELECT @@global.hot_cache.key_buffer_size;
Sin embargo, las siguientes sentencias no funcionarán. La
variable no es interpretada como un nombre compuesto, sino como
una cadena proporcionada a LIKE
para buscar
coincidencias con un patrón.
mysql> SHOW GLOBAL VARIABLES LIKE 'hot_cache.key_buffer_size';
Esta es la excepción mencionada sobre la posibilidad de utilizar en cualquier sitio un nombre de variable estructurada del mismo modo que se hace con una variable simple.