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.cnfBusque 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 restartSimplemente 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.cnfBusque 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, 13965.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.sqlCopie el volcado a server2:
scp /root/mysqldump.sql [email protected]:/root5.4 Importar el volcado en server2
mysql -u root -p < /root/mysqldump.sqlApague mysql en server2:
service mysql stopCopie 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.cnfInicie MySQL en server2:
service mysql starty 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.cnfBusque 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.indey reinicie MySQL:
service mysql restartInicie 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é
Recibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.