bash - 如何确定 bzipped mysqldump 文件是否为空/大小为零?

标签 bash mysql bzip2

我想编写一个bash函数来测试mysqldump命令是否成功。到目前为止我尝试过的是测试转储文件大小是否为零,如下所示:

l_mysqldump= # set your custom mysqldump path here, like /Applications/MAMP/Library/bin/mysqldump

${l_mysqldump:-mysqldump} -u$l_db_user -p$l_db_pass -h $l_db_host $l_db_name > latest-dump.mssql

if [[ -s latest-dump.mssql ]]
then
    echo "Success: not zero size."
else
    echo "Error: zero size."
    exit 1
fi

我决定以这种方式进行测试,而不是测试 mysqldump 命令的退出状态,因为当默认 mysql 服务器关闭时,运行 mysqldump 命令会给出这个错误:

mysqldump: Got error: 2002: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) when trying to connect

即使它抛出此错误,它仍然生成一个 0 字节的 .mssql 文件。另外,无论如何,退出状态都是 0。如果转储失败,脚本必须退出,并且需要通知用户,他们需要指定不同的 mysqldump 二进制文件或激活其服务器。

上面的代码运行良好。但是,我不希望 mysqldump 生成未压缩的转储文件。我想对其进行 bzip,如下所示:

${l_mysqldump:-mysqldump} -u$l_db_user -p$l_db_pass -h $l_db_host $l_db_name | bzip2 -c > latest-dump.mssql.bz2

问题是,这破坏了我的 [-s] bash 测试,因为它生成的 .bz2 文件是 14 个字节。因此,即使未压缩的 .mssql 文件大小为零,等效存档的大小也不是零。

那么解决这个问题的最佳方法是什么?我可以生成一个未压缩的转储文件,对其进行测试,然后对其进行 bzip。 不过,我怀疑有一种更聪明的方法可以做到这一点。

最佳答案

真正的问题是,对于管道,默认返回状态是 last 命令的退出代码 ( bzip2 )。报价man bash :

   The return status of a pipeline is the exit status of the last command,
   unless  the  pipefail  option  is enabled.  If pipefail is enabled, the
   pipeline's return status is the value of the last  (rightmost)  command
   to  exit  with a non-zero status, or zero if all commands exit success‐
   fully.

如果您想在管道的任何命令失败时报告失败,则必须设置 pipefail选项。假设bash ,这是一个示例(我没有在本地主机上运行 mysql 服务器):

sylvain@daal:~$ set -o pipefail
sylvain@daal:~$ if mysqldump -u root -p db | bzip2 -c > latest-dump.mssql.bz2; then echo ok; else echo non ok; fi
Enter password: 
mysqldump: Got error: 2002: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) when trying to connect
non ok

对于您的具体情况,您将编写如下内容:

set -o pipefail

if ${l_mysqldump:-mysqldump} -u$l_db_user -p$l_db_pass -h $l_db_host $l_db_name | bzip2 -c > latest-dump.mssql.bz2
    then
      ...
    fi


<子> 顺便说一句:“mysqldump 命令给出了此错误 [..] 即使 it 抛出此错误,it 仍然生成一个 0 字节 .mssql 文件."

更准确地说,由于您使用 shell重定向,因此是主机 shell 创建该文件。在它尝试运行该命令之前。

关于bash - 如何确定 bzipped mysqldump 文件是否为空/大小为零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18184842/

相关文章:

java - 如何在java中读取.gz或.bzip2文件

java - 在unix中使用.sh文件运行.jar文件

mysql - com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException : Unknown column 'user0_.userId' in 'field list'

mysql - 如何通过mysqldump命令进行mysql备份而不影响生产服务器?

php - PharData::extractTo 将文件提取为什么文件格式?

c# - 将.bz2 流解压缩到 C# 中的文件

linux - 用于从单行输出中获取变量计数的 Shell 脚本

Bash 如何删除或过滤带有值的参数?

java - 我试图从 cronjob 调用 gradle,但它似乎没有被执行

mysql - 如何从字段中删除数据