Linux下定时将Mysql数据库从服务器A备份到服务器B
本文主要介绍如何在Centos7下每天定时将Mysql数据库下部分数据库(也可以是全部库)从A服务器备份到B服务器。
- 两台Linux之间传输文件(无需输入密码)
- 编写数据库备份脚本
- 设置定时执行
一、通过scp命令在两台Linux之间免密传输文件,文件从A服务器(10.10.10.10)到B服务器(10.10.10.11),不了解scp的同学可自行百度。
一般情况下通过scp传输文件是需要密码认证的,但是通过以下方式可以避免每次都输入密码:
1.首先在A服务器上生成ssh公钥,执行以下命令:
ssh-keygen -t rsa
执行以上命令后会在系统登录用户目录下(我的是/root/.ssh)生成两个文件:id_rsa和id_rsa.pub
2.通过scp命令将id_rsa.pub文件传输到B服务器上,并重命名为:authorized_keys。执行以下命令(执行命令后需要输入B服务器的登录密码):
scp -P2200 /root/.ssh/id_rsa.pub root@10.10.10.11:/root/.ssh/authorized_keys
以上两步完成后,从A服务器传输文件到B服务器就不需要再输入密码了!
二、编写数据库备份脚本
备份数据库主要使用mysql自带的逻辑备份工具mysqldump。具体使用方式可自行百度,这里不作为重点描述。
脚本名:dbbak.sh,内容如下:
#!/bin/bash #数据库备份执行文件 #备份路径 BACKUP=/data/dbbak DATABASE=dbname #当前时间 DATETIME=$(date +%Y-%m-%d) echo "===备份开始===" echo "===备份文件存放于$BACKUP/$DATABASE.sql===" #数据库地址 HOST=10.10.10.10 PORT=3306 #数据库用户名 DB_USER=root #数据库密码 DB_PW=password #指定数据库,并且排除部分表。注意不要锁表和数据一致性 mysqldump -h$HOST -P$PORT -u$DB_USER -p$DB_PW --skip-opt $DATABASE --ignore-table=${DATABASE}.table1 --ignore-table=${DATABASE}.table2 >$BACKUP/$DATABASE-$DATETIME.sql #备份指定的表 #mysqldump -h$HOST -P$PORT -u$DB_USER -p$DB_PW --skip-opt $DATABASE --tables table1 >$BACKUP/$DATABASE-$DATETIME.sql echo "===导出成功,开始传输===" cd $BACKUP #压缩备份文件,文件太大的话可以选择压缩再传输 #tar -zcvf $DATETIME.tar.gz $DATETIME #备份到服务器B scp -P2200 ${DATABASE}-${DATETIME}.sql root@10.10.10.11:/data/dbbak #删除3天前备份的数据,确保长期运行不会占用太多磁盘空间,具体天数可自行配置 find $BACKUP -mtime +3 -name "*.sql" -exec rm -rf {} \; echo "===数据库备份到备份服务器成功==="
备份脚本编写完成后,上传到A服务器,存放路径根据自己实际情况而定,我存放的路径是:/data/dbbak
三、设置定时执行
利用linux系统自带的crontab命令创建定时任务,实现每天某个时间点定时执行。执行以下命令:
#给执行文件授权 chmod 777 /data/dbbak/dbbak.sh
#编辑定时任务
crontab -e
#通过vim命令进行编辑,输入以下命令,表示在每天凌晨1点执行任务 0 1 * * * /data/dbbak/dbbak.sh
至此,Linux下定时将Mysql数据库从服务器A备份到服务器B就完成了!
crontab命令简介:
#修改定时任务. 如果文件不存在会自动创建 crontab –e #显示已经创建的定时任务 crontab –l #删除定时任务 crontab -r #删除定时任务前给出提醒 crontab -ir
#每天凌晨1点执行任务 0 1 * * * /data/dbbak/dbbak.sh #每个工作日(周一到周五)中午12:30执行任务 30 12 * * 1,2,3,4,5 /data/dbbak/dbbak.sh #每10分钟定时执行任务 * /10 * * * * /data/dbbak/dbbak.sh #每1小时定时执行任务 0 */1 * * * /data/dbbak/dbbak.sh