mysql - tabla - restaurar base de datos mariadb
Mysqldump solo tablas con ciertos prefijos/comodines Mysqldump? (8)
Tengo esta gran 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 de Joomla que no están en uso en absoluto. Todos están prefijados con bak_
.
Solo borrar estas tablas bak_
será fácil, pero quiero ''bak'' primero (¿ven 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 hacerlo, si es posible.
A partir de MySQL 5.7, la herramienta mysqlpump
admite el filtrado de nombres de tablas con patrones.
Tenga en cuenta que es una herramienta semienalimentada, por lo que deberá asegurarse de que admita las funcionalidades requeridas, y que lo haga correctamente (por ejemplo, a partir de MySQL 5.7.12, la exportación de desencadenadores está interrumpida).
Aquí hay una manera fácil:
mysql [dbname] -u [username] -p[password] -N -e ''show tables like "bak/_%"'' | xargs mysqldump [dbname] -u [username] -p[password] > [dump_file]
Mi favorito:
mysqldump DBNAME $(mysql -D DBNAME -Bse "show tables like ''wp_%''") > FILENAME.sql
Todas las respuestas tienen casi el mismo enfoque, pero esta es la sintaxis más concisa.
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''`
Otro oneliner para extraer la lista del nombre de las tablas con mysql -sN …
y luego usar cada elemento en un bucle de shell "for ... in ..." para soltarlas:
for f in `mysql dbname -sN -e "SHOW TABLES LIKE ''bak/_%'' "` ; do mysql dbname -rsN -e "DROP TABLE $f"; done
o (versión expandida)
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 cortas:
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" (generalmente igual a 1024, cf las 70 tablas) pueden interferir.
Mismo principio, pero para eliminar 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
Puede especificar nombres de tabla en la línea de comando uno después del otro, pero sin comodines. mysqldump databasename table1 table2 table3
También puede usar --ignore-table
si eso fuera más corto.
Otra idea es colocar las tablas en un archivo con algo así 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 {}"
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 el resultado, uno con la estructura para 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) lo necesito). Entonces puede usar cuál (es) 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
Ya hay muchas buenas respuestas, pero vine aquí con esa 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% desde la base de datos a un único archivo. Con suerte, alguien lo encontrará útil.