实现Mysql数据库自动从一台Linux服务器备份至另一台Linux服务器

一、服务器间免密传输数据

为实现自动传输,即服务器A传输备份数据到服务器B免密码,有以下两种方法。两种方法我都进行了尝试,比较推荐大家用方法二,简单方便bug少。

方法一:使用Linux的scp命令

scp命令:用于Linux之间复制文件和目录。

# scp在建立连接中是需要密码认证的,需在服务器A上添加ssh公匙
ssh-keygen -t rsa

结果会在用户目录~/.ssh/产生两个文件,id_rsa,id_rsa.pub
将id_rsa.pub文件拷贝到服务器B的/root/.ssh/目录下,并命名authorized_keys,即

scp /root/.ssh/id_rsa.pub root@10.3.242.47:/root/.ssh/authorized_keys

可能遇到的问题:
Ubuntu的root账号无法登录SSH问题:Permission denied, please try again.
参考:https://blog.csdn.net/weiwei_pig/article/details/50954334

方法二:使用sshpass借助scp自动输入密码传输

首先安装sshpass:

sudo apt install sshpass

在脚本中输入:

sshpass -p 远程服务器密码 scp /srv/* root@服务器IP:/srv_2/

二、编写自动备份数据库脚本

编写备份数据库脚本bakmysql.sh,使得在固定周期时间,自动对数据库进行备份。

#!/bin/bash
. /etc/profile
#. ~/.bash_profile

#备份路径
BACKUP=数据库所在服务器备份目录
#当前时间
# DATETIME=$(date +%Y-%m-%d)
DATETIME=$(date +%Y-%m-%d-%H-%M-%S)

echo "===备份开始==="
echo "备份文件存放于${BACKUP}/$DATABASE-$DATETIME.sql"
#数据库地址
HOST=localhost
#数据库用户名
DB_USER=root
#数据库密码
DB_PW=密码
#创建备份目录
#[ ! -d "${BACKUP}/$DATETIME" ] && mkdir -p "${BACKUP}/$DATETIME"

#后台系统数据库
all='recommendData spidersData webData'
for DATABASE in $all
do
echo $DATABASE-$DATETIME
#mysqldump -u${DB_USER} -p${DB_PW} --single-transaction --host=$HOST -q -R --databases $DATABASE | gzip > ${BACKUP}/$DATETIME/$DATABASE.sql
mysqldump -h localhost  -u${DB_USER} -p${DB_PW}  ${DATABASE} >${BACKUP}/$DATABASE-$DATETIME.sql

echo "===导出成功,开始传输==="
#压缩成tar.gz包
cd $BACKUP
#tar -zcvf $DATETIME.tar.gz $DATETIME
#备份到服务器B
sshpass -p 密码 scp $DATABASE-$DATETIME.sql 用户名@10.3.242.47:/另一台服务器的备份目录/

#删除备份目录
#rm -rf ${BACKUP}/$DATETIME
done

#删除7天前备份的数据,可以自行更改
find $BACKUP -mtime +7 -name "*.sql" -exec rm -rf {} \;
echo "===数据库备份到服务器成功==="

三、实现固定时间自动执行脚本

脚本编写完,利用Linux系统的crontab定时任务,实现固定时间自动执行脚本。
为方便编辑crontab,需要改变一下编辑器:
在这里插入图片描述

crontab -e #编辑
# 每周一 11:59 p.m 进行备份作业。
59 11 * * 1 /etc/profile;/bin/sh /root/bakmysql.sh
# 每隔一分钟进行一次备份,一开始可以先用这个尝试,看效果比较快
*/1 * * * * /etc/profile;/bin/sh /root/bakmysql.sh 
ESC shift+zz #保存退出
service crond restart #重启服务,如果是ubuntu系统,则是cron
# 查看cron服务启动状态
systemctl status cron

四、一些问题解决

1. 查看cron服务启动状态报错

(CRON) info (No MTA installed, discarding output)

解决方法参考:https://blog.csdn.net/win_turn/article/details/53000899
安装 postfix:

sudo apt-get install postfix
sudo service postfix start

2. 脚本无法执行问题

若使用 crontab 来定时执行脚本,无法执行,但直接通过命令(如:./test.sh)又可以正常执行,主要是因为无法读取环境变量的原因。
解决方法:

  • 所有命令需要写成绝对路径形式,如: /usr/local/bin/docker。
  • 在 shell 脚本开头使用以下代码:
#!/bin/sh

. /etc/profile
#. ~/.bash_profile
  • 在 /etc/crontab 中添加环境变量,在可执行命令之前添加命令 . /etc/profile;/bin/sh,使得环境变量生效,例如:
*/3 * * * * /etc/profile;/bin/sh /root/bakmysql.sh 

3. 修改Ubuntu系统的时间

若服务器上Ubuntu系统的时间与北京时间不对应,不好确定日期和时间,故需要矫正一下。
可参考文章:https://blog.csdn.net/zhengchaooo/article/details/79500032

参考文章:

Linux如何将Mysql数据库自动从一台服务器备份到另一台服务器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值