2011-01-02 41 views
11

Utilizamos tablas de MySQL a las que agregamos nuevos campos de vez en cuando a medida que nuestro producto evoluciona. Estoy buscando una forma de exportar la estructura de la tabla de una copia de la base de datos a otra, sin borrar el contenido de la tabla a la que estoy importando.¿Puedo importar una estructura actualizada en una tabla MySQL sin perder su contenido actual?

Por ejemplo, decir que tengo copias A y B de una tabla, y añado los campos X, Y, Z a la tabla A. ¿Hay alguna manera de copiar la estructura modificada (campos X, Y, Z) en la tabla B mientras mantiene su contenido intacto?

Intenté usar mysqldump, pero parece que solo puedo copiar toda la tabla con su contenido, anulando la anterior, o puedo usar la marca "-d" para evitar copiar datos (estructura de dumping solamente), pero esto creará una tabla vacía cuando se importe, anulando nuevamente los datos antiguos.

¿Hay alguna manera de hacer lo que necesito con mysqldump, o alguna otra herramienta?

Respuesta

3

Lo que suelo hacer es almacenar todas y cada una de las declaraciones ALTER TABLE ejecutadas en la (s) tabla (s) de desarrollo, y aplicarlas a la (s) tabla (s) de destino cuando sea necesario.

Existen formas más sofisticadas de hacerlo (como las herramientas de comparación de estructuras, etc.), pero creo que esta práctica funciona bien. Hacer esto paso por paso paso a paso también ayuda a prevenir la alteración accidental o la destrucción de datos por cambios estructurales que cambian el tipo de campo o la longitud máxima.

+1

¿Cómo se puede hacer un script automático para hacerlo? –

+0

@Jack ¿Qué quiere decir con "script automático" exactamente, usando qué plataforma? –

+1

usando MySql. Script genérico que volca la estructura en el desarrollo y luego se importa en producción, sin sobrescribir los datos en la producción, pero solo aplica cambios de estructura desde el desarrollo. –

0

para su caso, puede que solo tenga que realizar una actualización

alter table B add column x varchar(255); 
alter table B add column y varchar(255); 
alter table B add column z varchar(255); 

update A,B 
set 
    B.x=A.x, 
    B.y=A.y, 
    B.z=A.z 
where A.id=B.id; <-- a key that exist on both tables 
0

No es una forma práctica de hacer esto, pero necesita un poco de edición de bits en un editor de texto: Esto toma sobre Max 10 Min en Gedit En Linux !!


de exportación que la mesa & Guardar en: localTable.sql

abrirlo en una edior texto (Gedit) Usted verá algo como esto:

CREATE TABLE IF NOT EXISTS `localTable` (
    `id` int(8) NOT NULL AUTO_INCREMENT, 
    `date` int(10) NOT NULL, 
    # Lot more Fields ..... 
    #Other Fields Here 

Después Basta con retirar :

  • Cualquier cosa después del cierre) parenthe SE
  • CREAR TABLA SI NO EXISTE localTable (
  • cambiar todas las , a ; en cada línea como que se ejecuta todo esto una vez (, \ na; \ n)
  • eliminar toda la clave ADDPRIMARY (id); ADDKEY created_by (created_by)!
  • y simplemente seguir campos está interesado en

Tendrá esta

`id` int(8) NOT NULL AUTO_INCREMENT, 
    `date` int(10) NOT NULL, 
    # Lot more Fields ..... 
    #Other Fields Here 

Añadir al comienzo de cada línea ALTER TABLE localTable AÑADIR

ALTER TABLE `localTable` ADD `id` int(8) NOT NULL AUTO_INCREMENT, 
ALTER TABLE `localTable` ADD `date` int(10) NOT NULL, 
    ALTER TABLE `localTable` ADD #to each more Fields ..... 
    #Other Fields Here 

Eso es todo podemos hacer esto ab Script automatizado agregando un script de Shell para hacer este trabajo.

Después de que sabe lo que tiene que hacer la importación en la 'remoteTable';)

Gracias

0

sólo tenía el mismo problema y lo resolvió de esta manera:

exportar la estructura de la tabla para actualizar Exportar la estructura de la tabla de desarrollo.

ejecutar este código para el primer archivo "update.sql" debe ser cambiado de acuerdo con su nombre de archivo exportado.

cat update.sql|awk -F/'{ 
if(match($0, "CREATE TABLE")) { 
    { FS = "`" } ; table = $2 
} else { 
    if(match($0," `")) { 
    gsub(",",";",$0) 
    print "ALTER TABLE `" table "` ADD" $0 
    } 
} 
}' > update_alter.sql 

ejecutar el mismo comando para el segundo archivo

cat development.sql|awk -F/'{ 
if(match($0, "CREATE TABLE")) { 
    { FS = "`" } ; table = $2 
} else { 
    if(match($0," `")) { 
    gsub(",",";",$0) 
    print "ALTER TABLE `" table "` ADD" $0 
    } 
} 
}' > development_alter.sql 

Ejecutar este comando para buscar las diferencias en los archivos de salida

diff --changed-group-format='%<' --unchanged-group-format='' development_alter.sql update_alter.sql > update_db.sql 

En el archivo update_db.sql ahora habrá el código que estás buscando

0

No, no es posible porque MySql está utilizando la versión de mariaDB. En la versión de mariaDB, la estructura de una tabla se organiza en la memoria y esa memoria se comparte con los datos de su byte. Entonces, cuando tratamos de importar una estructura (o una tabla), se altera ese bloque de memoria completo.

Cuestiones relacionadas