mysql(全量+增量)备份+还原操作

1. MySQLdump增量备份配置

执行增量备份的前提条件是MySQL打开binlog日志功能,在my.cnf中[mysqld]加入

#log-bin=mysql-bin
#server-id=1

然后重启mysql。

2. Innodb 的mysqldump全量备份 + mysqlbinlog二进制日志增量备份

mysqldump命令必须带上–flush-logs选项以生成新的二进制日志文件:

#mysqldump --single-transaction --flush-logs --master-data=2 -u root -p test > backup_sunday_1_PM.sql

对于MyISAM将–single-transaction替换为–lock-all-tables
–flush-logs为结束当前日志,生成新日志文件;
–master-data=2 选项将会在输出SQL中记录下完全备份后新日志文件的名称;
–master-data=[0|1|2]
0 : 不记录
1 : 记录为CHANGE MASTER语句
2 : 记录为注释的CHANGE MASTER语句

3. 定时备份脚本实现:

a.全量备份脚本实现(假设mysql登录密码为123456;注意脚本中的命令路径):

#!/bin/bash
#获取当前时间
date_now=$(date "+%Y%m%d-%H%M%S")
backUpFolder=/home/mysql/data
username="root"
password="123456"
db_name="test"
#全量备份日志
logFile=/home/mysql/backup/dbBak.log
#定义备份文件名
fileName="${db_name}_${date_now}.sql"
#定义备份文件目录
backUpFileName="${backUpFolder}/${fileName}"
echo "starting backup mysql ${db_name} at ${date_now}."
mysqldump -u${username} -p${password}  --lock-all-tables --flush-logs ${db_name} > ${backUpFileName}
#进入到备份文件目录
cd ${backUpFolder}
#压缩备份文件
tar zcvf ${fileName}.tar.gz ${fileName}

# use nodejs to upload backup file other place
#NODE_ENV=$backUpFolder@$backUpFileName node /home/tasks/upload.js
date_end=$(date "+%Y%m%d-%H%M%S")
echo "finish backup mysql database ${db_name} at ${date_end}."
删除sql文件,不删也可以
rm -f ${fileName}

b.增量备份脚本(脚本中mysql的数据存放路径是/home/mysql/data,具体根据自己的实际情况进行调整)

查看mysql的数据存放路径,datadir:

mysql -uroot -p123456
show variables like '%dir%';

在这里插入图片描述

#!/bin/bash
#在使用之前,请提前创建以下各个目录
backupDir=/home/mysql/backup/daily
#增量备份时复制mysql-bin.00000*的目标目录,提前手动创建这个目录
mysqlDir=/var/lib/mysql
#mysql的数据目录
logFile=/home/mysql/backup/bak.log
BinFile=/var/lib/mysql/mysql-bin.index
#mysql的index文件路径,放在数据目录下的

mysqladmin -uroot -p123456 flush-logs
#这个是用于产生新的mysql-bin.00000*文件
# wc -l 统计行数
# awk 简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
Counter=`wc -l $BinFile |awk '{print $1}'`
NextNum=0
#这个for循环用于比对$Counter,$NextNum这两个值来确定文件是不是存在或最新的
for file in `cat $BinFile`
do
    base=`basename $file`
    echo $base
    #basename用于截取mysql-bin.00000*文件名,去掉./mysql-bin.000005前面的./
    NextNum=`expr $NextNum + 1`
    if [ $NextNum -eq $Counter ]
    then
        echo $base skip! >> $logFile
    else
        dest=$backupDir/$base
        if(test -e $dest)
        #test -e用于检测目标文件是否存在,存在就写exist!到$logFile去
        then
            echo $base exist! >> $logFile
        else
            cp $mysqlDir/$base $backupDir
            echo $base copying >> $logFile
         fi
     fi
done
echo `date +"%Y年%m月%d日 %H:%M:%S"` $Next Bakup succ! >> $logFile

创建好需要用到的目录和文件
/home/mysql/
/home/mysql/backup/
/home/mysql/data //全量备份文件目录
/home/mysql/backup/daily //增量备份文件目录
/home/mysql/backup/dbBak.log //全量备份日志
/home/mysql/backup/bak.log //增量备份日志

4. 手动执行上面两个脚本,测试下备份效果

a.先执行增量备份脚本

[root@localhost data]#  sh  /home/mysql/mysqlIncreamBackup.sh 
[root@localhost data]#  cat  bak.log 
mysql-binlog.00001 copying
mysql-binlog.00002 copying
mysql-binlog.00003 skip!
2018年11月13日 11:29:32 Bakup succ!

到 /home/mysql/backup/daily 目录下查看增量备份文件

[root@localhost data]# ll daily/
total 8
-rw-r-----. 1 root root 152 Nov 29 11:29 mysql-binlog.00002
-rw-r-----. 1 root root 152 Nov 29 11:29 mysql-binlog.00003

b.然后执行全量备份脚本

[root@localhost data]# sh /home/mysql/mysqlBackup.sh 
[root@localhost data]# cat dbBak.log

在这里插入图片描述

5. 设置crontab任务,执行备份脚本。

先执行的是增量备份脚本,然后执行的是全量备份脚本:

[root@localhost data]# crontab -e

#每个星期日凌晨3:00执行完全备份脚本

0 3 * * 0 /bin/bash -x /home/mysql/mysqlBackup.sh   >/dev/null 2>&1

#周一到周六凌晨3:00做增量备份

0 3 * * 1-6 /bin/bash -x /home/mysql/mysqlIncreamBackup.sh  >/dev/null 2>&1

6. 还原全量备份

如果是tar.gz,先解压再恢复
解压tar.gz文件命令

tar  -zxvf  xxx.tar.gz

恢复mysql备份命令

mysql -hhostname -uusername -ppassword databasename < backupfile.sql

7. 恢复增量备份

先移动binlog文件,并读取sql,如果是drop删除的数据,先剔除其中的drop语句

cp /home/mysql/backup/daily/mysql-bin.000003  /home/mysql/backup

mysqlbinlog -d test mysql-bin.000003 >003bin.sql       				#只还原test数据库

#vim 剔除drop语句,然后恢复增量数据

mysql -uroot -p123456 test < 002.sql

8. 重置binlog(reset master)

进入mysql

RESET MASTER;

参考:https://www.cnblogs.com/kevingrace/p/6114979.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值