mysqldump에 오류가 없을 때만 gzip을 사용하는 방법은 무엇입니까?

mysqldump에 오류가 없을 때만 gzip을 사용하는 방법은 무엇입니까?

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/bashor 등으로 시작함 ).#!/bin/ksh#!/bin/shpipefail일부가 실패하면 파이프라인이 실패하도록 하는 옵션입니다. (기본적으로 파이프라인의 상태는 가장 오른쪽 명령의 상태이며, 다른 명령의 상태는 무시됩니다.)

#!/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

관련 정보