¿Cómo omitir ciertas tablas de base de datos con mysqldump?
¿Existe alguna manera de restringir ciertas tablas desde el comando mysqldump?
Por ejemplo, usaría la siguiente sintaxis para volcar únicamente table1
y table2
:
mysqldump -u username -p database table1 table2 > database.sql
¿ Pero existe una forma similar de volcar todas las tablas excepto table1
y table2
? No he encontrado nada en la documentación de mysqldump, entonces, ¿la fuerza bruta (especificando todos los nombres de las tablas) es el único camino a seguir?
Puede utilizar la opción --ignore-table . Entonces podrías hacer
mysqldump -u USERNAME -pPASSWORD DATABASE --ignore-table=DATABASE.table1 > database.sql
No hay espacios en blanco después -p
(esto no es un error tipográfico).
Para ignorar varias tablas, utilice esta opción varias veces; está documentado que funciona desde al menos la versión 5.0 .
Si desea una forma alternativa de ignorar varias tablas, puede utilizar un script como este:
#!/bin/bash
PASSWORD=XXXXXX
HOST=XXXXXX
USER=XXXXXX
DATABASE=databasename
DB_FILE=dump.sql
EXCLUDED_TABLES=(
table1
table2
table3
table4
tableN
)
IGNORED_TABLES_STRING=''
for TABLE in "${EXCLUDED_TABLES[@]}"
do :
IGNORED_TABLES_STRING+=" --ignore-table=${DATABASE}.${TABLE}"
done
echo "Dump structure"
mysqldump --host=${HOST} --user=${USER} --password=${PASSWORD} --single-transaction --no-data --routines ${DATABASE} > ${DB_FILE}
echo "Dump content"
mysqldump --host=${HOST} --user=${USER} --password=${PASSWORD} ${DATABASE} --no-create-info --skip-triggers ${IGNORED_TABLES_STRING} >> ${DB_FILE}
Basándome en la respuesta de @ Brian-Fisher y respondiendo los comentarios de algunas de las personas en esta publicación, tengo un montón de tablas enormes (e innecesarias) en mi base de datos, por lo que quería omitir su contenido al copiar, pero mantener la estructura. :
mysqldump -h <host> -u <username> -p <database> --no-data > db.sql
mysqldump -h <host> -u <username> -p <database> --no-create-info --skip-triggers --ignore-table=schema.table1 --ignore-table=schema.table2 >> db.sql
El archivo resultante es estructuralmente sólido, pero los datos descargados ahora son ~500 MB en lugar de 9 GB, mucho mejor para mí. Ahora puedo importar el archivo a otra base de datos para realizar pruebas sin tener que preocuparme por manipular 9 GB de datos o quedarme sin espacio en el disco.
Otro ejemplo para ignorar varias tablas
/usr/bin/mysqldump -uUSER -pPASS --ignore-table={db_test.test1,db_test.test3} db_test> db_test.sql
usar --ignore-table
y crear una serie de tablas, con sintaxis como
--ignore-table={db_test.table1,db_test.table3,db_test.table4}
Extra:
Importar base de datos
# if file is .sql
mysql -uUSER -pPASS db_test < backup_database.sql
# if file is .sql.gz
gzip -dc < backup_database.sql.gz | mysql -uUSER -pPASSWORD db_test
Script simple para ignorar tablas y exportar en .sql.gz para ahorrar espacio
#!/bin/bash
#tables to ignore
_TIGNORE=(
my_database.table1
my_database.table2
my_database.tablex
)
#create text for ignore tables
_TDELIMITED="$(IFS=" "; echo "${_TIGNORE[*]/#/--ignore-table=}")"
#don't forget to include user and password
/usr/bin/mysqldump -uUSER -pPASSWORD --events ${_TDELIMITED} --databases my_database | gzip -v > backup_database.sql.gz
Enlaces con información que te ayudará
- mysqldump y gzip
- mysqldump a un tar.gz
- ¿Cómo cargo un archivo sql.gz en mi base de datos?
Nota: probado en servidor ubuntu con mysql Ver 14.14 Distrib 5.5.55
para múltiples bases de datos:
mysqldump -u user -p --ignore-table=db1.tbl1 --ignore-table=db2.tbl1 --databases db1 db2 ..