【问题标题】:How can I detect if mysqldump fails in a bash script?如何检测 mysqldump 在 bash 脚本中是否失败?
【发布时间】:2022-01-05 07:24:31
【问题描述】:

我有一个小而肮脏的脚本,用于每晚转储客户数据库中的一个表:

#!/bin/bash

DB_BACKUP="/backups/mysql_backup/`date +%Y-%m-%d`"
DB_USER="dbuser"
DB_PASSWD="dbpass"

# Create the backup directory
mkdir -p $DB_BACKUP

# Remove backups older than 10 days
find /backups/mysql_backup/ -maxdepth 1 -type d -mtime +10 -exec rm -rf {} \;

# Backup each database on the system
for db in $(mysql --user=$DB_USER --password=$DB_PASSWD -e 'show databases' -s --skip-column-names|grep -viE '(staging|performance_schema|information_schema)');
do echo "dumping $db-uploads"; mysqldump --user=$DB_USER --password=$DB_PASSWD --events --opt --single-transaction $db uploads > "$DB_BACKUP/mysqldump-$db-uploads-$(date +%Y-%m-%d).sql";
done

最近我们遇到了一些问题,其中一些表被损坏,mysqldump 失败并显示以下消息:

mysqldump: Got error: 145: Table './myDBname/myTable1' is marked as crashed and should be repaired when using LOCK TABLES

有没有办法让我检查 bash 脚本中是否发生这种情况,如果发生,则记录错误?

另外,这样的错误会停止脚本,还是会继续正常备份其余数据库?如果它会停止执行,有没有办法解决这个问题?

【问题讨论】:

    标签: mysql bash error-handling


    【解决方案1】:

    每个程序都有一个退出状态。每个程序的退出状态分配给 $? 内置 bash 变量。按照惯例,如果命令成功,则为 0,如果命令不成功,则为 1-255。确切的值取决于该程序中的代码。

    您可以在此处查看 mysqldump 可能发出的退出代码:https://github.com/mysql/mysql-server/blob/8.0/client/mysqldump.cc#L65-L72

    您可以检查并记录它,输出您选择的错误消息,退出 bash 脚本,随心所欲。

    mysqldump ...
    if [[ $? != 0 ]] ; then
      ...do something...
    fi
    

    你也可以写这个做同样的事情:

    mysqldump ... || {
      ...do something...
    }
    

    || 表示如果前面命令的退出状态为非零,则执行后面的语句或代码块。

    默认情况下,返回错误的命令不会导致 bash 脚本退出。您可以选择使用此语句使脚本的行为成为脚本的行为,并且所有以下命令如果失败将导致脚本退出:

    set -e
    

    【讨论】:

    • 注意,使用if [[ $? != 0 ]] ...会将mysqldump的退出状态替换为[[ ]]条件的状态;如果您想检查特定的错误代码,请在mysqldump 命令之后用status=$? 立即 之类的内容保存状态,然后检查$status 以查看发生了什么错误(如果有)。
    猜你喜欢
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 2011-12-05
    • 2013-08-26
    • 1970-01-01
    • 2011-11-07
    相关资源
    最近更新 更多