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

MySQL数据库备份数据恢复方案

IT那活儿 2024-09-02
186

点击上方“IT那活儿”公众号--专注于企业全栈运维技术分享,不管IT什么活儿,干就完了!!!


数据库恢复,通过全备+binlog

1.1 故障背景

在数据恢复时,由于binlog2sql不能进行正常使用,目前全备每天有,和binlog也是存在的,全备假如是每天凌晨1点开始,删除整个表的时间是这一天的上午11点左右,需要将数据恢复至删除这个表后新建了某个表(例如表xcc,并且插入了3条数据),需要恢复至早上11点左右数据。

1.2 故障情况

目前这个表有如下数据:
执行了误操作delete将这个表全部删除,模拟生产环境(11点左右):
根据业务提供的误操作时间,找到对应删除的gtid,通过查看,误操作的gitd为a7138436-f646-11ee-909a-000c29a30c89:60
误操作后有个新的表xcc生成,并插入了3条数据。

1.3 数据恢复操作

找到全备(一定要在另外测试环境中恢复,不能直接在生成环境中恢复)
Apply_log:
/opt/work/mysql3310/install/xbk/bin/innobackupex --defaults-file=/opt/work/mysql3311/etc/my.cnf --apply-log  2024-05-02_11-06-28  >>/opt/work/bak/apply_log.log 2>&1 &

Move_back
/opt/work/mysql3310/install/xbk/bin/innobackupex --defaults-file=/opt/work/mysql3311/etc/my.cnf --move-back 2024-05-02_11-06-28 >/opt/work/bak/move_log.log 2>&1 &

启动数据库:此时数据库全备恢复成功,可以看见数据是在的,并且这时候还没有xcc这张表。

1.4 Binlog恢复数据

  • --skip-gtids     ---作用:在导出时,忽略原有的gtid信息,恢复时生成最新的gtid信息;
  • --include-gtids='d60b549f-9e10-11e9-ab04-000c294a1b3b:6','d60b549f-9e10-11e9-ab04-000c294a1b3b:8'       ---截取6和8;
  • --exclude-gtids='d60b549f-9e10-11e9-ab04-000c294a1b3b:6','d60b549f-9e10-11e9-ab04-000c294a1b3b:8'       ---跳过6和8。
我们需要跳过执行delete全表删除的gtid:
a7138436-f646-11ee-909a-000c29a30c89:60
/opt/work/mysql3310/install/mysql5.7.44/bin//mysqlbinlog
--skip-gtids --exclude-gtids='a7138436-f646-11ee-909a-000c29a30c89:60' --start-position=2977
mysql-bin.000014 mysql-bin.000015 >/opt/work/2.sql

1.5 数据导入

将数据导入至测试环境中:

1.6 数据验证

此时可以看见通过binlog可以将数据进行恢复,读取binlog时跳过了删除的gtid,并且也成功恢复了删除后写入的另外的表xcc数据,最后将相应数据和研发核对,没有问题后,将数据导出来后,业务在自行进行导入。


数据库数据恢复(myflash)

2.1 安装

github官网:https://github.com/Meituan-Dianping/MyFlash
[root@xcc install]# unzip MyFlash-master.zip
[root@xcc install]# cd MyFlash-master/
[root@xcc MyFlash-master]# yum install glib2-devel -y
[root@xcc MyFlash-master]# gcc -w `pkg-config --cflags --libs glib-2.0` source/binlogParseGlib.c -o binary/flashback

2.2 使用条件

开启binlog,binlog格式必须为ROW,且binlog_row_image必须为full。
参数:
下面的这些参数是可以任意组合的:
  • databaseNames
    指定需要回滚的数据库名。多个数据库可以用“,”隔开。如果不指定该参数,相当于指定了所有数据库。
  • tableNames
    指定需要回滚的表名。多个表可以用“,”隔开。如果不指定该参数,相当于指定了所有表。
  • start-position
    指定回滚开始的位置。如不指定,从文件的开始处回滚。请指定正确的有效的位置,否则无法回滚。
  • stop-position
    指定回滚结束的位置。如不指定,回滚到文件结尾。请指定正确的有效的位置,否则无法回滚。
  • start-datetime
    指定回滚的开始时间。注意格式必须是 %Y-%m-%d %H:%M:%S。如不指定,则不限定时间。
  • stop-datetime
    指定回滚的结束时间。注意格式必须是 %Y-%m-%d %H:%M:%S。如不指定,则不限定时间。
  • sqlTypes
    指定需要回滚的sql类型。目前支持的过滤类型是INSERT, UPDATE ,DELETE。多个类型可以用“,”隔开。
  • maxSplitSize
    一旦指定该参数,对文件进行固定尺寸的分割(单位为M),过滤条件有效,但不进行回滚操作。
    该参数主要用来将大的binlog文件切割,防止单次应用的binlog尺寸过大,对线上造成压力。
  • binlogFileNames
    指定需要回滚的binlog文件,目前只支持单个文件,后续会增加多个文件支持,目前可以支持多个binlog,直接写绝对路径加上binlog日志文件名,解析多个binlog已分割。
  • outBinlogFileNameBase
    指定输出的binlog文件前缀,如不指定,则默认为binlog_output_base.flashback,生成的二进制恢复数据。
  • logLevel
    仅供开发者使用,默认级别为error级别。在生产环境中不要修改这个级别,否则输出过多。
  • include-gtids
    指定需要回滚的gtid,支持gtid的单个和范围两种形式。
  • exclude-gtids
    指定不需要回滚的gtid,用法同include-gtids。

2.3 测试

找到binlog中找到pos点,开始的pos点为4176,结束的pos点为4371:
[root@xcc binary]# ./flashback --databaseNames=test --tableNames=TestTable --start-position='4176' --stop-position='4371' --
binlogFileNames=/opt/work/mysql3310/binlog/mysql-bin.000009, opt/work/mysql3310/binlog/mysql-bin.000010  --outBinlogFileNameBase=test1back

outBinlogFileNameBase—-这个参数后面是需要恢复的binlog日志,它是解析成binlog进行恢复,不是和binlog2sql解析成对应的sql语句直接导入,需要进行解析binlog方式查看具体内容:
生成的binlog日志:

2.4 恢复

执行如下指令:
[root@xccbinary]#/opt/work/mysql3310/install/mysql5.7.44/bin
/mysqlbinlog -vv --skip-gtids test1back.flashback |
/opt/work/mysql3310/install/mysql5.7.44/bin/mysql -uroot -
p'dengzl123' -S /opt/work/mysql3310/tmp/mysql3310.sock

2.5 数据验证


END


本文作者:幸沉陈(上海新炬中北团队)

本文来源:“IT那活儿”公众号

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

评论