2008-09-29 9 views
11

mysql5.0 con un par de bases de datos "A" y "B", ambas con tablas innodb grandes. "soltar la base de datos A"; congela la base de datos "B" por un par de minutos. Nada está usando "A" en ese punto, entonces ¿por qué es una operación tan intensa?mysql "drop database" lleva tiempo, ¿por qué?

Puntos de bonificación: Dado que usamos "A", cargamos datos en "B", y luego cambiamos a usar "B", ¿cómo podemos hacer esto más rápido? Dejar caer bases de datos no es el tipo de cosas que uno típicamente tiene que hacer todo el tiempo, así que esto está un poco fuera de serie.

+0

Tuve un problema similar, pero las otras bases de datos estaban operativas. La solución consistía en eliminar todos los demás procesos que utilizaban esta base de datos porque la bloqueaban (probablemente implícitamente con solo tener esa base de datos seleccionada, ya que estaban durmiendo). – GDR

Respuesta

13

Así que no estoy seguro de que Matt Rogish's answer vaya a ayudar al 100%.

El problema es que MySQL * tiene un mutex (bloqueo mutuamente excluyentes) alrededor de las mesas de apertura y cierre, por lo que básicamente significa que si una tabla está en el proceso de cierre/borrado, se pueden abrir no otras tablas .

Esto es descrito por un colega mío aquí: http://www.mysqlperformanceblog.com/2009/06/16/slow-drop-table/

Una estrategia excelente reducción del impacto es utilizar un sistema de archivos como XFS.

La solución es fea. En esencia, tiene que mordisquear todos los datos en las tablas antes de soltarlos (vea el comentario # 11 en el enlace de arriba).

+0

Has explicado el mecanismo de bloqueo y todo tiene sentido ... pero el 'por qué' aún no ha sido respondido. No toma mucho tiempo eliminar un montón de archivos en Linux. Así que supongo que hay algo mucho más complejo bajo el capó. Si es así, '¿por qué?' Lo hace de esa manera, como opuesto a simplemente borrar sus archivos en unos segundos y 'bingo' ... ¿se han caído todas las tablas? – Jeach

+1

Hay otra razón además de la eliminación lenta de fs: si hay un grupo de búferes muy grande, puede haber un bloqueo que intenta desalojar todas las páginas que pertenecen a la tabla que se va a eliminar. Esto se mejoró en quizás 5.5/5.6 con un método libre "flojo". –

6

De forma predeterminada, todas las bases de datos de innodb en una instalación de servidor mysql utilizan el mismo conjunto físico de archivos de datos, por lo que "la base de datos A puede caer" podría afectar a la base de datos B. Dado que es probable que la "base de datos de caída" implique un reorga En los archivos de datos innodb, es concebible que sea una operación de bloqueo, ya sea por la intensidad de la operación o por diseño.

Sin embargo, creo que puede hacer que cada base de datos utilice archivos físicos diferentes, aunque yo mismo no lo haya intentado, así que tendrá que averiguar los detalles por sí mismo. De lo contrario, es posible que deba utilizar dos instalaciones diferentes de mysql una al lado de la otra en la misma máquina, lo cual es perfectamente factible.

11

Siguiendo fuera de skaffman:

Cambiar su my.cnf (MySQL y reiniciar) para incluir:

innodb_file_per_table = 1 

(http://mysqldba.blogspot.com/2006/12/innodbfilepertable.html)

Esto dará a sus bases de datos de almacenamiento de archivos dedicado y tomar fuera del grupo compartido. Luego, le permitirá hacer cosas divertidas, como colocar las tablas/índices en diferentes discos físicos para dividir aún más las E/S y mejorar el rendimiento.

Tenga en cuenta que esto no modifica las tablas existentes; tendrás que trabajar para obtenerlos en su propio archivo (http://capttofu.livejournal.com/11791.html).

+1

Creo que exagera la utilidad de usar innodb_file_per_table = 1 para dividir I/O - RAID es una mejor opción. Por qué: InnoDB no admite la opción CREATE TABLE llamada DATA DIRECTORY. Quiero mover una tabla individual a otra, tengo que usar el enlace simbólico de nuevo a la ubicación original. Tan pronto como ejecute un comando ALTER TABLE, el enlace simbólico se destruye y la tabla vuelve a la ubicación original. –

+0

Me sorprende que esta única opción haga una gran diferencia. Eres un salvavidas! –

Cuestiones relacionadas