mysqldump -uuser -ppass database < show_tables.sql |
xargs -I TableName sh -c 'mysqldump -uuser -ppass database TableName > TableName.sql'
Eu tenho um banco de dados mysql em um host compartilhado. Ele cresceu demais e um único processo de despejo com compactação está sendo eliminado. Eu quero despejar e zipar cada tabela individualmente. Com este comando
mysqldump -uuser -ppass database < show_tables.sql
Eu posso obtê-lo para retornar todos os nomes das tabelas da seguinte forma:
table1
table2
etc
...
Como posso alimentar isso em um script bash para que eu possa alimentar cada linha em um comando dessa sintaxe
mysqldump -uuser -ppass database table_name_goes_here > and_here.sql
?
Editar Desculpe pessoal, eu cometi um erro na formatação original. A saída da consulta show tables
não é uma única linha com nomes de tabela delimitados por espaço; Na verdade, é um nome de tabela por linha, como está formatado agora. Peço desculpas pela confusão.
Supondo que os nomes das tabelas não podem conter novas linhas,
mysqldump -uuser -ppass database < show_tables.sql |
while IFS= read -r table; do
mysqldump -uuser -ppass database "$table" > and_here.sql
done
O manual diz
Arrays are assigned to using compound assignments of the form name=(value1 ... valuen),
então você só precisa de uma maneira de colocar a saída do seu comando, onde diz value1 ... valuen
.
Você pode fazer isso assim
databases=( $(mysqldump -uuser -ppass database < show_tables.sql) )
e, em seguida, iterar sobre eles assim
for database in ${databases[*]}; do
...
done
mas caso o nome da sua tabela seja realmente estranho e contenha algumas novas linhas, recomendo usar mysql -Bse
para listar os bancos de dados e / ou tabelas e usar while read IFS=
como o jw013 sugere (possivelmente sem o -r
opção).
mysql database -e 'show tables' | while read table
do mysqldump -uuser -ppass database "$table" -r "$table.sql"
done
Funciona com espaços nas tabelas também.
Tags bash