¿Mysqldump solo tablas con ciertos prefijos / comodines Mysqldump?

83

Tengo una enorme y desordenada base de datos que estoy limpiando. Alberga más de 500 tablas, que es el resultado de combinar Magento Enterprise con Joomla en una sola base de datos.

Para empeorar las cosas, hay un conjunto de más de 70 tablas Joomla que no están en uso en absoluto. Todos estos tienen el prefijo bak_.

Simplemente eliminar estas bak_tablas será fácil, pero primero quiero "respaldarlas" (¿ves lo que hice allí?). En mi mente puedo imaginar un comando como este:

mysqldump -u username -p mydatabase bak_*

Pero esto no funciona. Cuál sería la mejor forma de hacer esto? ¡Gracias!

EDITAR: Sí, podría enumerar explícitamente las 70 tablas para incluir, o las ~ 430 tablas para excluir, pero estoy buscando una mejor manera de hacer esto, si es posible.

thaddeusmt
fuente
la respuesta es seleccionar esa tabla por consulta y pasar esa consulta con mysqldump porque mysqldump no admite la expresión regular gracias, buena suerte
Daric
1
Creo que la respuesta a su pregunta está aquí: stackoverflow.com/questions/2949330/…
raghu
La respuesta dada por @minaz es claramente mejor que la respuesta actualmente marcada como mejor. Ayudaría a marcar ese como mejor, si está de acuerdo, por supuesto.
Dan Dascalescu

Respuestas:

119

Puede especificar los nombres de las tablas en la línea de comandos uno tras otro, pero sin comodines. mysqldump databasename table1 table2 table3

También puede usar --ignore-tablesi eso fuera más corto.

Otra idea es poner las tablas en un archivo con algo como

mysql -N information_schema -e "select table_name from tables where table_schema = 'databasename' and table_name like 'bak_%'" > tables.txt 

Edite el archivo y obtenga todas las bases de datos en una línea. Entonces hazlo

mysqldump dbname `cat tables.txt` > dump_file.sql

Para colocar tablas en una línea (no recomendado) puede hacer lo siguiente

mysql -NB  information_schema -e "select table_name from tables where table_name like 'bak_%'" | xargs -I"{}" mysql dbname -e "DROP TABLE {}"
sreimer
fuente
4
Pero de cualquier manera, tendré que enumerar 70 tablas para ignorar o 430 tablas para incluir. Esto es lo que intento evitar. Debería haber sido más claro en mi pregunta, pero gracias por la respuesta. Esto funcionaría, sí;)
thaddeusmt
1
Otra idea es colocar las tablas en un archivo con algo como mysql -N information_schema -e "select table_name from tables where table_name like 'bak_%'"" > tables.txtEditar el archivo y obtener todas las bases de datos en una línea. Entonces hazlomysqldump dbname `cat tables.txt`
sreimer
Terminé descartando las tablas bak_, pero todavía lo usé para obtener la lista de tablas. Luego los miré boquiabiertos junto con comas para crear una gran declaración DROP TABLE gawk '{print $1"," }' tables.txt > baktables.sql. ¡Gracias!
thaddeusmt
¿Alguna forma de hacer esto en una sola línea? es decir, sin utilizar un archivo temporal como intermediario?
Tom Auger
3
Esto lo haríamysql -NB information_schema -e "select table_name from tables where table_name like 'bak_%'" | xargs -I"{}" mysql test -e "DROP TABLE {}"
sreimer
59

He aquí una forma sencilla:

mysql [dbname] -u [username] -p[password] -N -e 'show tables like "bak\_%"' | xargs mysqldump [dbname] -u [username] -p[password] > [dump_file]
minaz
fuente
4
debería ser show tables like "<prefix>\_%"porque _también es un comodín y debe escaparse ... de lo contrario, podría tener un problema con las tablas que tienen el mismo prefijo-prefijo como bak_ y bak2_ ambos coincidiríanbak_%
reox
5
Puede pasar -N a mysqly no necesitará ejecutar el greppara filtrar la Tables_infila.
Dan Dascalescu
1
Funcionó para mí pero con mysql -NB.
wesamly
Si show tables like "bak\_%"no devuelve nada, se vuelca toda la base de datos. ¿Alguna manera de prevenir esto?
Seb33300
56

Mi favorito:

mysqldump DBNAME $(mysql -D DBNAME -Bse "show tables like 'wp\_%'") > FILENAME.sql

Todas las respuestas adoptan casi el mismo enfoque, pero esta es la sintaxis más concisa.

Stephen M. Harris
fuente
11
para aquellos que son curiosos, estos indicadores son -B batch -e execute -s silent mode (menos salida) dev.mysql.com/doc/refman/5.6/en/mysql-command-options.html
jsh
Me encanta esto. ¡He vuelto aquí muchas veces para agarrar este fragmento!
Jason Galuten
Ligero error: es posible que deba completar los parámetros de nombre de usuario y contraseña, tanto para los comandos mysqldump como para mysql. Y si la llamada a mysql falla, mysqldump por defecto vierte toda la base de datos, lo que podría ser enorme, especialmente en los casos en los que estás dispuesto a volcar solo un subconjunto de los datos.
gwideman
esto no funcionamysql -u "$MYSQL_USER_NAME" -h host -p"$MYSQL_PASSWORD" -N -e 'show databases like "auth\_%"' | xargs mysqldump -u "$MYSQL_USER_NAME" -h host -p"$MYSQL_PASSWORD" > test
cloudbud
2

Otro delineador para extraer el nombre de la lista de tablas mysql -sN …y luego usar cada elemento en un bucle de shell "for ... in ..." para eliminarlos:

for f in `mysql dbname -sN -e "SHOW TABLES LIKE 'bak\_%' "` ; do mysql dbname -rsN -e "DROP TABLE $f"; done

o (versión ampliada)

for f in `mysql dbname -sN -e "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname' AND TABLE_NAME LIKE 'bak\_%' "` ; do mysql dbname -rsN -e "DROP TABLE $f"; done

O use "group_concat" para concatenar * nombres de tablas, si son lo suficientemente cortos:

tables=`mysql dbname -srN -e "SELECT GROUP_CONCAT(TABLE_NAME SEPARATOR ',') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname'  AND TABLE_NAME LIKE 'bak\_%' "`; mysql dbname -rsN -e "DROP TABLE $tables"

* algunos límites como el valor de "group_concat_max_len" (normalmente es igual a 1024, consulte sus 70 tablas) pueden interferir.


Mismo principio, pero para volcar todas las tablas excepto las que comienzan con "bak_":

for f in `mysql dbname -sN -e "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname' AND NOT(TABLE_NAME LIKE 'bak\_%') "` ; do mysqldump -u [u] -p dbname "$f" >> dump_dbname.sql; done
eleg
fuente
2

Ya hay muchas buenas respuestas, pero vine aquí con tal variación:

mysql MY_DATABASE -N -u MY_MYSQLUSER -p -e 'show tables like "%MY_LIKE_CODE%";' |
xargs mysqldump MY_DATABASE -u MY_MYSQLUSER -p |
gzip > ~/backup/`date +%Y%m%d:::%H:%M:%S-MY_DAMP.sql.gz`

Con esta acción hice un volcado de tabla por la máscara como% mask% de la base de datos a un solo archivo. Con suerte, alguien lo encontrará útil.

Andrinux
fuente
2

A partir de MySQL 5.7, la mysqlpumpherramienta admite el filtrado de nombres de tablas con patrones.

Tenga en cuenta que es una herramienta a medio hacer, por lo que debe asegurarse de que admita las funcionalidades requeridas y de que las realice correctamente (por ejemplo, a partir de MySQL 5.7.12, la exportación de disparadores no funciona).

Marcus
fuente
3
Resulta que "mysqlpump" no es un error tipográfico. dev.mysql.com/doc/refman/5.7/en/mysqlpump.html . Sí, la opción --include-tables abc% permite especificar tablas para volcar usando un comodín. Pero parece que no hay forma de que mysqlpump excluya las vistas. Sí, bastante a medio cocinar.
gwideman
1

Sobre la base de algunas de las otras buenas respuestas aquí, creé un script de shell para hacer esto aún más fácil. Este script genera 3 archivos en la salida: uno con la estructura de todas las tablas, uno con los datos de todas las tablas no excluidas y otro con los datos de todas las tablas "excluidas" (podría comentar esto si realmente no lo hace) no lo necesito). Entonces puede usar cuál (s) necesita.

#!/bin/bash

echo -n "DB Password: "
read -s PASSWORD

HOST=yourhostname.com
USER=youruser
DATABASE=yourdatabase

MAIN_TABLES=$(mysql -h $HOST -u $USER -p$PASSWORD -D $DATABASE -Bse "SHOW TABLES WHERE Tables_in_dashboard NOT LIKE 'bigtable_%';")
STATS_TABLES=$(mysql -h $HOST -u $USER -p$PASSWORD -D $DATABASE -Bse "SHOW TABLES LIKE 'bigtable_%';")

echo "Dumping structure..."
mysqldump -h $HOST -u $USER -p$PASSWORD $DATABASE --no-data | gzip > structure.sql.gz

echo "Dumping main data..."
mysqldump -h $HOST -u $USER -p$PASSWORD $DATABASE --no-create-info $MAIN_TABLES | gzip > data.sql.gz

echo "Dumping big table data..."
mysqldump -h $HOST -u $USER -p$PASSWORD $DATABASE --no-create-info $STATS_TABLES | gzip > big_table_data.sql.gz
dtbarne
fuente
0

Mi solución:

mysqldump -u username -p mydatabase `mysql -B --disable-column-names -u username -p mydatabase -e "SHOW TABLES LIKE 'bak\_%'" | sed ':a;N;$!ba;s/\n/ /g'`
user3453061
fuente
0

mysql DATABASE -u USERNAME -p -e 'muestra tablas como "PREFIX%"' | grep -v Tables_in | xargs mysqldump BASE DE DATOS -u NOMBRE DE USUARIO -p> DUMP.sql

bhrached
fuente