如何检测mysqldump在bash脚本中是否失败



我有一个小而脏的脚本,可以每晚将其中一个表转储到客户端的所有数据库:

#!/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脚本中是否发生了这种情况,如果发生了,则记录错误?

此外,正如所写的那样,这样的错误会使脚本停止吗,还是会继续正常备份其余的数据库?如果它会停止执行,有办法吗?

每个程序都有一个退出状态。每个程序的退出状态都分配给$?内置的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

最新更新