Tutorial completo de MySQL 8: instalación, administración, tipos de datos y backup (2026)

La seguridad de MySQL es un tema que a menudo se descuida hasta que ocurre un incidente. Una base de datos mal configurada puede exponer todos los datos de los usuarios, permitir inyección SQL o dar acceso no autorizado a la administración del servidor. Este capítulo resume las prácticas de seguridad más importantes para MySQL en producción.

Además de la seguridad, cubrimos las convenciones de nomenclatura, el uso de prepared statements en la aplicación y las comprobaciones de salud periódicas que todo DBA debería hacer.

Listas de comprobación: hardening básico

  • Ejecutar mysql_secure_installation tras la instalación. Elimina el usuario anónimo, restringe el acceso root a localhost y elimina la base de datos test.
  • Contraseña fuerte para root. Mínimo 16 caracteres, con números y símbolos. Usar un gestor de contraseñas.
  • Deshabilitar el acceso remoto a root. El root solo debe poder conectar desde localhost.
  • Crear un usuario por aplicación. Cada aplicación tiene su propio usuario con solo los privilegios que necesita (principio de mínimo privilegio).
  • No usar root en la aplicación. Nunca poner la contraseña de root en el .env de la aplicación.
  • Bind address. En un servidor dedicado, configura MySQL para que solo escuche en localhost o en la IP interna: bind-address = 127.0.0.1.

Prepared statements: protección contra inyección SQL

La inyección SQL ocurre cuando se interpola directamente una variable de usuario en una consulta SQL. La solución definitiva son los prepared statements (consultas preparadas): la consulta y los datos van separados, y el motor nunca interpreta los datos como SQL.

-- SQL con interpolación directa (VULNERABLE a inyección SQL):
-- En PHP sería: $query = "SELECT * FROM clientes WHERE email = '$email'";
-- Si $email = "' OR '1'='1", devuelve todos los clientes

-- Con prepared statements en MySQL CLI:
PREPARE stmt FROM 'SELECT * FROM clientes WHERE email = ?';
SET @email = '[email protected]';
EXECUTE stmt USING @email;
DEALLOCATE PREPARE stmt;
# En PHP 8 con PDO (la forma correcta en aplicaciones):
# $stmt = $pdo->prepare("SELECT * FROM clientes WHERE email = ?");
# $stmt->execute([$email]);
# $cliente = $stmt->fetch();

Auditoría: quién cambió qué

-- Binary log registra todos los cambios (necesario para point-in-time recovery)
SHOW VARIABLES LIKE 'log_bin';      -- ON si está activado
SHOW BINARY LOGS;                   -- lista de ficheros de binlog
SHOW BINLOG EVENTS IN 'mysql-bin.000001' LIMIT 20;

-- MySQL Enterprise tiene el plugin de auditoría; para Community existe
-- el plugin de auditoría de MariaDB o herramientas externas como Percona Audit Log

Cifrado: SSL/TLS para conexiones

-- Verificar si SSL está activo
SHOW VARIABLES LIKE '%ssl%';
SHOW STATUS LIKE 'Ssl_cipher';

-- Forzar SSL para un usuario
ALTER USER 'appuser'@'%' REQUIRE SSL;

-- Forzar SSL para todas las conexiones en my.cnf:
-- [mysqld]
-- require_secure_transport = ON

Buenas prácticas de desarrollo

  • InnoDB siempre. MyISAM no tiene transacciones, claves foráneas ni recuperación ante caídas. No hay razón para usarlo en producción desde MySQL 5.6.
  • utf8mb4 siempre. Evita problemas de codificación con caracteres no-ASCII y emoji desde el primer día.
  • Clave primaria INT UNSIGNED AUTO_INCREMENT. Simple, eficiente y universal. Para sistemas distribuidos, considera UUID v7 (ordenado cronológicamente).
  • DECIMAL para dinero, nunca FLOAT. FLOAT y DOUBLE tienen errores de punto flotante: 0.1 + 0.2 != 0.3. DECIMAL es exacto.
  • Backups diarios verificados. Un backup no verificado no es un backup. Restaura periódicamente en un entorno de test para comprobar que funciona.
  • Versiona el esquema. Usa herramientas de migración como Flyway o Liquibase para gestionar cambios de esquema de forma controlada y reproducible.

Con esto termina el Tutorial de MySQL 8. Para profundizar en las consultas SQL que usarás sobre estas bases de datos, consulta el Curso de SQL completo en este sitio. Para interactuar con MySQL desde PHP, revisa los artículos sobre PDO y PHP 8.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP