Pregunta

Tengo un servidor MySQL 5.1 con una base de datos de aproximadamente 450 mesas, tomando 4GB. La gran mayoría de estas tablas (todos pero 2) son MyISAM. Esto ha estado bien en su mayor parte (no necesidad de transacciones), pero la solicitud ha sido ganar tráfico y ciertas tablas se han visto afectados por la mesa de cierre automático de las actualizaciones. Esa es la razón 2 de las tablas InnoDB son ahora.

La conversión de las tablas más pequeñas (100k filas) no toma mucho tiempo, haciendo que el tiempo de inactividad mínimo. Sin embargo algunos de mis tablas de seguimiento se están acercando a los 50 millones de filas. ¿Hay una manera de acelerar un ALTER TABLE...ENGINE InnoDB en tablas grandes? Y si no, ¿hay otros métodos para convertir minimizar el tiempo de inactividad en estas mesas de escritura-pesado?

¿Fue útil?

Solución

Permítanme comenzar diciendo, no me gusta ALTER. Es el mal, en mi humilde opinión.

decir que este es el esquema de tabla actual -

CREATE TABLE my_table_of_love (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
my_value VARCHAR(40),
date_created DATE,
PRIMARY KEY(id)
) ENGINE=MyISAM CHARSET=utf8;

Este es el camino que yo recomiendo -

Crear un nuevo objeto de tabla que va a sustituir a la antigua:

CREATE TABLE my_table_of_love_NEW (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
my_value VARCHAR(40),
date_created DATE,
PRIMARY KEY(id)
) ENGINE=InnoDB CHARSET=utf8

Insertar todas las filas de la mesa de edad por su nombre en la nueva tabla:

INSERT INTO my_table_of_love_NEW (id,my_value,date_created)
SELECT id,my_value,date_created FROM my_table_of_love;

prueba de humo migración:

SELECT COUNT(*) FROM my_table_of_love_NEW;
SELECT COUNT(*) FROM my_table_of_love;
SELECT a.id,a.my_value,a.date_created FROM my_table_of_love_NEW a
LEFT JOIN my_table_of_love b ON (b.id = a.id)
WHERE a.my_value != b.my_value;

nombres de tabla de permutación para que pueda mantener una copia de seguridad en caso de que necesitan reversión.

RENAME TABLE my_table_of_love TO my_table_of_love_OLD;
RENAME TABLE my_table_of_love_NEW TO my_table_of_love;

Proceder a las pruebas de regresión.

Este enfoque se vuelve más y más preferible con mesas con varios índices y millones de filas.

Los pensamientos?

Otros consejos

1) Pérdida de protección es una función de la paranoia. Haga siempre una copia de seguridad. Si usted es realmente paranoico, hacer una copia de seguridad a continuación, restaurar desde la copia de seguridad.

2) Esta página del manual de MySQL tiene instrucciones para convertir los tipos de tabla.

La forma más rápida de modificar una tabla a InnoDB es hacer las inserciones directamente a una tabla InnoDB. Esto es, utilizar ALTER TABLE ... ENGINE = INNODB, o crear una tabla InnoDB vacío con definiciones idénticas e insertar las filas con INSERT INTO ... SELECT * FROM ....

3) PostgreSQL búsqueda de texto completo , Esfinge motor parece que lo haga por MySQL

X veces es más fácil de optimizar todo el servidor (configuración de la memoria, cachés, índices) cuando se tiene un solo motor utilizado. Mezcla myisam con innodb en grandes bases de datos siempre habrá pegado en algún momento forzada por algunos comprosise tanto para el motor al trabajo bueno (pero no excelente:)

Te recomiendo que el interés en algunos motores de búsqueda de texto completo dedicados como esfinge , Lucene ( Solr ) y deshacerse de él de la capa de base de datos

Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top