Las variables globales controlan el comportamiento del servidor MySQL en su totalidad. A diferencia de las variables de sesión, que solo afectan a la conexión que las modifica, un cambio en una variable global impacta a todas las nuevas conexiones y, en muchos casos, al comportamiento general del servidor. Dominar las variables globales es fundamental para ajustar el rendimiento, la seguridad y el comportamiento del servidor a las necesidades de tu entorno.

Diferencia entre variables globales y de sesión

Cuando MySQL arranca, lee los valores de configuración del archivo my.cnf (o sus valores por defecto compilados) y los establece como variables globales. Cada vez que un cliente se conecta, el servidor crea una copia de estas variables globales como variables de sesión para esa conexión.

Esto significa que cambiar una variable global no afecta a las sesiones que ya están conectadas, sino solo a las nuevas conexiones que se establezcan después del cambio. Si necesitas que un cambio afecte a una sesión existente, debes cambiarlo también a nivel de sesión en esa conexión.

-- Esto cambia el valor para futuras conexiones
SET GLOBAL wait_timeout = 300;
 
-- Las sesiones existentes siguen con su valor original
-- Para cambiar la sesión actual también:
SET SESSION wait_timeout = 300;

Consultar variables globales

Para ver el valor global de una variable específica:

SHOW GLOBAL VARIABLES LIKE 'max_connections';
Variable_nameValue
max_connections200
-- Usando la sintaxis @@global
SELECT @@global.max_connections;
@@global.max_connections
200

Para buscar variables relacionadas con un tema:

SHOW GLOBAL VARIABLES LIKE '%innodb_buffer%';
Variable_nameValue
innodb_buffer_pool_chunk_size134217728
innodb_buffer_pool_dump_at_shutdownON
innodb_buffer_pool_dump_pct25
innodb_buffer_pool_filenameib_buffer_pool
innodb_buffer_pool_instances4
innodb_buffer_pool_load_at_startupON
innodb_buffer_pool_size4294967296

Para comparar el valor global con el valor de tu sesión actual:

SELECT
  @@global.wait_timeout AS valor_global,
  @@session.wait_timeout AS valor_sesion;
valor_globalvalor_sesion
30028800

En este ejemplo, alguien cambió el valor global a 300 después de que tu sesión se conectara, por lo que tu sesión mantiene el valor original de 28800.

Modificar variables globales

La sintaxis para cambiar una variable global es:

SET GLOBAL max_connections = 300;

O equivalentemente:

SET @@global.max_connections = 300;

Para cambiar varias variables a la vez:

SET GLOBAL
  max_connections = 300,
  wait_timeout = 600,
  interactive_timeout = 600;

Es importante entender que los cambios realizados con SET GLOBAL son temporales: se pierden cuando el servidor se reinicia. Para que un cambio sea permanente, debes añadirlo también al archivo my.cnf.

SET PERSIST (MySQL 8.0)

MySQL 8.0 introdujo SET PERSIST, que combina SET GLOBAL con la escritura automática al archivo de configuración. Esto resuelve el problema de olvidar actualizar my.cnf después de cambiar una variable global:

SET PERSIST max_connections = 300;

Este comando hace dos cosas simultáneamente: cambia el valor global en memoria y lo escribe en el archivo mysqld-auto.cnf dentro del directorio de datos. Al reiniciar, MySQL lee este archivo y aplica los valores persistidos.

SET PERSIST wait_timeout = 600;
SET PERSIST slow_query_log = ON;
SET PERSIST long_query_time = 1;

Para variables que solo pueden cambiarse al reiniciar (variables estáticas), existe SET PERSIST_ONLY:

-- Esto no cambia el valor actual, solo lo guarda para el próximo reinicio
SET PERSIST_ONLY innodb_log_file_size = 536870912;

Para ver qué variables se han persistido:

SELECT * FROM performance_schema.persisted_variables;
VARIABLE_NAMEVARIABLE_VALUE
max_connections300
wait_timeout600
slow_query_logON
long_query_time1

Para eliminar una variable persistida:

RESET PERSIST max_connections;
 
-- O eliminar todas las variables persistidas
RESET PERSIST;

Variables globales más importantes

Estas son las variables globales que todo administrador debe conocer y ajustar según las necesidades del servidor.

Variables de rendimiento

-- Tamaño del buffer pool de InnoDB (la más importante para rendimiento)
SHOW GLOBAL VARIABLES LIKE 'innodb_buffer_pool_size';
Variable_nameValue
innodb_buffer_pool_size4294967296
-- Número máximo de conexiones simultáneas
SHOW GLOBAL VARIABLES LIKE 'max_connections';
 
-- Tamaño del buffer de ordenación (por conexión)
SHOW GLOBAL VARIABLES LIKE 'sort_buffer_size';
 
-- Tamaño del buffer de join (por conexión)
SHOW GLOBAL VARIABLES LIKE 'join_buffer_size';
 
-- Tamaño máximo de tablas temporales en memoria
SHOW GLOBAL VARIABLES LIKE 'tmp_table_size';

Variables de logging

-- Estado del slow query log
SHOW GLOBAL VARIABLES LIKE 'slow_query_log';
 
-- Umbral para considerar una consulta como lenta (en segundos)
SHOW GLOBAL VARIABLES LIKE 'long_query_time';
 
-- Log de consultas que no usan índices
SHOW GLOBAL VARIABLES LIKE 'log_queries_not_using_indexes';

Variables de seguridad

-- Permitir LOAD DATA LOCAL INFILE
SHOW GLOBAL VARIABLES LIKE 'local_infile';
 
-- Modo SQL (validaciones y restricciones)
SHOW GLOBAL VARIABLES LIKE 'sql_mode';
 
-- Expiración de contraseñas
SHOW GLOBAL VARIABLES LIKE 'default_password_lifetime';

Caso práctico: ajustar un servidor de producción en caliente

Imagina que tu servidor de producción está experimentando problemas de rendimiento durante las horas pico. Los desarrolladores reportan errores Too many connections y las consultas se vuelven lentas. Puedes hacer ajustes inmediatos sin reiniciar:

-- 1. Aumentar el número máximo de conexiones
SELECT @@global.max_connections AS actual;
actual
151
SET GLOBAL max_connections = 300;
 
-- 2. Activar el slow query log para identificar las consultas problemáticas
SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 2;
SET GLOBAL log_queries_not_using_indexes = ON;
 
-- 3. Reducir el timeout de conexiones inactivas para liberar recursos
SET GLOBAL wait_timeout = 300;
SET GLOBAL interactive_timeout = 300;
 
-- 4. Verificar los cambios
SHOW GLOBAL VARIABLES
WHERE Variable_name IN (
  'max_connections',
  'slow_query_log',
  'long_query_time',
  'wait_timeout'
);
Variable_nameValue
long_query_time2
max_connections300
slow_query_logON
wait_timeout300

Después de confirmar que los cambios resuelven el problema, persístelos para que sobrevivan al siguiente reinicio:

SET PERSIST max_connections = 300;
SET PERSIST slow_query_log = ON;
SET PERSIST long_query_time = 2;
SET PERSIST wait_timeout = 300;

Caso práctico: auditar la configuración del servidor

Antes de una auditoría de seguridad o una revisión de rendimiento, es útil generar un informe completo de la configuración actual del servidor:

-- Variables que difieren de sus valores por defecto
SELECT
  vi.VARIABLE_NAME,
  gv.VARIABLE_VALUE AS valor_actual,
  vi.VARIABLE_SOURCE AS origen
FROM performance_schema.variables_info vi
JOIN performance_schema.global_variables gv
  ON vi.VARIABLE_NAME = gv.VARIABLE_NAME
WHERE vi.VARIABLE_SOURCE != 'COMPILED'
ORDER BY vi.VARIABLE_SOURCE, vi.VARIABLE_NAME;

Esta consulta muestra solo las variables que fueron modificadas respecto a sus valores por defecto compilados, junto con la fuente del cambio (archivo de configuración, SET GLOBAL, SET PERSIST, etc.). Es una forma excelente de documentar qué personalizaciones se han hecho en el servidor.

Para exportar toda la configuración global a un archivo:

mysql --login-path=produccion \
  -e "SHOW GLOBAL VARIABLES" > /auditorias/config_$(date +%Y%m%d).txt

Este archivo sirve como referencia histórica y permite comparar la configuración entre diferentes fechas o diferentes servidores para detectar inconsistencias.

Las variables globales son el mecanismo principal para controlar el comportamiento del servidor MySQL. Combinadas con SET PERSIST de MySQL 8.0, ofrecen un flujo de trabajo seguro para realizar cambios de configuración que sobrevivan a los reinicios. En el siguiente artículo veremos cómo gestionar las zonas horarias en MySQL, un aspecto que afecta tanto a las variables de sesión como a las funciones de fecha y hora.

Escrito por Eduardo Lázaro