技术分享
mysql(全量+增量)备份+还原操作
2018-03-04
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;

- 标签:
-
容灾备份