Скрипт, выдающий неожиданный оператор при использовании mysqldump - PullRequest
2 голосов
/ 20 марта 2011

Часть скрипта, который я использую для резервного копирования баз данных MySQL, перестала корректно работать после обновления Debian Box до 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 script Вот одна из итераций:

+ 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

Fi

Ответы [ 2 ]

2 голосов
/ 20 марта 2011

Мое лучшее предположение, что у вас нет линии Шебанга или что оболочка по умолчанию изменилась. Ваша проблема в этой строке:

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

и / или этот:

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

Bash совершенно доволен == в квадратных скобках, а Dash, например, нет. Измените эти строки, чтобы использовать одинарные знаки равенства:

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

и

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

или измените свой шебанг на #!/bin/bash.

1 голос
/ 20 марта 2011

Я предполагаю, что ваш $MYSQL не возвращает ожидаемое вами значение, но выдает сообщение об ошибке, которое вы повторяете с помощью for db in $DBS ; do ... done.

Попробуйте выполнить команду $MYSQL -u $MyUSER -h $MyHOST -p"$MyPASS" -Bse 'show databases' вручную.

Также bash -x script ваш друг здесь.

...