usando linhas de saída como uma matriz no bash

3

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.

    
por user394 16.04.2012 / 05:37

4 respostas

2
mysqldump -uuser -ppass database < show_tables.sql |
xargs -I TableName sh -c 'mysqldump -uuser -ppass database TableName > TableName.sql'
    
por 16.04.2012 / 17:17
2

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
    
por 16.04.2012 / 05:43
2

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).

    
por 16.04.2012 / 07:41
0
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.

    
por 17.04.2012 / 05:45

Tags