Este es el procedimiento completo paso a paso para volver a sincronizar una replicación maestro-esclavo desde cero:
En el maestro:
RESET MASTER;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
Y copie los valores del resultado del último comando en alguna parte.
Sin cerrar la conexión con el cliente (porque liberaría el bloqueo de lectura) emita el comando para obtener un volcado del maestro:
mysqldump -u root -p --all-databases > /a/path/mysqldump.sql
Ahora puede liberar el bloqueo, incluso si el volcado aún no ha terminado. Para hacerlo, ejecute el siguiente comando en el cliente MySQL:
UNLOCK TABLES;
Ahora copie el archivo de volcado al esclavo usando scp o su herramienta preferida.
En el esclavo:
Abra una conexión a mysql y escriba:
STOP SLAVE;
Cargue el volcado de datos del maestro con este comando de consola:
mysql -uroot -p < mysqldump.sql
Sincronizar registros esclavos y maestros:
RESET SLAVE;
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=98;
Donde los valores de los campos anteriores son los que copió antes.
Por último, escriba:
START SLAVE;
Para verificar que todo vuelva a funcionar, después de escribir:
SHOW SLAVE STATUS;
deberías ver:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
¡Eso es!
--opt --single-transaction --comments --hex-blob --dump-date --no-autocommit --all-databases
RESET_SLAVE
necesario? Tenga en cuenta que estas instrucciones al usuario restablecer la replicación y la contraseña, por lo que tendrá que volver a introducir aquellos conCHANGE MASTER TO...
La documentación para esto en el sitio MySQL está lamentablemente desactualizada y plagada de pistolas (como interactive_timeout). Emitir FLUSH TABLES CON READ LOCK como parte de su exportación del maestro generalmente solo tiene sentido cuando se coordina con una instantánea de almacenamiento / sistema de archivos como LVM o zfs.
Si va a usar mysqldump, debe confiar en la opción --master-data para protegerse contra errores humanos y liberar los bloqueos en el maestro lo más rápido posible.
Suponga que el maestro es 192.168.100.50 y el esclavo es 192.168.100.51, cada servidor tiene una identificación de servidor distinta configurada, el maestro tiene un inicio de sesión binario y el esclavo tiene solo lectura = 1 en my.cnf
Para organizar el esclavo para poder iniciar la replicación justo después de importar el volcado, emita un comando CHANGE MASTER pero omita el nombre y la posición del archivo de registro:
Emita el GRANT en el maestro para que lo use el esclavo:
Exporte el maestro (en pantalla) usando compresión y capturando automáticamente las coordenadas binarias correctas del registro:
Copie el archivo replication.sql.gz al esclavo y luego impórtelo con zcat a la instancia de MySQL que se ejecuta en el esclavo:
Inicie la replicación emitiendo el comando al esclavo:
Opcionalmente, actualice el /root/.my.cnf en el esclavo para almacenar la misma contraseña de root que el maestro.
Si tiene 5.1+, lo mejor es configurar primero el binlog_format del maestro en MIXED o ROW. Tenga en cuenta que los eventos registrados en la fila son lentos para las tablas que carecen de una clave principal. Esto suele ser mejor que la configuración alternativa (y predeterminada) de binlog_format = instrucción (en el maestro), ya que es menos probable que produzca datos incorrectos en el esclavo.
Si debe (pero probablemente no debería) filtrar la replicación, hágalo con las opciones de esclavo replicate-wild-do-table = dbname.% O replicate-wild-ignore-table = badDB.% Y use solo binlog_format = row
Este proceso mantendrá un bloqueo global en el maestro durante la duración del comando mysqldump, pero de lo contrario no afectará al maestro.
Si tiene la tentación de usar mysqldump --master-data --all-bases de datos --solo-transacción (porque solo usa tablas InnoDB), quizás sea mejor usar MySQL Enterprise Backup o la implementación de código abierto llamada xtrabackup (cortesía de Percona)
fuente
zcat
. Pregunta 2: ¿Cómo funciona estomysqldump
con grandes bases de datos en términos de rendimiento? ¿Alguna forma de usarSELECT INTO OUTFILE
yLOAD DATA
sin problemas en su proceso sugerido? (Dado que generalmente se desempeñan más rápido)STOP SLAVE
algún lugar en el proceso?A menos que esté escribiendo directamente en el esclavo (Servidor2), el único problema debería ser que al Servidor2 le faltan las actualizaciones que ocurrieron desde que se desconectó. Simplemente reiniciando el esclavo con "START SLAVE"; debería volver a poner todo al día.
fuente
Creo que Maatkit utilits te ayuda. Puede usar mk-table-sync. Consulte este enlace: http://www.maatkit.org/doc/mk-table-sync.html
fuente
Llegué muy tarde a esta pregunta, sin embargo, encontré este problema y, después de mucho buscar, encontré esta información de Bryan Kennedy: http://plusbryan.com/mysql-replication-without-downtime
En Master, realice una copia de seguridad como esta:
mysqldump --skip-lock-tables --single-transacción --flush-logs --hex-blob --master-data = 2 -A> ~ / dump.sql
Ahora, examine el encabezado del archivo y anote los valores para MASTER_LOG_FILE y MASTER_LOG_POS. Los necesitará más tarde: head dump.sql -n80 | grep "MASTER_LOG"
Copie el archivo "dump.sql" en Slave y restaúrelo: mysql -u mysql-user -p <~ / dump.sql
Conéctese a Slave mysql y ejecute un comando como este: CAMBIAR MASTER TO MASTER_HOST = 'master-server-ip', MASTER_USER = 'replication-user', MASTER_PASSWORD = 'slave-server-password', MASTER_LOG_FILE = 'value from above', MASTER_LOG_POS = valor desde arriba; INICIAR ESCLAVO;
Para verificar el progreso de Slave: MOSTRAR ESTADO DE ESCLAVO;
Si todo está bien, Last_Error estará en blanco y Slave_IO_State informará "Esperando que el maestro envíe el evento". Busque Seconds_Behind_Master que indica qué tan atrás está. YMMV. :)
fuente
--master-data=1
(o simplemente--master-data
).Esto es lo que normalmente hago cuando un esclavo mysql se desincroniza. He mirado mk-table-sync pero pensé que la sección de Riesgos tenía un aspecto aterrador.
En el maestro:
Las columnas de salida (Archivo, Posición) nos serán de utilidad en un momento.
En esclavo:
Luego volcar el db maestro e importarlo al db esclavo.
Luego ejecute lo siguiente:
Donde [Archivo] y [Posición] son los valores emitidos desde "SHOW MASTER STATUS" que se ejecutó anteriormente.
¡Espero que esto ayude!
fuente
FLUSH TABLES WITH READ LOCK;
antesSHOW MASTER STATUS
y vuelcas la base de datos maestra. Creo que esto podría dar lugar, por ejemplo, a errores de clave duplicados en el esclavo, ya que establece efectivamente el estado maestro en un punto en el tiempo antes de que se realizara el volcado, por lo que volverá a reproducir el historial que ya está incluido en el volcado. (Si haces las cosas en el orden que describiste).Continuando con la respuesta de David ...
El uso
SHOW SLAVE STATUS\G
dará resultados legibles por humanos.fuente
a veces solo necesitas darle una patada al esclavo también
tratar
bastante a menudo, esclavos, simplemente se quedan atrapados chicos :)
fuente
Position
en el maestro usandoshow master status;
contraExec_Master_Log_Pos:
en el esclavo usandoshow slave status \G
. El esclavo debe alcanzar al maestro. Trabajó para mí usando mysql 5.6 justo ahora después de una corta interrupción de la red.Aquí hay una respuesta completa que con suerte ayudará a otros ...
Quiero configurar la replicación mysql usando maestro y esclavo, y dado que lo único que sabía era que usa archivos de registro para sincronizar, si el esclavo se desconecta y se desincroniza, en teoría solo debería conectarse nuevamente a su maestro y siga leyendo el archivo de registro desde donde lo dejó, como mencionó el usuario malonso.
Así que aquí están los resultados de la prueba después de configurar el maestro y el esclavo como se menciona en: http://dev.mysql.com/doc/refman/5.0/en/replication-howto.html ...
Siempre que use la configuración maestra / esclava recomendada y no escriba al esclavo, él y yo estamos en lo correcto (en lo que respecta a mysql-server 5.x). Ni siquiera necesitaba usar "START SLAVE;", simplemente alcanzó a su maestro. Pero hay un 88000 predeterminado que vuelve a intentar cada 60 segundos, así que supongo que si agota, es posible que deba iniciar o reiniciar el esclavo. De todos modos, para aquellos como yo que querían saber si tener un esclavo desconectado y volver a realizar una copia de seguridad requiere intervención manual ... no, no lo hace.
¿Quizás el póster original tenía corrupción en los archivos de registro? Pero lo más probable es que no sea solo un servidor que se desconecta por un día.
extraído de /usr/share/doc/mysql-server-5.1/README.Debian.gz que probablemente también tenga sentido para servidores que no sean de Debian:
puedes usar algo como sql: muestra variables como 'tmpdir'; descubrir.
fuente
Agregando a la respuesta popular para incluir este error:
Replicación de esclavo en un disparo:
En una ventana de terminal:
Después de conectar
El estado aparece como a continuación: ¡Tenga en cuenta que el número de posición varía!
¡Exporte el volcado de forma similar a como describió " usar otro terminal "!
Salga y conéctese a su propio DB (que es el esclavo):
El tipo de los siguientes comandos:
Importe el volcado como se mencionó (¡en otra terminal, por supuesto!) Y escriba los siguientes comandos:
Una vez registrado, establezca el parámetro server_id (generalmente, para bases de datos nuevas / no replicadas, esto no se establece de manera predeterminada),
Ahora, comienza el esclavo.
El resultado debe ser el mismo que él describió.
Nota: ¡Una vez replicados, el maestro y el esclavo comparten la misma contraseña!
fuente
Reconstruyendo el esclavo usando LVM
Aquí está el método que usamos para reconstruir esclavos MySQL usando Linux LVM. Esto garantiza una instantánea consistente al tiempo que requiere un tiempo de inactividad mínimo en su maestro.
Establezca el porcentaje máximo de páginas sucias innodb en cero en el servidor MySQL maestro. Esto obligará a MySQL a escribir todas las páginas en el disco, lo que acelerará significativamente el reinicio.
Para controlar la cantidad de páginas sucias, ejecute el comando
Una vez que el número deja de disminuir, has alcanzado el punto para continuar. A continuación, restablezca el maestro para borrar los registros de bin / registros de retransmisión antiguos:
Ejecute lvdisplay para obtener la ruta LV
La salida se verá así
Apague la base de datos maestra con el comando
A continuación, tome una instantánea, mysql_snapshot será el nuevo nombre de volumen lógico. Si los binlogs se colocan en la unidad del sistema operativo, también deben ser instantáneas.
Iniciar maestro nuevamente con comando
Restaurar la configuración de páginas sucias al valor predeterminado
Ejecute lvdisplay nuevamente para asegurarse de que la instantánea esté allí y sea visible
Salida:
Monta la instantánea
Si tiene un esclavo MySQL en ejecución, debe detenerlo
A continuación, debe borrar la carpeta de datos MySQL
De vuelta al maestro. Ahora sincronice la instantánea con el esclavo MySQL
Una vez que rsync se haya completado, puede desmontar y eliminar la instantánea
Cree un usuario de replicación en el maestro si el antiguo usuario de replicación no existe o la contraseña es desconocida
Verifique que los archivos de datos / var / lib / mysql son propiedad del usuario mysql, de ser así, puede omitir el siguiente comando:
Luego registre la posición del binlog
Verás algo como
Aquí el archivo de registro maestro es el número de archivo más alto en secuencia y la posición del registro de bin es el tamaño del archivo. Registre estos valores:
A continuación, inicie el esclavo MySQL
Ejecute el comando cambiar maestro en el esclavo ejecutando lo siguiente:
Finalmente comienza el esclavo
Verifique el estado del esclavo:
Asegúrese de que Slave IO se esté ejecutando y que no haya errores de conexión. ¡Buena suerte!
BR, Juha Vehnia
Recientemente escribí esto en mi blog que se encuentra aquí ... Hay pocos detalles más allí, pero la historia es la misma.
http://www.juhavehnia.com/2015/05/rebuilding-mysql-slave-using-linux-lvm.html
fuente
Creé un repositorio de GitHub con un script para resolver este problema rápidamente. Simplemente cambie un par de variables y ejecútelo (Primero, el script crea una copia de seguridad de su base de datos).
Espero que esto te ayude (y a otras personas también).
Cómo restablecer (volver a sincronizar) MySQL Master-Slave Replication
fuente
Estamos utilizando la técnica de replicación maestro-maestro de MySQL y si un servidor MySQL dice que 1 se elimina de la red, se vuelve a conectar después de que se restablezca la conexión y se transfieran todos los registros que se confirmaron en el servidor 2 que estaba en la red al servidor 1 que ha perdido la conexión después de la restauración. El subproceso esclavo en MySQL vuelve a intentar conectarse a su maestro después de cada 60 segundos de forma predeterminada. Esta propiedad se puede cambiar ya que MySQL tiene un indicador "master_connect_retry = 5" donde 5 está en segundos. Esto significa que queremos volver a intentarlo cada 5 segundos.
Pero debe asegurarse de que el servidor que perdió la conexión muestre que no realiza ninguna confirmación en la base de datos cuando obtiene duplicado Error de clave Código de error: 1062
fuente
maestro :
scp master:/tmp/dump.sql.gz slave:/tmp/
Mover el archivo de volcado al servidor esclavoEsclavo:
zcat /tmp/dump.sql.gz | mysql -u root -p
NOTA :
En el maestro, puede ejecutar
SET GLOBAL expire_logs_days = 3
para mantener binlogs durante 3 días en caso de problemas de esclavos.fuente