Eliminar sincronizacion Master – Slave MySQL 5.7

Entramos en el servidor slave y escribimos los siguientes comandos.

mysql> STOP SLAVE;
mysql> RESET SLAVE ALL;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW SLAVE STATUS\G;
Empty set (0.00 sec)

ERROR: 
No query specified

Restauraría la copia de seguridad de
/etc/mysql/mysql.conf.d/mysqld.cnf
para eliminar todos los parámetros configurados anteriormente y no dejar rastro de que alguna vez se utilizó como slave.

Error master and slave have equal MySQL server UUIDs

Haciendo mi primera prueba de creación de un servidor de MySQL
Maestro-Esclavo usando 2 maquinas virtuales.
He configurado la primera maquina virtual y clonandola para instalar el esclavo

A la hora de activar el maestro esclavo (en el servidor esclavo) me ha dado el siguiente error:

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.

Nos indica que tenemos el mismo identificador UUIDs en ambos servidores, asi que toca cambiar uno de ellos. En mi caso he cambiado una letra del UUID del servidor esclavo y reiniciado el servidor.

Para cambiar el UUID hay editar el siguiente fichero:

/var/lib/mysql$ nano /var/lib/mysql/auto.cnf

server-uuid=d9dd14dc-386f-11ea-bc23-e2d5b8babacc

Cambiamos un caracter cualquiera del server-uuid.

Reiniciamos el servidor MySQL y listo.

Instalación Master – Slave en MySQL 5.7

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

Instalacion MySQL 5.7 con acceso remoto

Servidor utilizado: Ubuntu Server 18.04

1- Actualizamos el ubuntu

sudo apt-get update
sudo apt-upgrade

2- Instalación de MySQL 5.7

sudo apt install mysql-server

Al ejecutar el comando nos saldrá todos los paquetes que se van a instalar.
Pulsamos «Y» y le damos al intro.

root@mysql-master:~# sudo apt install mysql-server
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  libaio1 libcgi-fast-perl libcgi-pm-perl libencode-locale-perl libevent-core-2.1-6 libfcgi-perl libgdbm-compat4 libhtml-parser-perl libhtml-tagset-perl
  libhtml-template-perl libhttp-date-perl libhttp-message-perl libio-html-perl liblwp-mediatypes-perl libperl5.26 libtimedate-perl liburi-perl mysql-client-5.7
  mysql-client-core-5.7 mysql-common mysql-server-5.7 mysql-server-core-5.7 perl perl-modules-5.26
Suggested packages:
  libdata-dump-perl libipc-sharedcache-perl libwww-perl mailx tinyca perl-doc libterm-readline-gnu-perl | libterm-readline-perl-perl make
The following NEW packages will be installed:
  libaio1 libcgi-fast-perl libcgi-pm-perl libencode-locale-perl libevent-core-2.1-6 libfcgi-perl libgdbm-compat4 libhtml-parser-perl libhtml-tagset-perl
  libhtml-template-perl libhttp-date-perl libhttp-message-perl libio-html-perl liblwp-mediatypes-perl libperl5.26 libtimedate-perl liburi-perl mysql-client-5.7
  mysql-client-core-5.7 mysql-common mysql-server mysql-server-5.7 mysql-server-core-5.7 perl perl-modules-5.26
0 upgraded, 25 newly installed, 0 to remove and 1 not upgraded.
Need to get 26.2 MB of archives.
After this operation, 198 MB of additional disk space will be used.
Do you want to continue? [Y/n] Y

3- Ejecutamos la instalación segura de MySQL.
Durante el proceso nos preguntará:
– Utilizar el «VALIDATE PASSWORD PLUGIN» que comprueba si la contraseña que hemos puesto al usuario es robusta. En mi caso no lo voy a activar.
– Nos preguntara la contraseña que deseamos para el usuario root. Lo tendremos que introducir 2 veces.
– Nos preguntara si deseamos eliminar el usuario anonymous. Es aconsejable eliminarlo. En mi caso marcaré «Y» para eliminarlo.
– Nos preguntará si deseamos desabilitar el acceso root remotamente. En mi caso lo quiero dejar habilitado porque luego desde mi equipo (otra maquina) quiero acceder a través de MySQL Workbench para administrarlo de una forma mas comoda. Yo marcaré «N»
– Nos preguntará si deseamos eliminar la base de pruebas llamada «test». Yo la eliminaré marcando «Y»
– Por último nos preguntará si deseamos aplicar todos los privilegios que hemos configurado a las tablas inmediatamente. ¡Por supuesto!

sudo mysql_secure_installation
root@mysql-master:~# sudo mysql_secure_installation

Securing the MySQL server deployment.

Connecting to MySQL using a blank password.

VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?

Press y|Y for Yes, any other key for No: 
Please set the password for root here.

New password: 
Re-enter new password: 
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) :
Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) :
 ... skipping.
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : 
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y

4- Configurar el acceso remoto desde otra maquina.
Editamos el fichero de configuración de MySQL. comentando la linea de bind-address para permitir acceder remotamente desde cualquier maquina y skip-external-locking para que pueda escuchar las peticiones TCP hacia nuestro servidor.
quedando asi:
#skip-external-locking
#bind-address = 127.0.0.1

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

5- Reiniciamos el servidor MySQL para que se aplique este cambio

sudo service mysql restart

6- Establecemos los permisos
– Nos conectamos a la base de datos y ejecutamos las siguientes consultas.
– ‘root’@’%’ –> % Indica desde cualquier direccion ip
– Cambia «password» por tu contraseña

mysql -u root -p
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
FLUSH PRIVILEGES;

FIN!
Ya podemos acceder desde otro equipo mediante root.
Una vez configurado todo el equipo seria conveniente habilitar el bind-address poniendo las ip de los equipos externos que necesitan acceder a la MySQL y evitar un problema de dejar expuesto a todo el mundo el puerto de MySQL