
Eu tenho um banco de dados mysql em um host compartilhado. Ele cresceu muito e um único processo de despejo com compactação está sendo interrompido. Quero despejar e compactar cada tabela individualmente. Com este comando
mysqldump -uuser -ppass database < show_tables.sql
Consigo fazer com que ele retorne todos os nomes das tabelas assim:
table1
table2
etc
...
Como posso alimentar isso em um script bash para poder alimentar cada linha em um comando desta sintaxe
mysqldump -uuser -ppass database table_name_goes_here > and_here.sql
?
EditarDesculpe pessoal, cometi um erro na formatação original. A saída da show tables
consulta não é uma única linha com nomes de tabelas delimitados por espaços; na verdade, é um nome de tabela por linha, conforme está formatado agora. Eu peço desculpas pela confusão.
Responder1
mysqldump -uuser -ppass database < show_tables.sql |
xargs -I TableName sh -c 'mysqldump -uuser -ppass database TableName > TableName.sql'
Responder2
Supondo que os nomes das tabelas não possam 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
Responder3
Omanualdiz
Arrays are assigned to using compound assignments of the form name=(value1 ... valuen),
então você só precisa 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 então itere 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 jw013 sugere (possivelmente sem a -r
opção).
Responder4
mysql database -e 'show tables' | while read table
do mysqldump -uuser -ppass database "$table" -r "$table.sql"
done
Também funciona com espaços nas tabelas.