mysqldump가 오류를 생성하지 않는 경우에만 sql 덤프를 압축하고 싶습니다. 잘못된 비밀번호를 입력했지만 여전히 gzip이 실행됩니다.
mysqldump -u username -ppassword dbname |& if [ $? == 0 ]; then gzip > test.gz; else echo "error"; fi
내 명령에 문제가 있습니까? 아니면 더 나은 해결책이 있습니까?
답변1
제거할 수 있다고 생각합니다 |&
(이유는 stdout 또는 stderr을 다음 조건으로 파이프할 필요가 없기 때문입니다. 명령 구분 기호가 있으면 ';'을 사용할 수 있습니다). 아마도 다음과 같이 작동할 것입니다.
#!/bin/bash
mysqldump -u myuser -p mypasswd > mydb.dump
if [[ $? -eq 0 ]]; then
gzip mydb.dump
else
echo >&2 "DB backup failed"
exit 1
fi
편집: gzip이 성공했는지 확인하려면 다음을 수행하십시오.
mysqldump -u myuser -p mypasswd | gzip > mydb.dump.gz && echo "success" || echo "failure"
그러나 mysqldump
이는 실패하더라도 성공을 보고합니다. 즉, gzip으로 디스크를 채우는 것 이외의 대부분의 이유로 백업이 실패한 경우입니다.
답변2
당신은 또한 수
mysqldump -someparams dump.sql && gzip dump.sql || echo "Backup failed"
또는
mysqldump -someparams dump.sql
[[ $? == 0 ]] && gzip dump.sql || echo "Backup failed "
답변3
파이프라인은 양쪽을 병렬로 실행합니다. 이를 수행하려는 방식은 개념적으로 불가능합니다. mysqldump
이 테스트를 실행과 동시에 실행하면 완료될 때까지 명령 상태를 테스트할 수 없습니다 mysqldump
. 을 실행하고 mysqldump
완료될 때까지 기다린 다음그 다음에실행 여부를 결정합니다 gzip
.
mysqldump
실행이 완료되어야 하므로 출력이 어딘가로 이동해야 합니다 . 아마도 압축하기 때문에 출력이 커지기를 원할 것입니다. 그러므로 압축하는 것이 현명합니다. 따라서 출력은 무조건 압축됩니다.
mysqldump -u username -ppassword dbname | gzip > test.gz
|
대신에 를 사용했다는 점에 유의하세요 |&
. 여기서 사용하는 것은 의미가 없습니다 |&
. 오류 메시지가 있으면 결국 덤프와 혼합되어 덤프를 복원할 수 없게 됩니다.
남은 질문은 탐지가 mysqldump
성공했는지 여부입니다. 이것이 bash 또는 ksh 스크립트라고 가정합니다(즉, 가 아닌 #!/bin/bash
or 등으로 시작함 ).#!/bin/ksh
#!/bin/sh
pipefail
일부가 실패하면 파이프라인이 실패하도록 하는 옵션입니다. (기본적으로 파이프라인의 상태는 가장 오른쪽 명령의 상태이며, 다른 명령의 상태는 무시됩니다.)
#!/bin/bash
set -o pipefail -o errexit
tmp="mydump.tmp.$$.gz"
trap 'rm -f "$tmp"' ERR INT TERM HUP
mysqldump … | gzip >"$tmp"
mv "$tmp" mydump.gz
이 errexit
옵션을 설정하면 파이프라인이 실패할 경우 스크립트가 해당 지점에서 종료됩니다(파이프라인과 동일한 오류 상태로). 따라서 mydump.gz
덤프가 성공한 경우에만 이름이 지정된 파일이 생성됩니다. 이 trap
명령은 스크립트가 실패하거나 나열된 신호 중 하나에 의해 종료되면 임시 파일이 삭제되도록 트랩을 설정합니다.
답변4
임시 파일 사용을 피하려는 경우 또 다른 해결 방법은 오류 발생 시 생성된 파일을 삭제하는 것입니다.
( mysqldump ... || rm -f test.gz ) | gzip > test.gz
또는 다음과 같은 명확한 플래그를 원하는 경우:
rm -f test.ok
( mysqldump ... && touch test.ok ) | gzip > test.gz
if [[ $? -eq 0 && -r test.ok ]]; then
echo it worked
else
echo something went wrong
fi