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

mu0hgdu0  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(495)

这个问题在这里已经有答案了

管道输出和捕获bash中的出口状态(15个答案)
两年前关门了。

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仍然成功地生成了一个空文件…但是我不知道如何解决这个问题。

dldeef67

dldeef671#

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

我宁愿和你一起去 set -o pipefail 在shell脚本中。

关于捕获错误,在执行脚本时,将stderr重定向到一个文件以捕获实际错误。
示例:文件名为backup.sh

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

这样,如果备份工作正常,一切正常,如果失败,我们捕获错误。

mfpqipee

mfpqipee2#

你是说这样的事吗


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

相关问题