mysqldump ignora la tabla con comodín

8

Necesito hacer un volcado de una base de datos que contiene 50 tablas impares de las cuales quiero excluir aproximadamente 15 impares que tienen prefijo exam_

Lo intenté mysqldump --ignore-table=dbname.exam_* e incluso lo intenté --ignore-table=dbname.exam_% No funcionó como se esperaba. Tuve que usar --ignore-tablevarias veces.

Editar: He visto algunos scripts de shell que enumeran tables not like tablename_%y se lo pasan mysqldump.

Sin embargo, me gustaría saber si hay una opción en mysqldump o mysql, como tal para hacer lo mismo sin tener que escribirlo.

Editar-agregar: Eventualmente usé un script para volcar DB excluyendo tablas, usando ignore-table=varias veces.

anup
fuente
¿Puedes publicar el script que usaste? tal vez lo aloje
rubo77
@ rubo77: ya no tengo ese script. Era un guión básico. Usando el comando mysql obtuve una lista de tablas que quería excluir. Codifica la lista a un script BASH para producir un volcado cuando sea necesario. Afortunadamente para mí, la lista fue constante. Alternativamente, una solución publicada aquí puede ser útil con respecto a las secuencias de comandos.
hasta el
Mejor aún: TABLES=`mysql --skip-column-names [DB-NAME] -e 'show tables' | grep -v 'exam_'` mysqldump [DB-NAME] $TABLES > mysqldump.sql
hasta el

Respuestas:

13

No, no hay una opción como esa en el mysqldumpcomando, como dicen los documentos :

--ignore-table = db_name.tbl_name

No volcar la tabla dada, que debe especificarse utilizando tanto la
base de datos como los nombres de las tablas. Para ignorar varias tablas, use esta opción
varias veces. Esta opción también se puede usar para ignorar las vistas.

NickW
fuente
Por otro lado, podría valer la pena crear un usuario de volcado de mysql que no tenga acceso a esas tablas, y luego intentarlo mysqldump --all-databasessolo para ver si se produce un error o simplemente salta al siguiente dDB ...
NickW
No lo he probado, pero suena bien. En cuanto a la solución, escribí un script de shell para evitar las tablas.
Anup
@NickW Eso podría funcionar. Pero si desea más flexibilidad, necesitaría hacer una consulta por separado para obtener los nombres de las tablas. Vea mi respuesta a continuación.
Buttle Butkus
Versión rápida y sucia: engañar a la base de datos. use la interfaz web de phpMyAdmin para soltar fácilmente las tablas que no desea ver. luego volcar y no se necesita comodín. si desea la ejecución de la CLI y no le importa un tercer paso sitepoint.com/community/t/drop-tables-with-wildcard/18537/4
TheSatinKnight
3

Puede obtener los nombres de tabla que desea de mysql y luego usarlos para construir sus parámetros de volcado de mysql.

En el ejemplo a continuación, simplemente reemplace "algún prefijo" con su prefijo (por ejemplo, "examen_").

La SHOW TABLESconsulta se puede modificar para buscar otros conjuntos de tablas. O podría usar una consulta en la INFORMATION_SCHEMAtabla para usar aún más criterios.

#/bin/bash

#this could be improved but it works
read -p "Mysql username and password" user pass

#specify your database, e.g. "mydb"
DB="mydb"

SQL_STRING='SHOW TABLES LIKE "someprefix%";'
DBS=$(echo $SQL_STRING | mysql -u $user -p$pass -Bs --database=$DB )

#next two lines untested, but intended to add a second excluded table prefix
#ANOTHER_SQL_STRING='SHOW TABLES LIKE "otherprefix%";'
#DBS="$DBS""\n"$(echo $ANOTHER_SQL_STRING | mysql -u $user -p$pass -Bs --database=$DB )

#-B is for batch - tab-separated columns, newlines between rows
#-s is for silent - produce less output
#both result in escaping special characters

#but the following might not work if you have special characters in your table names
IFS=$'\n' read -r -a TABLES <<< $DBS

IGNORE="--ignore_table="$DB"."
IGNORE_TABLES=""

for table in $TABLES; do
        IGNORE_TABLES=$IGNORE_TABLES" --ignore_table="$DB"."$table
done

#Now you have a string in $IGNORE_TABLES like this: "--ignore_table=someprefix1 --ignore_table=someprefix2 ..."

mysqldump $DB --routines -u $user -p$pass $IGNORE_TABLES > specialdump.sql

Esto se creó con la ayuda de esta respuesta sobre cómo obtener "todas las tablas con exclusión en bash": https://stackoverflow.com/a/9232076/631764

y esta respuesta sobre omitir tablas con algo de bash usado: https://stackoverflow.com/a/425172/631764

Buttle Butkus
fuente
Basado en la respuesta seleccionada, escribí un guión similar a tu respuesta. Gracias por poner esto. Editar: acabo de recordar que usé dos comandos con el patrón de exclusión pipe y grep.
hasta el
0

Creo que usar el information_schemaes una buena ruta para tomar esto.

select group_concat(concat('--ignore-table=', TABLE_SCHEMA, '.', table_name) SEPARATOR ' ') 
from information_schema.tables 
where TABLE_SCHEMA = 'Actual_DB_NAME' and TABLE_NAME like 'Actual_TABLE_NAME%';
usuario3783243
fuente