Vicchiam Notes

Experiencias Informáticas

Replicar bases de datos MySQL

Para replicar una base de datos MySQL, se necesita un Maestro, y uno o varios Esclavos,  los esclavos deben de tener una copia exacta de las bases de datos que se repliquen, antes de empezar esta. La replicación consiste en que cada modificación de la base de datos del Máster será reflejada en el Esclavo o Esclavos; en los esclavos se podrán hacer SELECT pero no INSERT, UPDATE o DELETE.

Cuando ponga «mysql>» significa que estarás logeado a la base de datos en la consola

mysql -u usuario_mysql -p

Escenario:

Equipo con Centos 5.7 instalado y base de datos MySQL 5.5.18, este sera el Máster.

Equipo con Centos 5.7 instalado sera el Esclavo.

Carpetas compartidas mediante NFS entre el máster y el esclavo para compartir los backups sql

1- Instalar MySQL en el esclavo (como root).

Instalamos los paquetes necesarios

yum install mysql mysql-server

Indicamos que se inicie cuando arranque el sistema

/sbin/chkconfig --levels 235 mysqld on

Iniciamos el gestor de base de datos

/sbin/service mysqld start

Entramos en el gestor por primera vez

mysql -u root

Le damos todos los permiso al usuario root y le indicamos una contraseña

grant all privileges on *.* to root identified by 'contraseña' with grant option;

2- Hacer una copia de las bases de datos a replicar que están en el futuro máster

mysqldump -u nombre_usuario -p nombre_bd > nombre_bd.sql

3- Crear las bases de datos que vamos a replicar en el esclavo y restaurar la copia

create database nombre_bd_nueva

mysql nombre_bd_nueva -u nombre_usuario -p < nombre_bd.sql

Configuración del Máster

1- Crear usuario para la replicación (accederá desde el esclavo)

grant replication slave on *.* to 'usuario_replicacion'@'host_esclavo' identified by 'contraseña'

2- Configurar my.cnf (En CentOS /etc/my.cnf)

[mysqld]

server-id=1

log-bin=host-bin

binlog-do-db=nombre_bd1 (Una linea por cada base de datos a replicar)

binlog-do-db=nombre_bd2

innodb_flush_log_at_trx_commit=1 (Si tienes tablas InnoDB para replicar)

sync-binlog=1 (Si tienes tablas InnoDB para replicar)

3- Ver nombre binlog del máster y la posición

mysql> show master status;

File: mysql-bin.000001

position: 107 

Configurar Esclavo

1- Configurar my.cnf (En CentOS /etc/my.cnf)

[mysqld]

server-id=2 (Numero diferente del Máster, y diferente de otros esclavos)

2-Indicar al esclavo los parámetros del Máster

CHANGE MASTER TO MASTER_HOST='maestro_host_name'

CHANGE MASTER TO MASTER_USER='usuario_replicacion'

CHANGE MASTER TO MASTER_PASSWORD='password_replicacion'

CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001' (El mostrado por "show master status")

CHANGE MASTER TO MASTER_LOG_POS=107 (La mostrada por "show master status", sin comilla simple)

3-Iniciar el servidor esclavo

mysql> start slave;

Comprobar que funciona

En el máster ( Orientativo )

mysql> show master status\G

*************************** 1. row ***************************

File: host-bin.000003

Position: 311

Binlog_Do_DB: pfc,rar

Binlog_Ignore_DB:

En el esclavo ( Orientativo )

mysql> show slave status\G

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: master_host (Debe ser el master)

Master_User: usuario_replicacion ( El usuario puesto anteriomente )

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: host-bin.000001

Read_Master_Log_Pos: 311

Relay_Log_File: mysqld-relay-bin.000009

Relay_Log_Pos: 449

Relay_Master_Log_File: host-bin.000003

Slave_IO_Running: Yes  ( Importeante ) 

Slave_SQL_Running: Yes ( Importante )

Last_Errno: 0

Last_Error:

Skip_Counter: 0

Exec_Master_Log_Pos: 311  ( Posición del binlog del máster )

Relay_Log_Space: 449

Until_Condition: None

Until_Log_File:

Until_Log_Pos: 0

Master_SSL_Allowed: No

Seconds_Behind_Master: 0  (Segundos restantes para pedir al máster el binlog)

Realizar una operación en el máster como un update y comprobar que se ha modificado en el esclavo.

Algunos scripts útiles

Supongamos que tenemos en un servidor MySQL las bases de datos productos,comerciales y transportes, cada una con sus tablas y queremos replicarla, para hacerlo mas fácil pongo estos scripts

Estos scrips se apoyan en un fichero bases_de_datos.txt donde pondremos el nombre de las bases sobre las que operar un nombre por linea. Ejemplo de fichero «bases_de_datos.txt»

productos
comerciales
trasportes

Primero de la original «Master» vamos a exportar estas 3 bases de datos con este script. Ejemplo de script «exportar.sh»

#!/bin/bash
USER="usuario"
PASSWORD="pasword"
OUTPUT="ruta_del_destino_de_los_ficheros"
//Cuidado con esto que borra todos los ficheros que hay en el destino terminados con sql
rm $OUTPUT/*sql > /dev/null 2>&1
for db in $(cat bases_de_datos.txt)
do
echo "Copiando: $db"
mysqldump --user=$USER --password=$PASSWORD $db > $OUTPUT/$db.sql
echo "$db copiada en $db.sql"
done

Después copiamos estos ficheros en un directorio accesible desde el futuro esclavo «Slave», y pongo el script para importar las bases de datos, antes de importar hay que crear las bases de datos en el esclavo con los mismos nombres. Ejemplo de script «importar.sh»

#!/bin/bash
USER="usuario"
PASSWORD="password"
INPUT="ruta_donde_estan_los_archivos_sql_generados_anteriormente"
for db in $(cat bases_de_datos.txt)
do
echo "Importando: $db"
mysql $db --user=$USER --password=$PASSWORD < $INPUT/$db.sql
echo "$db importada"
done

Si por alguna razón falla la replicación y hay que volver a importar las bases de datos, este script las vacía, las borra y las vuelve a crear. Cuidado con este que borra todas las tablas que se indican en bases_de_datos.txt de las bases de datos, solo hacerlo en un esclavo «Slave». Ejemplo «vaciar.sh»

#!/bin/bash
USER="usuario"
PASSWORD="password"
for db in $(cat bases_de_datos.txt)
do
echo "Vaciando: $db"
mysql --user=$USER --password=$PASSWORD -e "drop database $db;"
mysql --user=$USER --password=$PASSWORD -e "create database $db;"
done

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*