Buscar..


Observaciones

La replicación se utiliza para copiar datos de [Copia de seguridad] de un servidor de base de datos MySQL a uno o más servidores de base de datos MySQL.

Maestro : el servidor de base de datos MySQL, que sirve para copiar los datos.

Esclavo : el servidor de la base de datos MySQL, copia los datos que sirve Master.

Con MySQL, la replicación es asíncrona por defecto. Esto significa que los esclavos no necesitan estar conectados permanentemente para recibir actualizaciones del maestro. Por ejemplo, si su esclavo está apagado o no está conectado con el maestro y usted lo está conectando o se conecta con el maestro más tarde, entonces se sincronizará automáticamente con el maestro.

Dependiendo de la configuración, puede replicar todas las bases de datos, bases de datos seleccionadas o incluso tablas seleccionadas dentro de una base de datos.

Formatos de replicación

Hay dos tipos principales de formatos de replicación

Replicación basada en instrucciones (SBR) , que replica declaraciones SQL completas. En esto, el maestro escribe sentencias de SQL en el registro binario. La replicación del maestro al esclavo funciona ejecutando las sentencias de SQL en el esclavo.

Replicación basada en filas (RBR) , que replica solo las filas modificadas. En esto, el maestro escribe eventos en el registro binario que indican cómo se cambian las filas de la tabla individual. La replicación del maestro al esclavo funciona copiando los eventos que representan los cambios en las filas de la tabla al esclavo.

También puede utilizar una tercera variedad, la replicación basada mixta (MBR) . En esto, se utiliza tanto el registro basado en sentencias como el basado en filas. El registro se creará según cuál sea el más apropiado para el cambio.

El formato basado en declaraciones fue el predeterminado en las versiones de MySQL anteriores a 5.7.7. En MySQL 5.7.7 y versiones posteriores, el formato basado en filas es el predeterminado.

Maestro - Configuración de replicación de esclavos

Considere 2 servidores MySQL para la configuración de la replicación, uno es un maestro y el otro es un esclavo.

Vamos a configurar el Maestro para que mantenga un registro de cada acción realizada en él. Vamos a configurar el servidor esclavo para que mire el registro en el maestro y cada vez que ocurran cambios en el registro en el maestro, debe hacer lo mismo.

Configuración maestra

En primer lugar, necesitamos crear un usuario en el Master. Este usuario será utilizado por Slave para crear una conexión con el Maestro.

CREATE USER 'user_name'@'%' IDENTIFIED BY 'user_password';
GRANT REPLICATION SLAVE ON *.* TO 'user_name'@'%';
FLUSH PRIVILEGES;

Cambio user_name y user_password acuerdo con su nombre de usuario y contraseña.

Ahora el my.inf (my.cnf en Linux) debe ser editado. Incluya las siguientes líneas en la sección [mysqld].

server-id = 1
log-bin = mysql-bin.log
binlog-do-db = your_database

La primera línea se utiliza para asignar una ID a este servidor MySQL.

La segunda línea le dice a MySQL que comience a escribir un registro en el archivo de registro especificado. En Linux, esto puede configurarse como log-bin = /home/mysql/logs/mysql-bin.log . Si está iniciando la replicación en un servidor MySQL en el que ya se ha utilizado la replicación, asegúrese de que este directorio esté vacío de todos los registros de replicación.

La tercera línea se utiliza para configurar la base de datos para la que vamos a escribir el registro. Debe reemplazar your_database con su nombre de base de datos.

Asegúrese de que skip-networking no haya sido habilitado y reinicie el servidor MySQL (Master)

Configuración de esclavo

my.inf archivo my.inf debe editarse en Slave. Incluya las siguientes líneas en la sección [mysqld].

server-id = 2
master-host = master_ip_address
master-connect-retry = 60

master-user = user_name
master-password = user_password
replicate-do-db = your_database

relay-log = slave-relay.log
relay-log-index = slave-relay-log.index

La primera línea se utiliza para asignar una ID a este servidor MySQL. Esta identificación debe ser única.

La segunda línea es la dirección IP del servidor maestro. Cambia esto de acuerdo a tu sistema maestro IP

La tercera línea se utiliza para establecer un límite de reintento en segundos.

Las siguientes dos líneas indican el nombre de usuario y la contraseña al esclavo, mediante el cual se conecta al maestro.

La siguiente línea establece la base de datos que necesita para replicar.

Las dos últimas líneas utilizadas para asignar relay-log nombres de los archivos de relay-log y relay-log-index .

Asegúrese de que skip-networking no se haya habilitado y reinicie el servidor MySQL (esclavo)

Copiar datos a esclavo

Si constantemente se agregan datos al Maestro, tendremos que evitar todos los accesos a la base de datos en el Maestro para que no se pueda agregar nada. Esto se puede lograr ejecutando la siguiente declaración en Master.

FLUSH TABLES WITH READ LOCK;

Si no se agregan datos al servidor, puede omitir el paso anterior.

Vamos a realizar una copia de seguridad de los datos del Maestro usando mysqldump

mysqldump your_database -u root -p > D://Backup/backup.sql;

Cambie your_database directorio de base de your_database y copia de seguridad según su configuración. Ahora tendrás un archivo llamado backup.sql en la ubicación dada.

Si su base de datos no existe en su Esclavo, cree eso ejecutando lo siguiente

CREATE DATABASE `your_database`;

Ahora tenemos que importar la copia de seguridad en el servidor MySQL esclavo.

mysql -u root -p your_database  <D://Backup/backup.sql
--->Change `your_database` and backup directory according to your setup

Iniciar la replicación

Para iniciar la replicación, debemos encontrar el nombre del archivo de registro y la posición del registro en el Maestro. Entonces, ejecuta lo siguiente en Master

SHOW MASTER STATUS;

Esto le dará una salida como abajo

+---------------------+----------+-------------------------------+------------------+
| File                | Position | Binlog_Do_DB                  | Binlog_Ignore_DB |
+---------------------+----------+-------------------------------+------------------+
| mysql-bin.000001    | 130      | your_database                 |                  |
+---------------------+----------+-------------------------------+------------------+

A continuación, ejecute el siguiente en esclavo

SLAVE STOP;
CHANGE MASTER TO MASTER_HOST='master_ip_address', MASTER_USER='user_name', 
   MASTER_PASSWORD='user_password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=130;
SLAVE START;

Primero paramos al esclavo. Luego le decimos exactamente dónde buscar en el archivo de registro maestro. Para el nombre de MASTER_LOG_FILE y MASTER_LOG_POS , use los valores que obtuvimos al ejecutar el comando SHOW MASTER STATUS en el Maestro.

Debe cambiar la IP del maestro en MASTER_HOST , y cambiar el usuario y la contraseña en consecuencia.

El esclavo ahora estará esperando. El estado del esclavo se puede ver ejecutando lo siguiente

SHOW SLAVE STATUS;

Si anteriormente ejecutó FLUSH TABLES WITH READ LOCK en Master, libere las tablas del bloqueo ejecutando lo siguiente

UNLOCK TABLES;

Ahora el Maestro mantiene un registro para cada acción que se realiza en él y el servidor Esclavo mira el registro en el Maestro. Cada vez que se producen cambios en el inicio de sesión en el maestro, Slave lo replica.

Errores de replicación

Cuando se produce un error al ejecutar una consulta en el esclavo, MySQL detiene la replicación automáticamente para identificar el problema y solucionarlo. Esto se debe principalmente a que un evento causó una clave duplicada o no se encontró una fila y no se puede actualizar o eliminar. Puede omitir tales errores, incluso si no se recomienda

Para omitir una sola consulta que cuelga el esclavo, use la siguiente sintaxis

SET GLOBAL sql_slave_skip_counter = N;

Esta declaración omite los siguientes N eventos del maestro. Esta declaración es válida solo cuando los subprocesos esclavos no se están ejecutando. De lo contrario, se produce un error.

STOP SLAVE;
SET GLOBAL sql_slave_skip_counter=1;
START SLAVE;

En algunos casos esto está bien. Pero si la declaración es parte de una transacción de múltiples declaraciones, se vuelve más compleja, porque omitir la declaración que produce el error hará que se omita toda la transacción.

Si desea omitir más consultas que producen el mismo código de error y está seguro de que omitir esos errores no hará que su esclavo sea inconsistente y desea omitirlos todos, agregará una línea para omitir ese código de error en su my.cnf .

Por ejemplo, es posible que desee omitir todos los errores duplicados que pueda estar recibiendo

1062 | Error 'Duplicate entry 'xyz' for key 1' on query

Luego agrega lo siguiente a tu my.cnf

slave-skip-errors = 1062

También puede omitir otro tipo de errores o todos los códigos de error, pero asegúrese de que omitir esos errores no hará que su esclavo sea inconsistente. Los siguientes son la sintaxis y ejemplos.

slave-skip-errors=[err_code1,err_code2,...|all]

slave-skip-errors=1062,1053
slave-skip-errors=all
slave-skip-errors=ddl_exist_errors


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow