
Tengo una base de datos MySQL en un servidor web compartido. Ha crecido demasiado y se está eliminando un único proceso de volcado con compresión. Quiero volcar y comprimir cada tabla individualmente. con este comando
mysqldump -uuser -ppass database < show_tables.sql
Puedo hacer que devuelva todos los nombres de las tablas de esta manera:
table1
table2
etc
...
¿Cómo puedo introducir esto en un script bash para poder introducir cada línea en un comando de esta sintaxis?
mysqldump -uuser -ppass database table_name_goes_here > and_here.sql
?
EditarLo siento amigos, cometí un error en el formato original. El resultado de la show tables
consulta no es una sola línea con nombres de tablas delimitados por espacios; en realidad es un nombre de tabla por línea, tal como está formateado ahora. Me disculpo por la confusión.
Respuesta1
mysqldump -uuser -ppass database < show_tables.sql |
xargs -I TableName sh -c 'mysqldump -uuser -ppass database TableName > TableName.sql'
Respuesta2
Suponiendo que los nombres de las tablas no pueden contener nuevas líneas,
mysqldump -uuser -ppass database < show_tables.sql |
while IFS= read -r table; do
mysqldump -uuser -ppass database "$table" > and_here.sql
done
Respuesta3
Elmanualdice
Arrays are assigned to using compound assignments of the form name=(value1 ... valuen),
entonces solo necesitas una manera de poner la salida de tu comando donde dice value1 ... valuen
.
Puedes hacerlo así
databases=( $(mysqldump -uuser -ppass database < show_tables.sql) )
y luego iterar sobre ellos así
for database in ${databases[*]}; do
...
done
pero en caso de que el nombre de su tabla sea realmente extraño y contenga algunas líneas nuevas, recomendaría usarlo mysql -Bse
para enumerar las bases de datos y/o tablas, y usarlo while read IFS=
como sugiere jw013 (posiblemente sin la -r
opción).
Respuesta4
mysql database -e 'show tables' | while read table
do mysqldump -uuser -ppass database "$table" -r "$table.sql"
done
También funciona con espacios en las tablas.