
공유 웹 호스트에 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
테이블의 공백에서도 작동합니다.