2009-11-19 7 views
29

Mi base de datos cuenta con 3 tablas: tabla 1, Tabla2 y cuadro3toda la estructura, pero sólo los datos mysqldump de las tablas seleccionadas en un solo comando

Me gustaría hacer un mysqldump en esta base de datos con las siguientes condiciones:

  • estructura de vaciado por todas las tablas
  • volcado Sólo los datos de la Tabla 1 y Tabla 2, ignorar los datos en la tabla 3

Actualmente, hago esto con 2 declaraciones mysqldump

mysqldump -u user -p -d db > db_structure.sql 
mysqldump -u user -p db --ignore-table=db.table3 > table1_and_table2_data.sql 

importarlos en el mismo orden en que fueron objeto de dumping (estructura, a continuación, los datos de la Tabla 1 y Tabla 2)

¿Hay una manera de combinar esto en un solo comando mysqldump?

+0

que tenían la misma pregunta! ¿Encontraste una forma de hacerlo? –

Respuesta

37

No puede combinarlos en un comando pero puede ejecutar ambos comandos al mismo tiempo y enviarlos al mismo archivo.

mysqldump -u user -p --no-data db > structure.sql; mysqldump -u user -p db table1 table2 >> structure.sql 

para evitar tener que introducir la contraseña dos veces que puede hacer -ppassword (nota la falta de espacio!). También use --no-data en el primer comando o también obtendrá los datos. -d no es necesario cuando estás haciendo solo una base de datos.

+0

¡Gracias por esta respuesta!Sin embargo, me preguntaba si hoy en día todavía es imposible hacer esto de una manera más elegante. –

+0

@ EmilioNicolás No es que yo sepa – Cfreak

0

No creo que pueda hacerlo con un solo comando. Pero definitivamente puede fusionar la salida a un archivo. ¿Por qué no lo envuelve en una secuencia de comandos shell que no siguiente:

mysqldump -u $1 -p$2 -d db > dump.sql && mysqldump -u $1 -p$2 db --ignore-table=db.table3 >> dump.sql 

va a ejecutar este script con dos parámetros: nombre de usuario y contraseña.

6

Dado que es posible que desee conectar la salida a otro comando, como lo hice, en lugar de simplemente redirigir a un archivo y anexarlo en el próximo comando, podría intentar (modificado del ejemplo de stask):

(mysqldump -u $1 -p$2 -d db && mysqldump -u $1 -p$2 db --ignore-table=db.table3) |\ 
your_command 

... en mi caso:

(mysqldump -u $1 -p$2 -d db && mysqldump -u $1 -p$2 db --ignore-table=db.table3) |\ 
gzip -9 > filename.sql.gz 

Encerrar los dos comandos mysqldump paréntesis crea un subnivel cuya salida nos tubería en gzip y luego redirigir que en un archivo.

PD: No he podido combinarlo en una sola invocación mysqldump.

0

En realidad, es bastante simple, usa cláusulas where en las tablas donde no quieres datos y dales una condición siempre falsa. Por ejemplo, los datos de carga en foo y Gah y sólo esquema en barra:

mysqldump -u ... -p... myDatabase foo bar --where='1=2' gah > myfile.sql 

Así que sí se puede hacer esto en una sola línea.

0

Se puede quitar la parte INSERT INTO ...:

mysqldump \ 
    --opt \ 
    -u ${DB_USER} -p${DB_PASS} \ 
    ${DB_NAME} \ 
    | grep -v 'INSERT INTO `table3`' \ 
    | grep -v 'INSERT INTO `table4`' 
Cuestiones relacionadas