
У меня есть база данных mysql на общем веб-хостинге. Она стала слишком большой, и один процесс дампа с zip-архивированием останавливается. Я хочу дампить и zip-архивировать каждую таблицу по отдельности. С помощью этой команды
mysqldump -uuser -ppass database < show_tables.sql
Я могу заставить его вернуть все имена таблиц следующим образом:
table1
table2
etc
...
Как мне передать это в скрипт bash, чтобы можно было передать каждую строку в команду с таким синтаксисом?
mysqldump -uuser -ppass database table_name_goes_here > and_here.sql
?
РедактироватьИзвините, ребята, я допустил ошибку в исходном форматировании. Вывод запроса show tables
— это не одна строка с именами таблиц, разделенными пробелами; на самом деле это одно имя таблицы на строку, как это отформатировано сейчас. Приношу извинения за путаницу.
решение1
mysqldump -uuser -ppass database < show_tables.sql |
xargs -I TableName sh -c 'mysqldump -uuser -ppass database TableName > TableName.sql'
решение2
Предполагая, что имена таблиц не могут содержать символы новой строки,
mysqldump -uuser -ppass database < show_tables.sql |
while IFS= read -r table; do
mysqldump -uuser -ppass database "$table" > and_here.sql
done
решение3
Theруководствоговорит
Arrays are assigned to using compound assignments of the form name=(value1 ... valuen),
поэтому вам просто нужен способ поместить вывод вашей команды туда, где она указана value1 ... valuen
.
Вы можете сделать это вот так
databases=( $(mysqldump -uuser -ppass database < show_tables.sql) )
и затем перебрать их вот так
for database in ${databases[*]}; do
...
done
но на всякий случай, если имя вашей таблицы действительно странное и содержит несколько новых строк, я бы рекомендовал использовать mysql -Bse
для перечисления баз данных и/или таблиц, и использовать while read IFS=
так, как предлагает jw013 (возможно, без этой -r
опции).
решение4
mysql database -e 'show tables' | while read table
do mysqldump -uuser -ppass database "$table" -r "$table.sql"
done
Работает также с пробелами в таблицах.