Резервное копирование базы данных Mysql с помощью сценария оболочки - для bind-адреса установлено значение localhost

0

Я использую сценарий оболочки для резервного копирования моих баз данных с удаленного сервера на мой 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
Теги:
backup
synology

1 ответ

0
Лучший ответ

Вам нужно отправить команду 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).

  • 0
    Спасибо за обширный пример. Я получаю сообщение об ошибке (я использую локальную опцию сохранения); Taak: Резервная копия базы данных / rYO8M5fPpnWSb6v2muIUxiJyrC / jIvx3K2ctmx8ROm167rNUxGeh0RiuqN + G + oUv1zXSE3SM7YIP5Z2mK9cfkFxKXMAUcM9pDwygf + ОШИБКА 2003 (HY000): не удается подключиться к серверу MySQL по 'serverIP' (111)
  • 0
    Вы указали полный путь к своему ключу ssh с флагом -i ? Также HOST который используется для mysql, может быть установлен для localhost, поскольку вы подключаетесь к удаленной машине с помощью ssh и выполняете mysql локально на удаленной машине. Поэтому SSH_HOST должен быть ip вашей удаленной машины, а HOST может быть localhost (это используется с mysql в нашем примере).
Показать ещё 13 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню