暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

Mysql备份策略(全量/增量备份)

IT 邦德 2021-07-20
1195

一、设计场景

1)增量备份在周一到周六凌晨3点,复制mysql-bin.00000*到指定目录;

2)全量备份则使用mysqldump将整个数据库导出,每周日凌晨3点执行,并会删除上周留下的mysq-bin.00000*,然后对mysql的备份操作会保留在bak.log文件中。


二、技术点

Mysqldump、mysqlbinlog、crontab


三、服务器信息

主机:centos7;数据库:mysql5.7


四、准备工作

4.1 开启binlog日志功能

binlog日志默认不开启,记录的是mysql数据库dml的操作

mysql> show variables like '%log_bin%';

+---------------------------------+-------+

| Variable_name                   | Value |

+---------------------------------+-------+

| log_bin                         | OFF   |

| log_bin_basename                |       |

| log_bin_index                   |       |

| log_bin_trust_function_creators | OFF   |

| log_bin_use_v1_row_events       | OFF   |

| sql_log_bin                     | ON    |

+---------------------------------+-------+

(1)新建目录,执行

which mysql

#mkdir home/mysql

#cd home/mysql

#mkdir mysql-bin    #增量日志文件目录

(2)修改所属的用户/组:(不修改,mysql无法重启)

#chown -R mysql.mysql mysql-bin

(3)修改mysql配置文件,执行

#vim etc/my.cnf

其中,server-id表示单个结点的id,这里由于只有一个结点,所以可以把id随机指定为一个数,这里将id设置成1。

若集群中有多个结点,则id不能相同(对于5.7以下版本不需要指定server-id);

log_bin指定binlog日志文件的存储路径,日志文件以mysql-bin开头。

加入以下内容:

server-id=1

log_bin=/home/mysql/mysql-bin/mysql-bin

(4)重启mysql,执行

#service mysqld restart    --root用户执行


(5)查看日志文件

#cd home/mysql/mysql-bin

[root@Jeames mysql-bin]# ll

total 8

-rw-r----- 1 mysql oinstall 154 Jan 14 05:45 mysql-bin.000001

-rw-r----- 1 mysql oinstall  39 Jan 14 05:45 mysql-bin.index

(6)进入数据库,查看启动效果

#mysql -uroot -p

#show variables like '%log_bin%';

+---------------------------------+---------------------------------------+

| Variable_name                   | Value                                 |

+---------------------------------+---------------------------------------+

| log_bin                         | ON                                    |

| log_bin_basename                | home/mysql/mysql-bin/mysql-bin       |

| log_bin_index                   | home/mysql/mysql-bin/mysql-bin.index |

| log_bin_trust_function_creators | OFF                                   |

| log_bin_use_v1_row_events       | OFF                                   |

| sql_log_bin                     | ON                                    |

+---------------------------------+---------------------------------------+


五、编写全量备份脚本(Mysql-FullyBak.sh)

 进入/home/mysql目录

新建目录:mkdir backup

进入backup目录,新建daily目录:mkdir daily

切换到/home/mysql目录,执行

#vim Mysql-FullyBak.sh      --脚本中注意日期中+前面的空格及单引号

--------------------------------------------------------

#mysqldump to Fully backup mysql data per week!

source etc/profile

BakDir=/home/mysql/backup

LogFile=/home/mysql/backup/bak.log

Date=`date +%Y%m%d`

Begin=`date +"%Y年%m月%d日 %H:%M:%S"`

cd $BakDir

DumpFile=$Date.sql

GZDumpFile=$Date.sql.tgz

/usr/bin/mysqldump -uroot -proot --quick --events --databases wmp --flush-logs \

--delete-master-logs --single-transaction >$DumpFile

/bin/tar -zvcf $GZDumpFile $DumpFile

/bin/rm $DumpFile

oldDate=`date -d '7 days ago' +%Y%m%d`

oldBakFile=${oldDate}".sql.tgz"

/bin/rm $oldBakFile

Last=`date +"%Y年%m月%d日 %H:%M:%S"`

echo 开始:$Begin 结束:$Last $GZDumpFile succ >> $LogFile

cd $BakDir/daily

/bin/rm -f *



参数说明:

–flush-logs

结束当前日志,生成新日志文件。

–delete-master-logs

清除以前的日志,以释放空间。

–quick

该选项在导出大表时很有用,它强制 MySQLdump 从服务器查询取得记录直接输出而不是取得所有记录后将它们缓存到内存中。

–single-transaction

该选项在导出数据之前提交一个 BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于事务表,例如 InnoDB 和 BDB。

–events

导出事件

–master-data=2

其中参数–master-data=[0|1|2]

0: 不记录

1:记录为CHANGE MASTER语句

2:记录为注释的CHANGE MASTER语句

–master-data=2 选项将会在输出SQL中记录下完全备份后新日志文件的名称,

用于日后恢复时参考,例如输出的备份SQL文件中含有:

CHANGE MASTER TO MASTER_LOG_FILE=’MySQL-bin.000002′, MASTER_LOG_POS=106;



六、编写增量备份脚本

切换到/home/mysql目录,执行:

#vim Mysql-DailyBak.sh

-------------------------------------------

#use cp to bakup mysql data everyday!

source etc/profile

BakDir=/home/mysql/backup/daily

BinDir=/home/mysql/mysql-bin

LogFile=/home/mysql/backup/bak.log

BinFile=/home/mysql/mysql-bin/mysql-bin.index

/usr/bin/mysqladmin -uroot -proot flush-logs

Counter=`wc -l $BinFile |awk '{print $1}'`   #产生新的mysql-bin.00000*文件

NextNum=0

#比对$Counter和¥NextNum这两个值来确定文件是不是最新的

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! >> $LogFile

      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


chmod a+x test.sh  --给所有用户执行test.sh读写的权限


七、设置定时任务crontab

在命令行输入:

#crontab -e

添加相应的任务,wq存盘退出

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

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

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

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

(2)查看定时任务:#crontab -l


参数与说明:

crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数 ;

  crontab -l //列出某个用户cron服务的详细内容;

  crontab -r //删除所有用户的cron服务;

  crontab -e //编辑某个用户的cron服务;

  例如:root查看自己的cron设置:crontab -u root -l

  例如:root删除用户fred的cron设置:crontab -u fred -r

补充:

(1)可直接编辑/etc/crontab 文件,即vi /etc/crontab,添加相应的任务(针对整个系统的crontab文件);

(2)crontab执行定时任务的记录会写入到/var/log/cron这个文件中,该记录以帐号为区分。



八、恢复操作

恢复过程亦会写入日志文件,如果数据量很大,建议先关闭binlog日志功能

1、场景:假设早上9点的时候,数据库被攻击,drop了整个数据库!

2、恢复思路:

利用全备的sql文件中记录的CHANGE MASTER语句,binlog文件及其位置点信息,找出binlog文件中增量的那部分。

用mysqlbinlog命令将上述的binlog文件导出为sql文件,并剔除其中的drop语句。

通过全备文件和增量binlog文件导出的sql文件,就可以恢复到完整的数据。


恢复步骤:

(1)首先,解压最新的全量备份文件,进入备份文件目录,执行

#cd /home/mysql/backup

#tar -zxvf XXX.sql.tgz

(2)查看全备之后新增的binlog文件,执行

#grep CHANGE XXX.sql        --全备文件

由图可知,这是全备时刻的binlog文件位置,即mysql-bin.000027的154行,因此在该文件之前的binlog文件中的数据都已经包含在这个全备的sql文件中。


(3)将其他binlog文件(除去mysql-bin.000027)导出sql文件,执行

#mysqlbinlog mysql-bin.00000X >00Xbin.sql

(4) vim编辑最新的00Xbin.sql删除其中的drop语句

(5)恢复全备数据,执行:

#mysql -uroot -p < XXX.sql

如:#mysql -uroot -p < 20210115.sql


(7)恢复增量数据,执行(wmp为数据库名称)

#mysql -uroot -p wpm<00Xbin.sql

如:#mysql -uroot -p wmp<000027bin.sql


补充(若没删除,直接通过增量备份恢复)

若要恢复mysql-bin.000027文件的154行之后的信息

进入到mysql-bin.000027目录,执行(wmp为数据库名)

#cd daily

#mysqlbinlog --start-position=154 --database=wmp mysql-bin.000027 | mysql -uroot -p


至此数据库全部恢复完成


文章转载自IT 邦德,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论