2011-01-20 66 views
8

He estado trabajando en mi base de datos de desarrollo y he ajustado su rendimiento.MySql, ¿cómo puedo exportar índices desde mi base de datos de desarrollo a mi base de datos de producción?

Sin embargo, para mi sorpresa no puedo encontrar una forma de exportar los índices a mi base de datos de producción.

Pensé que habría una manera fácil de hacer esto. No quiero reemplazar los datos en mi base de datos de producción.

El problema principal es que no puedo ver la clasificación en los índices, por lo que será difícil incluso hacerlo manualmente.

Respuesta

10

Quizás te refieres a "¿Cómo puedo volver a crear mis índices de desarrollo en mi base de datos en vivo (existente)"?

Si es así, creo que los comandos SQL que está buscando son;

SHOW CREATE TABLE {tablename};

ALTER TABLE ADD ÍNDICE {index_name} (col1, col2)

ALTER TABLE DROP INDEX {index_name}

Puede copiar la "llave" y filas "sometimiento" de "SHOW CREATE TABLE" de salida y vuelva a colocarlo en el "ÍNDICE DE ALTER TABLE ADD".

dev mysql> SHOW CREATE TABLE city; 
CREATE TABLE `city` (
    `id` smallint(4) unsigned NOT NULL auto_increment, 
    `city` varchar(50) character set utf8 collate utf8_bin NOT NULL default '', 
    `region_id` smallint(4) unsigned NOT NULL default '0', 
    PRIMARY KEY (`id`), 
    KEY `region_idx` (region_id), 
    CONSTRAINT `city_ibfk_1` FOREIGN KEY (`region_id`) REFERENCES `region` (`id`) ON UPDATE CASCADE ON DELETE RESTRICT 
) ENGINE=InnoDB; 

live mysql> SHOW CREATE TABLE city; 
CREATE TABLE `city` (
    `id` smallint(4) unsigned NOT NULL auto_increment, 
    `city` varchar(50) character set utf8 collate utf8_bin NOT NULL default '', 
    `region_id` smallint(4) unsigned NOT NULL default '0', 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB; 

live mysql> ALTER TABLE `city` ADD KEY `region_idx` (region_id); 
live mysql> ALTER TABLE `city` ADD CONSTRAINT `city_ibfk_1` FOREIGN KEY (`region_id`) REFERENCES `region` (`id`) ON UPDATE CASCADE ON DELETE RESTRICT; 

Hope this helps!

3

Primero, lea el tutorial aquí sobre how-to Export MySQL Indexes using a SQL query. Además:

  1. Si lo hace vaciado total de la base de datos e importar a otro (usando phpMyAdmin, etc), los índices tienen que ser regenerados.

  2. Si es posible, puede copiar el contenido de toda su carpeta de base de datos MySQL a la base de datos de producción. Esto hará el truco también, rápidamente. Read more here at MySQL docs.

1

puede utilizar el siguiente comando para tomar un volcado

mysqldump -u [USERNAME] -p [DBNAME] | gzip > [/path_to_file/DBNAME].sql.gz 

y los índices se copiarán automáticamente.

1

Creo que estás tratando de exportar los índices por sí mismos y no solo el código para regenerarlos en producción, ¿no? (Estoy asumiendo esto porque la carga de generar estos índices no es favorable en la mayoría de los entornos de producción).

La utilidad mysqldump es útil si el rendimiento no es su principal preocupación, y lo uso todo el tiempo. Sin embargo, si está buscando un método muy rápido, le sugiero que copie los archivos InnoDB reales de una base de datos fría a la otra (suponiendo que sean exactamente la misma versión de MySQL con exactamente la misma configuración y exactamente el mismo esperado). comportamiento, etc.). Este método es peligroso si hay diferencias entre los sistemas.

Parece que, en su caso, es posible que desee copiar primero los datos correctos en su entorno de prueba.Mi ciclo de desarrollo generalmente sigue este enfoque: DDL fluye desde la prueba hasta la producción a través de la programación, y el DML fluye desde la producción hasta la prueba a través del uso real del sistema.

+3

proporcione respuestas en vez de suposiciones, este pertenece a los comentarios. – Tom

1

También tengo servidores de desarrollo y producción con la misma estructura de base de datos.

Modifiqué índices en ambos, así que quería fusionarlos todos. Así que necesitaba comparar datos con Notepad +.

Aquí es cómo exportar índices para todas las tablas, todas las bases de datos y cómo se filtra y compara ellas:

--- Single table: 
    SHOW INDEX FROM mydb.mytable; 
    SHOW INDEX FROM mytable; 

--- Multi tables, databases: 
    USE information_schema; 
    SELECT * FROM `statistics` ORDER BY TABLE_SCHEMA ASC, TABLE_NAME ASC, INDEX_NAME ASC; 

Ahora, phpMyAdmin -> Exportar a CSV-Excel:

agrega una fila de cabecera -> eliminar todas las columnas pero dejar "database_name table_name index column value"

Luego, filtrar por base de datos.

Copie todo desde la base de datos 1 a un bloc de notas + pantalla 1, filtre la base de datos de Excel2, copie todo en el bloc de notas + pantalla 2 -> COMPARAR!

0

Extendiendo la respuesta de @origo. Hay un caso en el que necesitaba extraer el DDL para un conjunto de índices. Este script hace el trabajo.

fuente: https://rogerpadilla.wordpress.com/2008/12/02/mysql-export-indexes/

SELECT 
CONCAT(
'ALTER TABLE ' , 
TABLE_NAME, 
' ', 
'ADD ', 
IF(NON_UNIQUE = 1, 
CASE UPPER(INDEX_TYPE) 
WHEN 'FULLTEXT' THEN 'FULLTEXT INDEX' 
WHEN 'SPATIAL' THEN 'SPATIAL INDEX' 
ELSE CONCAT('INDEX ', 
INDEX_NAME, 
' USING ', 
INDEX_TYPE 
) 
END, 
IF(UPPER(INDEX_NAME) = 'PRIMARY', 
CONCAT('PRIMARY KEY USING ', 
INDEX_TYPE 
), 
CONCAT('UNIQUE INDEX ', 
INDEX_NAME, 
' USING ', 
INDEX_TYPE 
) 
) 
), 
'(', 
GROUP_CONCAT(
DISTINCT 
CONCAT('', COLUMN_NAME, '') 
ORDER BY SEQ_IN_INDEX ASC 
SEPARATOR ', ' 
), 
');' 
) AS 'Show_Add_Indexes' 
FROM information_schema.STATISTICS 
WHERE TABLE_SCHEMA = 'PLEASE CHANGE HERE' 
GROUP BY TABLE_NAME, INDEX_NAME 
ORDER BY TABLE_NAME ASC, INDEX_NAME ASC; 
Cuestiones relacionadas