MySQL Replication · 4 min read · Nov 20, 2025

Instalación de un clúster de Web, Email y base de datos MySQL en Debian 8.4 Jessie con ISPConfig 3.1 - Página 2

5. Replicación Master-Master de MySQL

5.1 Preparar Server1

Inicie sesión en MySQL y cree una cuenta específicamente para la replicación en MySQL. Utilizo un usuario separado para la replicación para minimizar la posibilidad de compromiso de otras cuentas (nombre de usuario y contraseña se almacenan en texto plano en el archivo o tabla de información del maestro):

CREATE USER 'slaveuser2'@'server2.example.tld' IDENTIFIED BY 'slave_user_password';  
CREATE USER 'slaveuser2'@'192.168.0.106' IDENTIFIED BY 'slave_user_password';  
CREATE USER 'slaveuser2'@'2001:db8::2' IDENTIFIED BY 'slave_user_password';

y otorgue el privilegio REPLICATION SLAVE:

GRANT REPLICATION SLAVE ON *.* TO 'slaveuser2'@'server2.example.tld';  
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser2'@'192.168.0.106';  
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser2'@'2001:db8::2';  
QUIT;

Haga algunos cambios para la replicación en su MySQL-Config:

vi /etc/mysql/my.cnf

Busque la sección que comienza con [mysqld], y coloque las siguientes opciones en ella (comentando todas las opciones conflictivas existentes):

[...]  
[mysqld]  
server-id                = 1  
replicate-same-server-id = 0  
auto-increment-increment = 2  
auto-increment-offset    = 1  
log_bin                  = mysql-bin.log  
expire_logs_days         = 10  
max_binlog_size          = 100M  
binlog_format            = mixed  
sync_binlog              = 1  
relay-log                = slave-relay.log  
relay-log-index          = slave-relay-log.index  
slave_skip_errors        = 1007,1008,1050, 1396  
bind-address             = ::

y reinicie MySQL después:

service mysql restart

Simplemente omito algunos errores de esclavo. Lo expliqué en mi blog:

  • 1007 = No se puede crear la base de datos ‘%s’; la base de datos existe
  • 1008 = No se puede eliminar la base de datos ‘%s’; la base de datos no existe
  • 1050 = La tabla ‘%s’ ya existe
  • 1396 = La operación %s falló para %s - No se puede crear el usuario

puede encontrar la lista de códigos de error de MySQL aquí: Códigos y Mensajes de Error del Servidor

5.2 Preparar Server2

Haga algunos cambios para la replicación en su MySQL-Config:

vi /etc/mysql/my.cnf

Busque la sección que comienza con [mysqld], y coloque las siguientes opciones en ella (comentando todas las opciones conflictivas existentes):

[...]  
[mysqld]  
server-id                = 2  
log_bin                  = mysql-bin.log  
expire_logs_days         = 10  
max_binlog_size          = 100M  
binlog_format            = mixed  
sync_binlog              = 1  
slave_skip_errors        = 1007,1008,1050, 1396

5.3 Crear un snapshot de las bases de datos existentes en server1

Haga un volcado de las bases de datos en server1 e ingrese la contraseña de root de MySQL:

mysqldump -p --all-databases --allow-keywords --master-data --events --single-transaction > /root/mysqldump.sql

Copie el volcado a server2:

scp /root/mysqldump.sql [email protected]:/root

5.4 Importar el volcado en server2

mysql -u root -p < /root/mysqldump.sql

Apague mysql en server2:

service mysql stop

Copie el archivo de configuración predeterminado para MySQL desde server1 a server2. Cambie a server1 y ejecute

scp /etc/mysql/debian.cnf [email protected]:/etc/mysql/debian.cnf

Inicie MySQL en server2:

service mysql start

y inicie sesión en MySQL para establecer el servidor maestro con:

CHANGE MASTER TO MASTER_HOST="server1.example.tld", MASTER_USER="slaveuser2", MASTER_PASSWORD="slave_user_password";

Inicie el esclavo:

START SLAVE;

y verifique el estado del esclavo con

SHOW SLAVE STATUS \G

El resultado será algo como

************************* 1. row ***********************  
               Slave_IO_State: Waiting for master to send event  
                  Master_Host: server1.example.tld  
                  Master_User: slaveuser2  
                  Master_Port: 3306  
                Connect_Retry: 60  
              Master_Log_File: mysql-bin.000001  
          Read_Master_Log_Pos: 109989  
               Relay_Log_File: mysqld-relay-bin.000002  
                Relay_Log_Pos: 110276  
        Relay_Master_Log_File: mysql-bin.000001  
             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: 109989  
              Relay_Log_Space: 110574  
              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 “Seconds Behind Master” no es 0, espere hasta que el esclavo haya leído todos los datos del maestro (simplemente repita el comando para obtener el valor actual). Asegúrese de que server2 utilice el registro de log maestro y la posición de log correctos.

En server1 ejecute en MySQL:

SHOW MASTER STATUS \G
*********************** 1. row *************************  
            File: mysql-bin.000991  
        Position: 69185362  
    Binlog_Do_DB:  
Binlog_Ignore_DB:  
1 row in set (0.00 sec)

Y compare las coordenadas del registro binario de replicación maestro.

Estamos ejecutando una replicación Master-Slave de MySQL donde server1 es el maestro y server2 el esclavo.

5.5 Replicación Master-Master de MySQL

Cree el usuario de MySQL para la replicación y otorgue el privilegio en MySQL:

CREATE USER 'slaveuser1'@'server1.example.tld' IDENTIFIED BY 'slave_user_password';  
CREATE USER 'slaveuser1'@'192.168.0.105' IDENTIFIED BY 'slave_user_password';  
CREATE USER 'slaveuser1'@'2001:db8::1' IDENTIFIED BY 'slave_user_password';  
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser1'@'server1.example.tld';   
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser1'@'192.168.0.105';  
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser1'@'2001:db8::1';  
QUIT;

Haga algunos cambios para la replicación en su MySQL-Config en server2:

vi /etc/mysql/my.cnf

Busque la sección que comienza con [mysqld], y coloque las siguientes opciones en ella (comentando todas las opciones conflictivas existentes):

[...]  
[mysqld]  
[...]  
replicate-same-server-id = 0  
auto-increment-increment = 2  
auto-increment-offset    = 2  
relay-log                = slave-relay.log  
relay-log-index          = slave-relay-log.inde

y reinicie MySQL:

service mysql restart

Inicie sesión en MySQL y obtenga las coordenadas del registro binario maestro:

SHOW MASTER STATUS \G
************************* 1. row *************************  
            File: mysql-bin.000002  
        Position: 326  
    Binlog_Do_DB:  
Binlog_Ignore_DB:  
1 row in set (0.00 sec)

Inicie sesión en MySQL en server1 y establezca el servidor maestro con

CHANGE MASTER TO MASTER_HOST="server2.example.tld", MASTER_USER="slaveuser1", MASTER_PASSWORD="slave_user_password", MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=326;

Inicie el esclavo:

START SLAVE;

y verifique el estado del esclavo con

SHOW SLAVE STATUS \G

Verifique que el esclavo esté funcionando:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

Si su replicación deja de funcionar, puede encontrar información adicional aquí:

  • Cómo omitir ciertos errores en la replicación de MySQL
  • reiniciar la replicación master-master de mysql
  • mysql-replication – No se pudo analizar la entrada del evento del registro de relé
Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

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