MySQL se configura mediante el fichero my.cnf (Linux/macOS) o my.ini (Windows). Contiene las variables del servidor que se aplican al arrancar: tamaños de buffer, límites de conexiones, rutas de ficheros de log, zona horaria, charset... Ajustar esta configuración es esencial para exprimir el rendimiento del servidor y evitar problemas en producción.
En este capítulo cubrimos las variables más importantes, dónde está el fichero de configuración, cómo cambiar variables sin reiniciar y cómo interpretar el estado del servidor.
Ubicación del fichero de configuración
# Ver qué ficheros de configuración lee MySQL en el arranque mysqld --help --verbose 2>/dev/null | grep "Default options" -A2 # Ubicaciones típicas en Linux: # /etc/mysql/my.cnf # /etc/mysql/mysql.conf.d/mysqld.cnf (Ubuntu) # /etc/my.cnf (RHEL/CentOS) # /etc/my.cnf.d/mysql-server.cnf (Rocky/AlmaLinux) # Ver la configuración actual sin fichero mysql -u root -p -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';"
Variables más importantes
[mysqld] # ── Charset por defecto ────────────────────────────────────────────────────── character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci # ── Memoria ────────────────────────────────────────────────────────────────── # InnoDB buffer pool: cuánta RAM dedicar a cachear datos e índices InnoDB # Regla: en un servidor dedicado a MySQL, el 70-80% de la RAM disponible innodb_buffer_pool_size = 2G # Tamaño máximo de un paquete (afecta a BLOB, INSERT multifila, GROUP_CONCAT) max_allowed_packet = 64M # ── Conexiones ─────────────────────────────────────────────────────────────── max_connections = 200 # máximo de conexiones simultáneas wait_timeout = 600 # segundos antes de cerrar una conexión inactiva interactive_timeout = 600 # ── Logs ──────────────────────────────────────────────────────────────────── # Slow query log: registra consultas que tardan más de N segundos slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow.log long_query_time = 2 # registrar consultas de más de 2 segundos log_queries_not_using_indexes = 1 # General log: registra TODAS las consultas (¡solo en desarrollo!) # general_log = 1 # general_log_file = /var/log/mysql/general.log # Binary log: necesario para replicación y point-in-time recovery log_bin = /var/log/mysql/mysql-bin.log binlog_expire_logs_seconds = 604800 # mantener 7 días de binlogs # ── Zona horaria ───────────────────────────────────────────────────────────── default-time-zone = '+00:00' # UTC recomendado para servidores en producción
Cambiar variables sin reiniciar (SET GLOBAL)
-- Cambiar una variable en tiempo real (se resetea al reiniciar) SET GLOBAL slow_query_log = 1; SET GLOBAL long_query_time = 1; SET GLOBAL max_connections = 300; -- Ver el valor actual SHOW VARIABLES LIKE 'max_connections'; SHOW VARIABLES LIKE 'slow%'; -- En MySQL 8, puedes usar SET PERSIST para guardar en un fichero: SET PERSIST max_connections = 300; -- persiste al reiniciar -- Se guarda en /var/lib/mysql/mysqld-auto.cnf
Métricas de estado
-- Conexiones activas y máximo alcanzado SHOW STATUS LIKE 'Threads_connected'; SHOW STATUS LIKE 'Max_used_connections'; -- Consultas ejecutadas SHOW STATUS LIKE 'Queries'; SHOW STATUS LIKE 'Slow_queries'; -- InnoDB buffer pool hit rate (debe ser > 99%) SHOW STATUS LIKE 'Innodb_buffer_pool_read%'; -- Si Innodb_buffer_pool_reads es muy alto, aumentar innodb_buffer_pool_size -- Uptime del servidor SHOW STATUS LIKE 'Uptime';
