如何在bash脚本中捕获mysqldump错误?

时间:2018-09-06 19:34:06

标签: mysql bash gzip

mysqldump --verbose -h $dbhost --max_allowed_packet=1G --extended- 
insert --single-transaction --add-drop-database --opt $dbname -- 
user=$dbusername --password=$dbpassword | gzip -1 > $filename.sql.gz
echo $?

我在bash脚本中使用上面的代码进行mysql转储并将其gzip化。

我想在允许脚本继续运行之前确认mysqldump是否成功。如果例如找不到主机,我该如何捕获该错误?

我不确定如何实现这一目标。我上面得到的电流输出如下:

mysqldump: Got error: 2005: Unknown MySQL server host 'test' (0) when
trying to connect 
0

为什么找不到主机时我获得0成功代码?我认为这是因为gzip仍然成功,因为它会生成一个空文件...但是我不知道该如何解决。

2 个答案:

答案 0 :(得分:2)

使用管道(|)时,仅捕获管道的最后一条命令的退出值。但是我们可以使用set -o pipefail解决此问题。这会捕获管道中的非零退出代码

始终像这样使您的schell脚本

#!/bin/bash
set -o pipefail

示例:

C02MLC76FD57:~ vkrishna$ cat testing.sh
#!/bin/bash
set -o pipefail
false | echo "hello world"
echo $?

C02MLC76FD57:~ vkrishna$ ./testing.sh
hello world
1

false的退出状态始终为1。

(或)

您还可以按以下方式使用PIPESTATUS

$ false | true
$ echo "${PIPESTATUS[0]} ${PIPESTATUS[1]}"
1 0

我更喜欢在shell脚本中使用set -o pipefail

关于捕获错误,在执行脚本时将stderr重定向到文件以捕获实际错误。

示例: 文件名为backup.sh

./backup.sh 2>/tmp/backupError.log

这样,如果备份有效,则一切正常,如果备份失败,我们将捕获错误。

答案 1 :(得分:1)

你的意思是这样吗

 #!/bin/bash
    mysqldump --verbose -h $dbhost --max_allowed_packet=1G --extended- 
insert --single-transaction --add-drop-database --opt $dbname -- 
user=$dbusername --password=$dbpassword | gzip -1 > $filename.sql.gz
    if [ "$?" -eq 0 ]; then
        echo "mysqldump command Successful"    
    else
        echo "mysqldump encountered an Error"
    fi

您可以执行以下操作检查mysql错误并继续进行gzip压缩

#!/bin/bash
mysqldump --verbose -h $dbhost --max_allowed_packet=1G --extended- 
    insert --single-transaction --add-drop-database --opt $dbname -- 
    user=$dbusername --password=$dbpassword > db.dump
if [[ $? -eq 0 ]]; then
    gzip db.dump
else 
    echo >&2 "DB backup failed" 
    exit 1
fi