Eu construí um script de backup shell mysql que funciona muito bem.
Só tem problemas com senhas com caracteres especiais como este:
xgT{uic[Is?uJ+
.
Aqui está a parte importante do script:
#!/bin/sh
FILE=mysql-$db.$DATE.sql.gz
ssh $SUSER@$SHOST "mysqldump -q -u $MUSER -h $MHOST -p$MPASS $db --no-create-db | gzip -9 > $FILE" 2> $ERROR
Eu mudei para:
ssh $SUSER@$SHOST 'mysqldump -q -u $MUSER -h $MHOST -p'\''$MPASS'\'' $db --no-create-db | gzip -9 > $FILE' 2> $ERROR
Como você pode ver, já tentei aspas duplas. Mas agora recebo o erro:
bash: $FILE: ambiguous redirect
Estou obtendo a senha e outras informações de um arquivo externo:
DB_HOST=000.000.000.000
DB_DATABASE=dbdame
DB_USER=db user
DB_PASS="xgT{uic[Is?uJ+"
Dentro do meu script ele pega as informações do arquivo externo:
Source dbserver.conf
MUSER=$DB_USER
MPASS=$DB_PASS
MHOST=$DB_HOST
DBS=$DB_DATABASE
Responder1
Sua senha precisa ter caracteres especiais escapados. Portanto, se a sua senha original for, xgT{uic[Is?uJ+
ela terá que se tornar xgT\{uic\[Is\?uJ\+
(Uma barra antes dos caracteres especiais).
Você também pode querer olhar algo já escrito para fazer isso, comoBackup automático do MySQL, mas não tenho certeza se você precisa de rotações de backup diárias, semanais ou mensais. No entanto, a mesma regra se aplica, se a senha tiver caracteres especiais, esses caracteres especiais precisam ser escapados.
Espero que ajude!
Responder2
Sim. Ajudou a escapar de caracteres especiais:
MPASS=$(printf "%q\n" "$DB_PASS")
Mas ainda havia um problema com o mysqldump. Eu finalmente descobri que o mysqldump só funcionava para mim com senhas com caracteres especiais quando eu não informava ao mysqldump o host (-h hostname). Isto parece ser um inseto. Ou não é?
Infelizmente também tenho sites onde o servidor mysql é outro host. Portanto, esta solução não é perfeita.
Responder3
Você deveria escrever assim:
ssh "$SUSER@$SHOST" "mysqldump -q -u \"$MUSER\" -h \"$MHOST\" -p\"$MPASS\" \"$db\" --no-create-db | gzip -9 > \"$FILE\"" 2> "$ERROR"
Ou seja, todas as variáveis usadas como argumentos de linha de comando devem ser protegidas entre aspas. As aspas duplas em torno das variáveis garantem que a expressão seja tratada como um valor único, para que o shell não a divida em palavras. Observe que "
incorporado "..."
precisa ser escapado e escrito como \"
. Uma solução mais simples é usar aspas simples em vez das aspas duplas incorporadas, como esta:
ssh "$SUSER@$SHOST" "mysqldump -q -u '$MUSER' -h '$MHOST' -p'$MPASS' '$db' --no-create-db | gzip -9 > '$FILE'" 2> "$ERROR"
Por último, estou me perguntando se você realmente pretendia ter 2> "$ERROR"
no host local e não no host remoto. Eu suspeito que você realmente queria isso no host remoto, então esse é outro erro na linha de comando original. Se for esse o caso, aqui está a solução:
ssh "$SUSER@$SHOST" "mysqldump -q -u '$MUSER' -h '$MHOST' -p'$MPASS' '$db' --no-create-db | gzip -9 > '$FILE' 2> '$ERROR'"