[MYSQL]增量备份和全量备份以及恢复

项目需要进行对mysql的增量备份和全量备份,大致思路是通过编写crontab(定时任务)执行mysqldump指令下载整个sql文件然后压缩,进行全量备份;开启MySQLbinlog日志,备份binlog日志文件进行增量备份。

1.前提

检测bin-log是否开启,登录MySQL,输入
show variables like 'log_%'
+—————————————-+—————————————+
| Variable_name | Value |
+—————————————-+—————————————+
| log_bin | ON | ——> ON表示已经开启binlog日志
| log_bin_basename | /usr/local/mysql/data/mysql-bin |
| log_bin_index | /usr/local/mysql/data/mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| log_error | /usr/local/mysql/data/martin.err |
| log_output | FILE |
| log_queries_not_using_indexes | OFF |
| log_slave_updates | OFF |
| log_slow_admin_statements | OFF |
| log_slow_slave_statements | OFF |
| log_throttle_queries_not_using_indexes | 0 |
| log_warnings | 1 |
+—————————————-+—————————————+
如未开启,修改MySQL配置文件,在[mysqld] 区块
设置/添加 log-bin=mysql-bin 确认是打开状态(值 mysql-bin 是日志的基本名或前缀名);
重启mysqld服务使配置生效
# pkill mysqld # /usr/local/mysql/bin/mysqld_safe --user=mysql &

2.全量备份脚本及恢复

备份脚本

#执行环境变量
source /etc/profile
#设置备份目录
BakDir=/data/mysql/bak/fully_bak
#设置日志目录
LogFile=/data/mysql/bak/bak.log
Date=`date +"%Y-%m-%d"`
Begin=`date +"%Y-%m-%d %H:%M:%S"`
cd $BakDir
DumpFile=$Date.sql
GZDumpFile=$Date.sql.tgz
echo $DumpFile
#执行mysqldump指令,生产备份sql
mysqldump -u[在此输入用户名] -p[在此输入密码] --quick --events --databases  [在此输入数据库名]   >$DumpFile
/bin/tar -zvcf  $GZDumpFile $DumpFile #压缩备份文件
/bin/rm $DumpFile #删除dump文件,只保留压缩备份
oldDate=`date -d  '7 days ago' + %Y%m%d`
oldBakFile=$(oldDate)".sql.tgz"
Last=`date +"%Y年%m月%d日 %H:%M:%S"`
echo 开始:$Begin结束:Last $GZDumpFile succ >> $LogFile #记录备份日志

恢复
找到你需要恢复的文件,进行解压缩
tar -zxvf '恢复文件'
执行解压缩后的sql文件
mysql –u用户名 –p密码 –D数据库<【sql脚本文件路径全名】

3.增量备份脚本及恢复

备份脚本

# Program
# use cp to backup mysql data everyday!
# History
# Path
BakDir=/data/mysql/bak/add_bak       #增量备份时复制mysql-bin.00000*的目标目录,提前手动创建这个目录
BinDir=/data/mysql               #mysql数据存放目录
LogFile=/data/mysql/bak/add_bak.log             #备份日志存放目录
BinFile=/data/mysql/bin.index       #mysql数据目录下的index文件
Date=`date +%Y%m%d`
Begin=`date +"%Y年%m月%d日 %H:%M:%S"`
mysqladmin -uroot -pPassc0de@tpcpjl flush-logs
#这个是用于产生新的mysql-bin.00000*文件
Counter=`wc -l $BinFile |awk '{print $1}'`
NextNum=0
#这个for循环用于比对$Counter,$NextNum这两个值来确定文件是不是存在或最新的
echo \######################################################  >> $LogFile
 
for file in `cat $BinFile`
do
    base=`basename $file`
    #basename用于截取mysql-bin.00000*文件名,去掉./mysql-bin.000005前面的./
    NextNum=`expr $NextNum + 1`
    if [ $NextNum -eq $Counter ]
    then
         echo $base skip! > /dev/null
    else
        dest=$BakDir/$base
        if(test -e $dest)
        #test -e用于检测目标文件是否存在,存在就写exist!到$LogFile去
        then
            echo $base exist! >> $LogFile
        else
            cp $BinDir/$base $BakDir
            echo $base copying >> $LogFile
         fi
     fi
done
Last=`date +"%Y年%m月%d日 %H:%M:%S"`
echo 开始:$Begin 结束:$Last$Next mysql-daily-backup successful !!! >> $LogFile
echo    >> $LogFile
ls -l -h  $BakDir

恢复
通过binlog将日志文件转为sql文件,然后执行sql
mysqlbinlog --base64-output=decode-rows 'binlog文件完整路径'>/opt/excute.sql
执行生成的sql文件

3.定时任务设置

安装
yum install vixie-cron
yum install crontabs
vixie-cron软件包是cron的主程序; 
crontabs软件包是用来安装、卸装、或列举用来驱动 cron 守护进程的表格的程序。
启动命令
service crond start //启动服务 
service crond stop //关闭服务 
service crond restart //重启服务 
service crond reload //重新载入配置
service crond status //查看状态
chkconfig crond on //设置开机自动启动crond服务:
chkconfig –list crond //开机级别的crond服务运行情况 ,2、3、4、5级别开机会自动启动crond服务 
chkconfig crond off//取消开机自动启动crond服务:
定时执行脚本
crontab -e 进入定时任务编辑模式,输入cron表达式和执行脚本完整路径,保存
00 02 * * * /opt/add_bak.sh
cron表达式的一些例子

0 0 10,14,16 * * ? 每天上午10点,下午2点,4点触发 

0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时触发  

0 0 12 ? * WED 表示每个星期三中午12点触发  

0 0 12 * * ? 每天中午12点触发 

0 15 10 ? * * 每天上午10:15触发 

0 15 10 * * ? 每天上午10:15触发 

0 15 10 * * ? * 每天上午10:15触发 

0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发 

0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发 

0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 

0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发 

0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发 

0 15 10 ? * MON-FRI 周一至周五的上午10:15触发 

0 15 10 15 * ? 每月15日上午10:15触发 

0 15 10 L * ? 每月最后一日的上午10:15触发

原文地址:https://www.cnblogs.com/check-code/p/14785163.html