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

How to catch mysqldump error in bash script?

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。

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

我不确定如何实现。我从上面得到的当前输出如下:

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

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

你的意思是这样吗

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

使用管道(|)时,只捕获管道最后一条命令的退出值。但是我们可以通过使用 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

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