MariaDB desde Cero

Guía completa para aprender MariaDB desde fundamentos hasta conceptos avanzados.

¿Qué es MariaDB?

🗄️

Sistema de Gestión de Bases de Datos

MariaDB es un sistema de gestión de bases de datos relacional de código abierto, creado como fork de MySQL por su creador original Michael Widenius.

Para Qué Sirve

Se utiliza para aplicaciones web, sistemas empresariales, data warehousing y como alternativa completamente abierta a MySQL.

🔧

Características Principales

Compatible con MySQL, motores de almacenamiento múltiples, thread pooling, consultas más rápidas y características avanzadas de replicación.

💡 ¿Sabías qué?

MariaDB recibe el nombre de la hija menor de Michael Widenius. Fue creado en 2009 como respuesta a la adquisición de MySQL por Oracle, garantizando que permanezca como software libre.

Arquitectura de MariaDB

MariaDB utiliza una arquitectura cliente-servidor similar a MySQL con mejoras en rendimiento y características adicionales.

Cliente / Aplicación

MySQL Client, HeidiSQL, aplicaciones web

⬇️

MariaDB Server

Query Parser, Optimizer mejorado

⬇️

Storage Engines

InnoDB, Aria, ColumnStore, Spider

⬇️

Datos Físicos

Archivos, logs, cachés

📊 Storage Engines

  • InnoDB - Transaccional, ACID compliant
  • Aria - Motor por defecto para tablas temporales
  • ColumnStore - Para data warehousing
  • Spider - Para sharding distribuido

💾 Mejoras de Rendimiento

  • Thread Pool - Manejo eficiente de conexiones
  • Query Cache mejorado - Caché de consultas
  • Subconsultas optimizadas - Mejor ejecución
  • Índices hash en InnoDB - Búsquedas rápidas

🔒 Características Avanzadas

  • Replicación multi-master - Alta disponibilidad
  • Galera Cluster - Replicación síncrona
  • Temporal Tables - Datos históricos
  • System Versioning - Control de versiones

📖 Temas del Curso

Haz clic en cualquier tema para ver el contenido detallado

🦭 Introducción a MariaDB

MariaDB es un sistema de gestión de bases de datos relacional de código abierto, creado como fork de MySQL por su creador original Michael Widenius.

Historia:

MariaDB recibe el nombre de la hija menor de Michael Widenius. Fue creado en 2009 como respuesta a la adquisición de MySQL por Oracle, garantizando que permanezca como software libre.

Diferencias con MySQL:

  • Thread Pool: Manejo más eficiente de conexiones
  • Aria Engine: Motor para tablas temporales
  • System Versioning: Control de versiones nativo
  • Galera Cluster: Replicación síncrona multi-master
💡 ¿Sabías qué?

MariaDB es usado por empresas como Wikipedia, Google y DBS Bank para manejar grandes volúmenes de datos.

← Volver a temas

🔧 Instalación de MariaDB

En Linux (Ubuntu/Debian):

sudo apt update
sudo apt install mariadb-server
sudo mysql_secure_installation

En Windows:

  1. Descarga desde mariadb.org
  2. Ejecuta el instalador
  3. Configura la contraseña de root

En macOS:

brew install mariadb
brew services start mariadb

Verificar instalación:

mariadb --version
mariadb -u root -p
← Volver a temas

📦 Conceptos Básicos

Crear Base de Datos:

CREATE DATABASE IF NOT EXISTS empresa;
USE empresa;

Crear Tabla:

CREATE TABLE empleados (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(100) NOT NULL,
    email VARCHAR(255) UNIQUE,
    salario DECIMAL(10,2),
    fecha_ingreso DATE
) ENGINE=InnoDB;

Operaciones CRUD:

-- INSERT
INSERT INTO empleados (nombre, email) VALUES ('Juan', 'juan@email.com');

-- SELECT
SELECT * FROM empleados WHERE salario > 50000;

-- UPDATE
UPDATE empleados SET salario = 60000 WHERE id = 1;

-- DELETE
DELETE FROM empleados WHERE id = 1;
← Volver a temas

💻 Consultas Avanzadas

JOINs:

SELECT e.nombre, d.nombre AS departamento
FROM empleados e
INNER JOIN departamentos d ON e.depto_id = d.id;

-- LEFT JOIN
SELECT e.nombre, d.nombre AS departamento
FROM empleados e
LEFT JOIN departamentos d ON e.depto_id = d.id;

Vistas:

CREATE VIEW vista_empleados AS
SELECT e.nombre, d.nombre AS departamento
FROM empleados e
JOIN departamentos d ON e.depto_id = d.id;

Stored Procedures:

DELIMITER //
CREATE PROCEDURE ObtenerEmpleados()
BEGIN
    SELECT * FROM empleados;
END //
DELIMITER ;
← Volver a temas

✅ Buenas Prácticas

Índices:

-- Crear índice
CREATE INDEX idx_nombre ON empleados(nombre);

-- Índice compuesto
CREATE INDEX idx_depto_salario ON empleados(depto_id, salario);

EXPLAIN:

EXPLAIN SELECT * FROM empleados WHERE nombre = 'Juan';

Optimización:

  • Usa índices en columnas de WHERE y JOIN
  • Evita SELECT *, selecciona solo columnas necesarias
  • Usa LIMIT para paginar resultados
← Volver a temas

🚀 Casos Reales

Galera Cluster:

Replicación síncrona multi-master para alta disponibilidad.

System Versioning:

CREATE TABLE productos (
    id INT PRIMARY KEY,
    precio DECIMAL(10,2),
    SYSTEM VERSIONING
);

-- Consultar datos históricos
SELECT * FROM productos FOR SYSTEM_TIME ALL;

Backup:

mysqldump -u root -p empresa > backup.sql
← Volver a temas

📋 Proyecto Final

Implementa una base de datos empresarial completa:

  1. Diseñar modelo entidad-relación
  2. Crear tablas con normalización
  3. Implementar vistas y stored procedures
  4. Configurar índices estratégicos
  5. Implementar backup automático
  6. Configurar replicación
💡 Proyecto sugerido:

Crea una base de datos para sistema de gestión empresarial con módulos de RRHH, ventas e inventario.

← Volver a temas

💾 Backup, Restore y Migración

Backup con mysqldump:

# Backup de una base de datos
mysqldump -u root -p empresa > backup_empresa.sql

# Backup de todas las bases
mysqldump -u root -p --all-databases > full_backup.sql

# Backup con compresión
mysqldump -u root -p empresa | gzip > backup.sql.gz

Restore:

# Restaurar base de datos
mysql -u root -p empresa < backup_empresa.sql

# Restaurar con gzip
gunzip < backup.sql.gz | mysql -u root -p empresa

MariaDB Backup (XtraBackup):

# Backup físico (más rápido para grandes BD)
mariabackup --backup --target-dir /backup/full

# Restaurar
mariabackup --prepare --target-dir /backup/full
mariabackup --copy-back --target-dir /backup/full

Migración a MariaDB:

# Desde MySQL
mysqldump --all-databases > mysql_backup.sql
mysql -u root -p < mysql_backup.sql
← Volver a temas

🔐 Transacciones y Control de Concurrencia

Transacciones:

START TRANSACTION;

UPDATE cuentas SET saldo = saldo - 100 WHERE id = 1;
UPDATE cuentas SET saldo = saldo + 100 WHERE id = 2;

-- Verificar que todo esté bien
SELECT * FROM cuentas WHERE id IN (1, 2);

-- Confirmar o revertir
COMMIT;
-- o
ROLLBACK;

Niveles de Aislamiento:

-- Ver nivel actual
SELECT @@tx_isolation;

-- Establecer nivel
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;

Locking:

-- Bloquear fila
SELECT * FROM productos WHERE id = 1 FOR UPDATE;

-- Bloqueo compartido
SELECT * FROM productos WHERE id = 1 LOCK IN SHARE MODE;

SAVEPOINT:

SAVEPOINT sp1;
INSERT INTO log VALUES ('evento');
ROLLBACK TO SAVEPOINT sp1;
← Volver a temas

📊 Subconsultas y UNION

Subconsultas:

-- Subconsulta en WHERE
SELECT nombre FROM empleados 
WHERE salario > (SELECT AVG(salario) FROM empleados);

-- Subconsulta en FROM
SELECT dept, promedio FROM (
    SELECT departamento_id AS dept, AVG(salario) AS promedio
    FROM empleados GROUP BY departamento_id
) AS stats;

Subconsultas con IN/EXISTS:

-- Con IN
SELECT * FROM productos 
WHERE categoria_id IN (
    SELECT id FROM categorias WHERE nombre LIKE '%electronics%'
);

-- Con EXISTS
SELECT * FROM clientes c
WHERE EXISTS (
    SELECT 1 FROM pedidos p WHERE p.cliente_id = c.id
);

UNION y UNION ALL:

-- UNION (elimina duplicados)
SELECT nombre FROM empleados_2023
UNION
SELECT nombre FROM empleados_2024;

-- UNION ALL (mantiene duplicados)
SELECT nombre FROM empleados_2023
UNION ALL
SELECT nombre FROM empleados_2024;
← Volver a temas

🧩 Procedimientos y Funciones Avanzados

Stored Procedure con Transacción:

DELIMITER //
CREATE PROCEDURE Transferencia(
    IN cuenta_origen INT,
    IN cuenta_destino INT,
    IN monto DECIMAL(10,2)
)
BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        ROLLBACK;
        SELECT 'Error en la transacción' AS resultado;
    END;
    
    START TRANSACTION;
    
    UPDATE cuentas SET saldo = saldo - monto WHERE id = cuenta_origen;
    UPDATE cuentas SET saldo = saldo + monto WHERE id = cuenta_destino;
    
    COMMIT;
    SELECT 'Transferencia exitosa' AS resultado;
END //
DELIMITER ;

Funciones:

DELIMITER //
CREATE FUNCTION calcular_iva(precio DECIMAL(10,2))
RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGIN
    RETURN precio * 0.12;
END //
DELIMITER ;

-- Uso
SELECT nombre, precio, calcular_iva(precio) AS iva FROM productos;

Triggers:

CREATE TRIGGER before_empleado_update
BEFORE UPDATE ON empleados
FOR EACH ROW
BEGIN
    INSERT INTO audit_log (tabla, accion, usuario, fecha)
    VALUES ('empleados', 'UPDATE', CURRENT_USER(), NOW());
END;
← Volver a temas

🌐 Replicación y Alta Disponibilidad

Galera Cluster:

-- Configuración en /etc/mysql/mariadb.conf.d/galera.cnf
[galera]
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://node1,node2,node3"
binlog_format=row
default_storage_engine=InnoDB

Estado del Cluster:

SHOW STATUS LIKE 'wsrep%';
SHOW VARIABLES LIKE 'wsrep_%';

Replicación Maestro-Esclavo:

-- En el maestro
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%';
SHOW MASTER STATUS;

-- En el esclavo
CHANGE MASTER TO 
    MASTER_HOST='192.168.1.100',
    MASTER_USER='replica',
    MASTER_PASSWORD='password',
    MASTER_LOG_FILE='mysql-bin.000001',
    MASTER_LOG_POS=123;
START SLAVE;
← Volver a temas

Ejemplos de Código

Crear Base de Datos

CREATE DATABASE IF NOT EXISTS empresa;
USE empresa;

Crear Tabla

CREATE TABLE empleados (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(100) NOT NULL,
    email VARCHAR(255) UNIQUE,
    salario DECIMAL(10,2),
    fecha_ingreso DATE,
    INDEX idx_nombre (nombre)
) ENGINE=InnoDB;

Consulta con JOIN

SELECT e.nombre, d.nombre AS departamento
FROM empleados e
INNER JOIN departamentos d ON e.depto_id = d.id
WHERE e.salario > 50000
ORDER BY e.salario DESC;

Temporal Table

CREATE TABLE productos (
    id INT PRIMARY KEY,
    nombre VARCHAR(100),
    precio DECIMAL(10,2),
    SYSTEM VERSIONING
);

👨‍💻 Desarrollado por Isaac Esteban Haro Torres

Ingeniero en Sistemas · Full Stack · Automatización · Data

📧 Email: zackharo1@gmail.com

📱 WhatsApp: 098805517

💻 GitHub: github.com/ieharo1

🌐 Portafolio: ieharo1.github.io/portafolio-isaac.haro/