首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将shell脚本绑定地址设置为localhost的Mysql数据库备份

问将shell脚本绑定地址设置为localhost的Mysql数据库备份
EN

Stack Overflow用户
提问于 2017-12-22 11:38:50
回答 2查看 1.9K关注 0票数 0

我使用shell脚本将数据库从远程服务器备份到Synology。脚本运行良好,但是当我将de config @ The remote server中的绑定地址设置为“localhost”时,脚本就不再工作了。脚本需要SSH验证。

问题:如何在此脚本中创建SSH连接/凭据?

在我使用的脚本下面:

代码语言:javascript
复制
#! /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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-22 12:14:27

您需要通过ssh发送命令。修改后的脚本版本应该执行此任务。

代码语言:javascript
复制
#! /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)。

票数 1
EN

Stack Overflow用户

发布于 2021-10-26 00:35:01

这是我的剧本:

代码语言:javascript
复制
#!/bin/bash

## Designed to run in Synology DSM > Control Panel > Task Scheduler > User-defined script

TODAY=$(date +"%Y-%m-%d")
TIME=$(date +"%T")

################################################################
################## Update below values ########################

DB_BACKUP_PATH='/volume2/Backups/Alpine1MySQL/proddata'
MYSQL_HOST='servername.domain.co.nz'
MYSQL_PORT='3306'
MYSQL_USER='backup'
MYSQL_PASSWORD='backuppassword'
DATABASE_NAME='dbname'
BACKUP_RETAIN_DAYS=90 ## Number of days to keep local backup copy
MYSQLDUMP=/volume2/@appstore/MariaDB10/usr/local/mariadb10/bin/mysqldump ## Get this file by installing the MariaDB package in Synology package manager (it doesn't need to actually run)

#################################################################

mkdir -p ${DB_BACKUP_PATH}/${TODAY} | echo ${DB_BACKUP_PATH}/${TODAY} "directory created"
echo "Backup started for database: ${DATABASE_NAME}"

$MYSQLDUMP -h ${MYSQL_HOST} \
-P ${MYSQL_PORT} \
-u ${MYSQL_USER} \
-p${MYSQL_PASSWORD} \
${DATABASE_NAME} | zip > ${DB_BACKUP_PATH}/${TODAY}/${DATABASE_NAME}_${TODAY}_${TIME}.sql.zip

if [ $? -eq 0 ]; then
echo "Database backup successfully completed"
else
echo "Error found during backup"
exit 1
fi

##### Remove backups older than {BACKUP_RETAIN_DAYS} days #####
echo "Removing backups older than" ${BACKUP_RETAIN_DAYS} "days "
DBDELDATE=`date +"%d%b%Y" --date="${BACKUP_RETAIN_DAYS} days ago"`

if [ ! -z ${DB_BACKUP_PATH} ]; then
cd ${DB_BACKUP_PATH}
if [ ! -z ${DBDELDATE} ] && [ -d ${DBDELDATE} ]; then
rm -rf ${DBDELDATE}
fi
fi

### End of script ####
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47940894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档