Escenario:
– Tenemos 2 servidores. Ambos tienen instalado MySQL 5.7
-NOTA: Tanto en el servidor master como en el servidor slave sería conveniente que realizases una copia de seguridad de fichero
/etc/mysql/mysql.conf.d/mysqld.cnf
En mi caso realizo la copia de seguridad para probar el Master – Slave pero después de realizar la prueba quiero dejar los servidores independientes y si tengo el backup será muchos mas fácil eliminar las configuraciones especificas de cada uno para ser master y slave.
1-Paso: Nos vamos al servidor Master y configuramos el fichero my.cnf
Descomentando la lineas indicadas y configurandolo segun nuestro parámetros.
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Descomentando la siguientes lineas
bind-address = 127.0.0.1 #Sustituir ip por la del servidor slave
server-id = 1 #Id que asignamos al master
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = ctidb
binlog_do_db = ctidb2
Nota:
binlog_do_db –> Aqui se puede seleccionar la base de datos que quieres que se sincronice con el slave. En mi caso quiero sincronizar dos base de datos «ctidb» y «ctidb2», si quisieramos mas pues añadiriamos tantas lineas como deseemos.
Si deseamos copiar cualquier tabla, podemos comentar «bindlog_do_db» y se copiarian todas las tablas.
Paso2:
Reiniciamos el servidor MySQL para aplicar los cambios.
sudo service mysql restart
Paso3:
Nos conectamos a la base de datos y le damos privilegios al usuario que utilizamos para que el esclavo se conecte al master.
mysql -u root -p
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
Paso 4:
Bloqueamos la base de datos para que nadie pueda realizar ningun cambio.
mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.01 sec)
Escrimibmos el comando para ver el estado en el que se ha quedado el master. Nos tendremos que apuntar el numero de «position» Que es la posicion en la que empezará el master a replicar.
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
En otro terminal deberás realizar la copia de seguridad de todas tus bases de datos con mysqldump.
Una vez que tengas realizada la copia de seguridad puedes desbloquear la tabla con el siguiente comando.
UNLOCK TABLES;
Paso5:
Configuramos la base de datos MySQL del slave.
Para ello crearemos la base de datos y restauraremos la copia de seguridad de las bases de datos del master.
ejemplo:
CREATE DATABASE newdatabase;
EXIT;
mysql -u root -p newdatabase < /path/to/newdatabase.sql
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Configuramos el fichero de mysql configurando:
server-id = 2
relay-log = /var/log/mysql/mysql-relay-bin.log
log_bin = /var/log/mysql/mysql-bin.log
#binlog_do_db = newdatabase
Reiniciamos el servidor slave para aplicar los cambios.
sudo service mysql restart
El siguiente paso es habilitar la replicación desde el shell de MySQL. Abra el shell MySQL una vez más y escriba los siguientes detalles, reemplazando los valores para que coincidan con su información:
CHANGE MASTER TO MASTER_HOST='192.168.5.81',MASTER_USER='slave_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS= 154;
Activamos el slave
mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)
Comprobamos el estado de la replicacion.
mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 192.168.5.81
Master_User: slave_user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 154
Relay_Log_File: mysql-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: No
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: 154
Relay_Log_Space: 154
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: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 1593
Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID:
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp: 200120 09:44:58
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
ERROR:
No query specified
En mi caso tengo un error. Tengo el mismo UUID tanto en el máster como en esclavo.(debido a que he utilizado un clon del master para hacer el esclavo) En otro post pongo como solucionarlo.
Una vez solucionado aparecera algo como esto.
mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.5.81
Master_User: slave_user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 154
Relay_Log_File: mysql-relay-bin.000003
Relay_Log_Pos: 320
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: 154
Relay_Log_Space: 527
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_UUID: e8e96aff-38ff-11ea-ac47-e2f299251813
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
ERROR:
No query specified