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_name | Value |
|---|---|
| max_connections | 200 |
-- 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_name | Value |
|---|---|
| innodb_buffer_pool_chunk_size | 134217728 |
| innodb_buffer_pool_dump_at_shutdown | ON |
| innodb_buffer_pool_dump_pct | 25 |
| innodb_buffer_pool_filename | ib_buffer_pool |
| innodb_buffer_pool_instances | 4 |
| innodb_buffer_pool_load_at_startup | ON |
| innodb_buffer_pool_size | 4294967296 |
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_global | valor_sesion |
|---|---|
| 300 | 28800 |
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_NAME | VARIABLE_VALUE |
|---|---|
| max_connections | 300 |
| wait_timeout | 600 |
| slow_query_log | ON |
| long_query_time | 1 |
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_name | Value |
|---|---|
| innodb_buffer_pool_size | 4294967296 |
-- 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_name | Value |
|---|---|
| long_query_time | 2 |
| max_connections | 300 |
| slow_query_log | ON |
| wait_timeout | 300 |
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).txtEste 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
