
共有ウェブホストに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 行ではありません。現在のフォーマットでは、実際には 1 行に 1 つのテーブル名です。混乱を招いてしまい申し訳ありません。
答え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
テーブル内のスペースでも機能します。