2010-01-27 10 views
5

Tengo un problema en un servidor maestro MySQL (5.0, Linux): Intenté agregar un comentario a una fila de la tabla, que se traduce en un comando ALTER TABLE. Ahora el proceso está atascado en 'copy to tmp table', copiando las 100'000'000 + filas. El uso de Disk IO es incómodamente alto.¿Es seguro matar a un proceso de replicación de MySQL que está 'copiando a la tabla tmp'?

Dado que el maestro está utilizando la replicación, no estoy seguro si puedo matar este proceso. Los esclavos aún no han visto el comando ALTER TABLE.

(Para aclarar esto: estoy hablando de matar el proceso desde el MySQL-PROCESSLIST, no el Demonio-MySQL proceso en sí.)

Respuesta

1

Sí, puedes matarlo: ALTER no entrará en los binlogs hasta que se haya confirmado la transacción, es decir, hasta que termine ALTER. Entonces los esclavos no lo verán ni lo ejecutarán, y el maestro retrocederá a la estructura de la tabla anterior.

Puede verificar fácilmente que ALTER aún no está en los binlogs utilizando show binlog events o la utilidad mysqlbinlog.

0

No, no es seguro. Solo si tiene una copia de seguridad completa (recientemente) de la base de datos, para restaurar en caso de un problema. Puede haber algunos bloqueos y terminas después con las tablas bloqueadas, posible daño en las teclas.

Como consejo si agrega nuevas columnas para una base de datos tan grande. Es más fácil

  • para crear un imitador del esquema de la tabla
  • ejecutar la alteración en la mesa mientras está vacía,
  • poblar desde el original, con una inserción en ...() Seleccione los campos de .. ..

Esto es mucho más rápido. Entonces obviamente cambie el nombre de la tabla al original.

+0

Estaba hablando del proceso interno, no del proceso mysqld en sí mismo. –

0

se puede matar a la operación, pero pueden ocurrir dos cosas:

  1. el esquema esclavo es incompatible con el maestro (y por lo tanto :)
  2. la replicación de los esclavos puede parar.

Cuando la reproducción se detiene, se puede tratar de corregir manualmente el esclavo (s) por saltarse el 'alter table' instrucción mediante la introducción en el servidor esclavo:

SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; SLAVE START;

Cuestiones relacionadas