Base de datos · 8 min read · Jan 29, 2026

Replicando una base de datos maestra usando MariaDB 10 en Debian 8

Replicando bases de datos crea redundancia que puede proteger contra la pérdida de datos y permitir un rendimiento optimizado para las aplicaciones. Este tutorial cubrirá los conceptos básicos de replicar una base de datos maestra existente de MariaDB 10.0 a uno o más esclavos. En los siguientes ejemplos, el sistema operativo host es Debian 8.

Estas instrucciones pueden aplicarse a otros sistemas operativos, pero ten en cuenta que varios comandos y ubicaciones de archivos predeterminados serán diferentes. Específicamente, debes sustituir las rutas de /etc/mysql/my.cnf, /var/lib/mysql, el nombre y la ruta predeterminados de tu archivo de registro binario, y los comandos para iniciar, detener y reiniciar mysqld de acuerdo con las especificaciones de tu sistema.

1. Verificar conectividad

Antes de proceder, asegúrate de que el maestro y el esclavo puedan alcanzarse entre sí en la red, y que cada uno tenga una entrada para el otro en sus respectivos archivos /etc/hosts. Cada host debería poder ping al otro, y deberías poder ssh de uno a otro como un usuario normal.

2. Habilitar el registro binario de mysqld en el maestro

En el host maestro, verifica que el registro binario esté habilitado. Invocar mysqld con los switches –verbose –help mostrará los valores operativos para el demonio de MariaDB. Como root:

mysqld --verbose --help | grep log-bin
...  
log-bin         (Sin valor predeterminado)  
...

El valor de la entrada log-bin define la convención de nomenclatura de los archivos de registro binario. En Debian, estos archivos residen en /var/lib. Si el valor de log-bin es (Sin valor predeterminado), necesitarás habilitar el registro modificando el archivo de configuración my.cnf. En Debian, my.cnf reside en el directorio /etc/mysql.

Abre /etc/mysql/my.cnf en un editor de texto y localiza el grupo [mysqld]. Si no existe, créalo y escribe una línea que simplemente diga log-bin.

[mysqld]  
log-bin

Incluir esta entrada habilitará el registro binario cuando mysqld se reinicie.

Puedes optar por establecer un valor para log-bin, por ejemplo, log-bin= nombre_archivo, para definir un nombre personalizado para el archivo de registro binario. En este tutorial, no estableceremos un valor, y se utilizarán los nombres de archivo de registro predeterminados.

Reinicia mysqld:

service mysql restart

Verifica que el cambio haya tenido efecto:

mysqld --verbose --help | grep log-bin
...  
log-bin         mysqld-bin  
...

Como se muestra aquí, el nombre de archivo de registro binario predeterminado en Debian comienza con mysqld-bin, por ejemplo, mysqld-bin. nnnnnn.

3. Conceder derechos a un usuario de replicación

Es una buena práctica que todas las tareas de replicación sean realizadas por un usuario de replicación dedicado. En estos ejemplos, nombraremos al usuario repluser y estableceremos la contraseña de este usuario en la cadena replpass.

Concede a este usuario los privilegios globales SUPER, RELOAD y REPLICATION SLAVE. Estos permitirán al usuario de replicación ejecutar comandos de superusuario, vaciar cachés de base de datos y obtener actualizaciones del servidor maestro.

Ingresa al cliente de MariaDB como root de la base de datos:

mysql -u root -p

En el aviso de MariaDB, ingresa el comando:

GRANT SUPER, RELOAD, REPLICATION SLAVE ON *.* TO 'repluser'@'%' IDENTIFIED BY 'replpass';

Aquí, el comodín de nombre de host ‘%‘ permite al usuario de replicación conectarse desde cualquier host.

Verifica que los derechos hayan sido concedidos:

SHOW GRANTS FOR 'repluser'

4. Vaciar cachés de base de datos y establecer tablas como solo lectura

En preparación para hacer una instantánea de las bases de datos, vacía todas las tablas y configúralas en READ LOCK. Esto debe hacerse rápidamente, durante horas de baja actividad o un período de mantenimiento del sistema.

En el maestro:

FLUSH TABLES WITH READ LOCK;

Ahora que las tablas están bloqueadas, verifica el estado del maestro:

SHOW MASTER STATUS;

+-------------------+----------+--------------+------------------+  
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |  
+-------------------+----------+--------------+------------------+  
| mysqld-bin.000005 |      995 |              |                  |  
+-------------------+----------+--------------+------------------+

Tu información será diferente, pero anota los valores de File y Position. Utilizarás esta información en el paso 7.

Sal del cliente de MariaDB:

\q

5. Instantánea de bases de datos para el host esclavo

Crea un archivo comprimido de la base de datos o bases de datos que existen en el maestro que deseas replicar. Cada una de estas bases de datos tiene su propio directorio en /var/lib/mysql. En este ejemplo, tar un solo base de datos, que reside en la ruta /var/lib/mysql/dbname.

Este comando archiva una sola base de datos. Si estás archivando bases de datos adicionales, agrega sus rutas completas al comando, por ejemplo, /var/lib/mysql/dbname1 /var/lib/mysql/dbname2

tar cjvf /home/[nombre_usuario]/mysql-master.tar.bz2 /var/lib/mysql/dbname

Ahora, como usuario normal nombre_usuario, transfiere este archivo a una cuenta de usuario normal en el host esclavo:

rsync -avP mysql-master.tar.bz2 [nombre_usuario]@slavehost:~/.

o, usando scp:

scp mysql-master.tar.bz2 [nombre_usuario]@slavehost:~/.

Luego, SSH al host esclavo:

ssh [nombre_usuario]@slavehost

Como root, detén mysqld en el esclavo:

service mysql stop

…y extrae el archivo:

tar xjvf /home/[nombre_usuario]/mysql-master.tar.bz2 -C /.

6. Configurar IDs de servidor para maestro y esclavo

Modifica /etc/mysql/my.cnf en el maestro, agregando la entrada server-id= n en el grupo [mysqld], donde n es un entero único que identifica el servidor. Comúnmente, n =1 para el servidor maestro, pero n puede ser cualquier entero único en el rango [ 1, 2^32-1 ]. Estableceremos nuestro maestro en server-id=1, y nuestro esclavo en server-id=100.

(Si my.cnf no existe en el esclavo, créalo. Si existe, busca una entrada existente de server-id y descomenta/edit la línea).

En /etc/mysql/my.cnf en el host maestro:

[mysqld]  
server-id=1

En /etc/mysql/my.cnf en el host esclavo:

[mysqld]  
server-id=100

7. Desbloquear tablas y comenzar/reiniciar mysqld en maestro y esclavo

En el servidor maestro, en el cliente de MariaDB como root de la base de datos, desbloquea las tablas:

mysql -u root -p
UNLOCK TABLES;
\q

Reinicia mysqld en el maestro:

service mysql restart

Y enciéndelo en el esclavo:

service mysql start

Puedes verificar que el nuevo valor de server-id ha tenido efecto en cada host. Como root:

mysqld --verbose --help | grep server-id

8. Configurar identidad del maestro en el esclavo

En el esclavo, configura la identidad del servidor maestro. Ingresa al cliente de MariaDB:

mysql -u root -p

Ejecuta el siguiente comando, reemplazando los valores de MASTER_LOG_FILE y MASTER_LOG_POS con el File y Position del registro binario que anotaste en el paso 4, y los valores de MASTER_HOST, MASTER_USER, y MASTER_PASSWORD con tus propios valores.

CHANGE MASTER TO MASTER_HOST='masterhost', MASTER_USER='repluser', MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysqld-bin.000005', MASTER_LOG_POS=995;

9. Activar esclavo

En el esclavo, en el cliente de MariaDB como root de la base de datos:

START SLAVE;

Ahora puedes verificar el estado del esclavo:

SHOW SLAVE STATUS \G;
************************* 1. row *************************  
               Slave_IO_State: Waiting for master to send event  
                  Master_Host: masterhost  
                  Master_User: repluser  
                  Master_Port: 3306  
                Connect_Retry: 60  
              Master_Log_File: mysqld-bin.000009  
          Read_Master_Log_Pos: 1330  
               Relay_Log_File: mysqld-relay-bin.000008  
                Relay_Log_Pos: 1618  
        Relay_Master_Log_File: mysqld-bin.000009  
               Slave_IO_Running: Yes  
            Slave_SQL_Running: Yes  
              Replicate_Do_DB:   
          Replicate_Ignore_DB:   
           Replicate_Do_Table:   
       Replicate_Ignore_Table:   
      Replicate_Wild_Do_Table:   
  Replicate_Wild_Ignore_Table:   
                   Last_Errno: 0  
                   Last_Error:   
                   Skip_Counter: 0  
          Exec_Master_Log_Pos: 1330  
              Relay_Log_Space: 2204  
              Until_Condition: None  
               Until_Log_File:   
                Until_Log_Pos: 0  
           Master_SSL_Allowed: No  
           Master_SSL_CA_File:   
           Master_SSL_CA_Path:   
              Master_SSL_Cert:   
            Master_SSL_Cipher:   
               Master_SSL_Key:   
        Seconds_Behind_Master: 0  
Master_SSL_Verify_Server_Cert: No  
                Last_IO_Errno: 0  
                Last_IO_Error:   
               Last_SQL_Errno: 0  
               Last_SQL_Error:   
  Replicate_Ignore_Server_Ids:   
               Master_Server_Id: 1  
                 Master_SSL_Crl:   
           Master_SSL_Crlpath:   
                   Using_Gtid: No  
                    Gtid_IO_Pos:

Si hay algún error en los procesos de replicación, los verás listados aquí.

10. Realizar cambios en el maestro y verificar replicación en el esclavo

Puedes verificar que la replicación está ocurriendo creando una nueva base de datos en el maestro y viendo los cambios en el esclavo.

mysql -u root -p

Crea una nueva base de datos:

CREATE DATABASE repltest;
USE repltest

Crea una tabla e inserta un valor:

CREATE TABLE test (hello VARCHAR(10));
INSERT INTO test VALUES ('world');
\q

Ahora ingresa al cliente de MariaDB en el esclavo:

mysql -u root -p
USE repltest
SELECT * FROM test;
+-------+  
| hello |  
+-------+  
| world |  
+-------+  
1 row in set (0.00 sec)

11. Repetir proceso para esclavos adicionales

Puedes repetir este proceso para cada esclavo adicional. Específicamente, realiza estos pasos:

11 ( a) . En el maestro, en el cliente de MariaDB como root de la base de datos, vacía y bloquea las tablas:

FLUSH TABLES WITH READ LOCK;

Después de bloquear, muestra el estado del maestro:

**SHOW MASTER STATUS;

Anota los valores de File y Position.

11 ( b) . En el maestro, como root:

tar cjvf /home/[nombre_usuario]/mysql-master.tar.bz2 /var/lib/mysql/dbname

11 ( c) . En el maestro, como usuario normal:

rsync -avP mysql-master.tar.bz2 [nombre_usuario]@slavehost2:~/.

11 ( d) . En el esclavo, como root:

service mysql stop
tar xjvf /home/[nombre_usuario]/mysql-master.tar.bz2 -C /.

11 ( e) . En /etc/mysql/my.cnf en el host esclavo, agrega o edita la línea server-id= en el grupo [mysqld], donde el valor de server-id es nuevo y único:

[mysqld]  
server-id=200

11 ( f) . En el maestro, en el cliente de MariaDB como root de la base de datos, desbloquea las tablas:

UNLOCK TABLES;

11 ( g) . En el maestro, como root, reinicia mysqld:

service mysql restart

11 ( h) . En el esclavo, como root, inicia mysqld:

**service mysql start

11 ( i) . En el esclavo, en el cliente de MariaDB como root de la base de datos, configura la identidad del maestro, y el nombre del archivo de registro binario y la posición del paso 10(a):

CHANGE MASTER TO MASTER_HOST='masterhost', MASTER_USER='repluser', MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysqld-bin.nnnnnn’, MASTER_LOG_POS=n;

11 ( j) . En el esclavo, en el cliente de MariaDB como root de la base de datos, activa la replicación:

START SLAVE;

12. Solución de problemas: Esclavo no puede conectarse al maestro

Verifica /var/mysql/my.cnf en el maestro para una entrada bind-address. Si bind-address está configurado en 127.0.0.1, el servidor solo aceptará conexiones desde localhost. Comenta esta línea, o establece el valor en * para permitir conexiones desde todas las direcciones IPv4 e IPv6. Si modificas my.cnf, no olvides reiniciar mysqld.

Si las conexiones aún no funcionan, asegúrate de que tu servidor esté permitiendo conexiones en el puerto 3306. En el maestro, lista las tablas del firewall del kernel:

iptables -L

Puedes crear una excepción para conexiones en el puerto 3306 con el siguiente comando, sustituyendo el nombre de tu dispositivo de interfaz de red por eth0 según sea necesario:

iptables -A INPUT -i eth0 -p tcp --destination-port 3306 -j ACCEPT
Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.