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.
Respuestas:
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-table
si 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
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 {}"
fuente
mysql -N information_schema -e "select table_name from tables where table_name like 'bak_%'"" > tables.txt
Editar el archivo y obtener todas las bases de datos en una línea. Entonces hazlomysqldump dbname `cat tables.txt`
gawk '{print $1"," }' tables.txt > baktables.sql
. ¡Gracias!mysql -NB information_schema -e "select table_name from tables where table_name like 'bak_%'" | xargs -I"{}" mysql test -e "DROP TABLE {}"
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]
fuente
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_%
mysql
y no necesitará ejecutar elgrep
para filtrar laTables_in
fila.show tables like "bak\_%"
no devuelve nada, se vuelca toda la base de datos. ¿Alguna manera de prevenir esto?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.
fuente
mysql -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
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
fuente
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.
fuente
A partir de MySQL 5.7, la
mysqlpump
herramienta 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).
fuente
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
fuente
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'`
fuente
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
fuente