
我在共享網站主機上有一個 mysql 資料庫。它變得太大了,並且帶有壓縮的單一轉儲進程被終止。我想單獨轉儲和壓縮每個表。用這個命令
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
這手動的說
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
也適用於表格中的空格。