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

标签 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 仍然成功,因为它生成了一个空文件......但我不知道如何解决这个问题。

最佳答案

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

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

关于mysql - 如何在 bash 脚本中捕获 mysqldump 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52211039/

相关文章:

nginx - 如何判断我的服务器是否正在提供 GZipped 内容?

nginx gzip_static 不会自动创建不存在的gz 文件?

java - 如何有效地将未压缩的 InputStream 转换为 gzip 压缩的 InputStream?

c# - Asp.net C# 在数据插入数据库时​​显示捕获错误

android - 如何将来自数据库的日期格式更改为android

bash - 如何在bash中触发多个远程Shell脚本并发运行,然后等待它们完成?

bash - 如何在composer之前使用各自的php版本名称

php - 需要在 mysql 中查询多层次营销

mysql - 获取给定时期 MySQL 查询的可用马厩

bash - 如何使用 bash 用前导零填充文件名