执行增量备份的前提条件是MySQL打开binlog日志功能,在my.cnf中[mysqld]加入
#log-bin=mysql-bin
#server-id=1
然后重启mysql。
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语句
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 //增量备份日志
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
先执行的是增量备份脚本,然后执行的是全量备份脚本:
[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
如果是tar.gz,先解压再恢复
解压tar.gz文件命令
tar -zxvf xxx.tar.gz
恢复mysql备份命令
mysql -hhostname -uusername -ppassword databasename < backupfile.sql
先移动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
进入mysql
RESET MASTER;
参考:https://www.cnblogs.com/kevingrace/p/6114979.html