Я использую сценарий оболочки для резервного копирования моих баз данных с удаленного сервера на мой Synology NAS. Сценарий работает нормально, но когда я устанавливаю Bind Address в mysql config @на удаленном сервере на "localhost", скрипт больше не работает. Скрипт нуждается в проверке SSH.
Вопрос: как я могу создать SSH-соединение/учетные данные в этом скрипте?
Под сценарием я использую:
#! /bin/bash
TIMESTAMP=$(date +"%Y-%m-%d")
PAST=$(date +"%Y-%m-%d" -d "30 days ago")
BACKUP_DIR="/volume1/dir/dir2/$TIMESTAMP"
PAST_DIR="/volume1/dir/di2/$PAST"
HOST="myip"
MYSQL_USER="username"
MYSQL=/usr/bin/mysql
MYSQL_PASSWORD="password"
MYSQLDUMP=/usr/bin/mysqldump
rm -rv $PAST_DIR
mkdir -p $BACKUP_DIR
databases='$MYSQL -h $HOST --user=$MYSQL_USER -p$MYSQL_PASSWORD -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema)"'
for db in $databases; do
$MYSQLDUMP --force --opt -h $HOST --user=$MYSQL_USER -p$MYSQL_PASSWORD --databases $db | gzip > "$BACKUP_DIR/$db.sql.gz"
done
Вам нужно отправить команду ssh
. Модифицированная версия вашего скрипта должна выполнить задачу.
#! /bin/bash
TIMESTAMP=$(date +"%Y-%m-%d")
PAST=$(date +"%Y-%m-%d" -d "30 days ago")
BACKUP_DIR="/volume1/dir/dir2/$TIMESTAMP"
PAST_DIR="/volume1/dir/di2/$PAST"
HOST="myip"
MYSQL_USER="username"
MYSQL=/usr/bin/mysql
MYSQL_PASSWORD="password"
MYSQLDUMP=/usr/bin/mysqldump
SSH_KEY=""
SSH_USER=""
SSH_HOST=""
REMOTE_COMMAND="$MYSQL -h $HOST --user=$MYSQL_USER -p$MYSQL_PASSWORD -s -e 'SHOW DATABASES' | grep -v 'information_schema'"
databases=$(ssh -i $SSH_KEY ${SSH_USER}@${SSH_HOST} "$REMOTE_COMMAND")
created=0
for db in $databases; do
DUMP="$BACKUP_DIR/$db.sql"
# To save backup on remote machine
case $created in
0) REMOTE_COMMAND="rm -rv $PAST_DIR; mkdir -p $BACKUP_DIR"; created=1
ssh -i $SSH_KEY ${SSH_USER}@${SSH_HOST} "$REMOTE_COMMAND" ;;
*) ;;
esac
REMOTE_COMMAND="$MYSQLDUMP --force --opt -h $HOST --user=$MYSQL_USER -p$MYSQL_PASSWORD --databases $db | gzip -9 > $DUMP.gz"
ssh -i $SSH_KEY ${SSH_USER}@${SSH_HOST} "$REMOTE_COMMAND"
# To save backup on local machine
# case $created in
# 0) rm -rv $PAST_DIR; mkdir -p $BACKUP_DIR; created=1 ;;
# *) ;;
# esac
# REMOTE_COMMAND="$MYSQLDUMP --force --opt -h $HOST --user=$MYSQL_USER -p$MYSQL_PASSWORD --databases $db"
# ssh -i $SSH_KEY ${SSH_USER}@${SSH_HOST} "$REMOTE_COMMAND" | gzip -9 > $DUMP.gz
done
ПРИМЕЧАНИЕ. Вам необходимо установить SSH_KEY
(если у вас есть проверка подлинности на основе ssh), SSH_USER
, SSH_HOST
. Также я предоставил два решения, если вы хотите сохранить резервную копию на своей локальной машине, откуда вы начали команду. Также обратите внимание на флаг -s
с командой mysql
(часть SHOW DATABASES
), которая не будет печатать имя colum (здесь Database
).
-i
? ТакжеHOST
который используется для mysql, может быть установлен для localhost, поскольку вы подключаетесь к удаленной машине с помощью ssh и выполняете mysql локально на удаленной машине. ПоэтомуSSH_HOST
должен быть ip вашей удаленной машины, аHOST
может бытьlocalhost
(это используется с mysql в нашем примере).