使用mysqldump时脚本抛出意外的操作符

时间:2011-03-20 11:59:57

标签: mysql shell scripting openssl mysqldump

我将用于备份MySQL数据库的脚本的一部分在将Debian框升级到6.0 Squeeze后停止正常工作。我已经通过CLI测试了备份代码,它运行正常。我相信这是在备份发生之前选择数据库,可能与 $ skipdb 变量有关。如果有更好的方法来执行该功能,那么我将尝试一些新的东西。任何见解将不胜感激。

$ sudo ./script.sh
[: 138: information_schema: unexpected operator
[: 138: -1: unexpected operator
[: 138: mysql: unexpected operator
[: 138: -1: unexpected operator

在这里使用 bash -x脚本是其中一个迭代:

+ for db in '$DBS'
+ skipdb=-1
+ '[' test '!=' '' ']'
+ for i in '$IGGY'
+ '[' mysql == test ']'
+ :
+ '[' -1 == -1 ']'
++ /bin/date +%F
+ FILE=/backups/hostname.2011-03-20.mysql.mysql.tar.gz
+ '[' no = yes ']'
+ /usr/bin/mysqldump --single-transaction -u root -h localhost '-ppassword' mysql
+ /bin/tar -czvf /backups/hostname.2011-03-20.mysql.mysql.tar.gz mysql.sql
mysql.sql
+ rm -f mysql.sql

这是代码。

if [ $MYSQL_UP = "yes" ]; then
echo "MySQL DUMP" >> /tmp/update.log
echo "--------------------------------" >> /tmp/update.log
DBS="$($MYSQL -u $MyUSER -h $MyHOST -p"$MyPASS" -Bse 'show databases')"
for db in $DBS
do
    skipdb=-1
    if [ "$IGGY" != "" ] ;
    then
        for i in $IGGY
        do
            [ "$db" == "$i" ] && skipdb=1 || :
        done
    fi
    if [ "$skipdb" == "-1" ] ;
    then
        FILE="$DEST$HOST.`$DATE +"%F"`.$db.mysql.tar.gz"
        if [ $ENCRYPT = "yes" ]; then
            $MYSQLDUMP -u $MyUSER -h $MyHOST -p"$MyPASS" $db > $db.sql && $TAR -czvf - $db.sql | $OPENSSL enc -aes-256-cbc -salt -out $FILE.enc -k $ENC_PASS && rm -f $db.sql
        else
            $MYSQLDUMP --single-transaction -u $MyUSER -h $MyHOST -p"$MyPASS" $db > $db.sql && $TAR -czvf $FILE $db.sql && rm -f $db.sql
        fi
    fi
done

网络连接

2 个答案:

答案 0 :(得分:2)

我最好的猜测是你没有shebang线或者默认的shell已经改变了。你的问题就在这一行:

[ "$db" == "$i" ] && skipdb=1 || :

和/或这一个:

if [ "$skipdb" == "-1" ]

Bash对单个方括号内的==非常满意,但Dash例如并非如此。将这些行更改为使用单个等号:

[ "$db" = "$i" ] && skipdb=1 || :

if [ "$skipdb" = "-1" ]

或将您的shebang更改为#!/bin/bash

答案 1 :(得分:1)

我的猜测是你的$MYSQL没有返回你期望的值,而是打印一些错误信息,你用for db in $DBS ; do ... done进行迭代。

尝试手动运行$MYSQL -u $MyUSER -h $MyHOST -p"$MyPASS" -Bse 'show databases'命令。

bash -x script也是你的朋友。