Eliminar la tabla MySQL con transacciones pendientes


10

¿Hay alguna forma de eliminar una tabla o base de datos InnoDB con transacciones pendientes en MySQL (preferiblemente en el nivel del sistema de archivos)?

Que pasó:

Utilizo MySQL 5.5.28 y corrí LOAD DATA INFILE…para importar un gran conjunto de datos (300 millones de filas) en una tabla InnoDB. No lo usé set autocommit = 0;antes. Lamentablemente, mysqldse detuvo justo en el medio de la importación.

Cuando reinicio mysql, intenta deshacer la transacción llenando el registro del sistema con mensajes como este:

mysqld_safe [4433]: 121212 16:58:52 InnoDB: Esperando a que finalicen 1 transacciones activas

El problema es que la reversión se ejecuta durante más de 25 horas, durante las cuales mysqldno se aceptan conexiones de socket.

No puedo simplemente eliminar /var/lib/mysql/*y comenzar desde cero porque también hay otras bases de datos / tablas de InnoDB en esta máquina. Sin embargo, la tabla problemática es la única tabla en una base de datos separada. Eliminar la tabla completa o la base de datos completa no es un problema, ya que puedo volver a importar todos los datos después.

Respuestas:


8

No hay nada que pueda hacer realmente porque se está realizando una reversión a través del espacio de tabla UNDO dentro de ibdata1 , que debería haber crecido enormemente.

Si mata el proceso mysqld y reinicia mysql, simplemente continuará donde lo dejó como parte del ciclo de recuperación de fallos.

DESCARGO DE RESPONSABILIDAD: no nos hacemos responsables de la pérdida de datos

Lo que podría hacer puede resultar en la pérdida de datos para otras tablas, pero hay algo que puede hacer para evitar el ciclo normal de recuperación de fallas de InnoDB.

Hay una opción de inicio llamada innodb_force_recovery , que le permite omitir varias etapas de la recuperación de fallas de InnoDB.

De acuerdo con la documentación de MySQL sobre Forzar la recuperación de InnoDB , aquí están las configuraciones y sus efectos:

1 (SRV_FORCE_IGNORE_CORRUPT)

Deje que el servidor se ejecute incluso si detecta una página corrupta. Intente hacer que SELECT * FROM tbl_name salte sobre registros y páginas de índice corruptos, lo que ayuda a volcar las tablas.

2 (SRV_FORCE_NO_BACKGROUND)

Evitar que el hilo maestro se ejecute. Si ocurriera un bloqueo durante la operación de purga, este valor de recuperación lo impide.

3 (SRV_FORCE_NO_TRX_UNDO)

No ejecute reversiones de transacciones después de la recuperación del bloqueo.

4 (SRV_FORCE_NO_IBUF_MERGE)

Evitar operaciones de fusión de búfer de inserción. Si causarían un choque, no los hagas. No calcule las estadísticas de la tabla.

5 (SRV_FORCE_NO_UNDO_LOG_SCAN)

No mire los registros de deshacer al iniciar la base de datos: InnoDB trata incluso las transacciones incompletas como confirmadas.

6 (SRV_FORCE_NO_LOG_REDO)

No haga el registro de rehacer en avance en relación con la recuperación.

Con los cambios transaccionales enterrados en los registros UNDO y REDO, corre el riesgo de

  • perder datos destinados a ser escritos
  • mantener los datos destinados a ser eliminados

En caso de que espere efectos secundarios negativos, haga una copia de seguridad de todo / var / lib / mysql y colóquelo en algún lugar en caso de que desee copiar ibdata1, ib_logfile0 e ib_logfile1 y vuelva a intentar la recuperación normal.

Si mysql está completamente activo en uno de los modos

  • mysqldump todos los datos excepto la tabla ofensiva
  • apagado mysql
  • eliminar todo en / var / lib / mysql excepto / var / lib / mysql / mysql
  • iniciar mysql
  • recarga el mysqldump

PRECAUCIÓN: ¡Asegúrese de hacer una copia de seguridad de todo!

Espero que esto ayude !!!


1

Tuve una situación similar esta semana.

Y después de cuatro iteraciones de restaurar una copia de seguridad completa en un servidor de prueba e intentar eliminar, eliminar o eliminar las tablas con las transacciones pendientes gigantes, finalmente llegamos al viernes por la tarde y decidimos dejarlo funcionar. Durante tres días, la transacción terminó con una carga insignificante del servidor y la base de datos estuvo bien. Lo cual fue mucho mejor que cualquiera de las operaciones manuales en archivos .frm y tablas mysql que habían intentado y fallaron.

Mi solución: no lo elimines . Permita que finalicen las transacciones pendientes, incluso si tiene que posponer otras operaciones durante unos días, o encuentra algo de espacio en disco en alguna parte, o deja que su servidor esclavo se encargue.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.