MySQL通过binlog进行数据恢复

采用binlog恢复数据的两种情况

1.数据库丢失或者drop

    1)恢复系统自动备份

    2)用binlog恢复系统备份时间到此刻的的数据(drop操作需要binlog删除drop记录)

2.误操作update,delete

    1)恢复系统自动备份

    2)在binlog日志中删除误操作的操作语句,执行binlog恢复其他的数据
或者
在binlog中找到误操作的记录,用脚本回滚生成sql,进行恢复 一般用 mysqlbinlog_flushback,binlog2sql
一般误操作之后把数据库设置成锁表只读

这个时候记得赶紧加一个全局读锁,防止有新的写入发生 flush tables with read lock;

mysqlbinlog_flushback使用限制

1.支持mysql版本为MySQL 5.5 and 5.6.因为底层使用的是python-mysql-replication包。
2.数据库必须是row格式的。
3.反向生成的表必须有主键。
4.日志必须在主库存在
5.反向生成的mysql数据类型列出在下面。没有列出的类型没有经过严格的测试,也许有问题
6.支持的类型
        允许解析的字段类型,不在里面的会报错
  
ALLOW_TYPE={ "varchar":True, "char":True, "datetime":True, "date":True, "time":True, "timestamp":True, "bigint":True, "mediumint":True, "smallint":True, "tinyint":True, "int":True, "smallint":True, "decimal":True, "float":True, "double":True, "longtext":True, "tinytext":True, "text":True, "mediumtext":True }

数据恢复的操作过程和步骤

设置多实力的配置参数
server-id = 1  (在用到flushback.py时必须是主从复制)
socket=/mysql/server/mysql/mysql1.sock
port=3306
pid-file=/mysql/server/mysql/mysql1.pid
datadir=/mysqldata/data1
log-bin = mysql1-bin(生成的binlog名)
log-bin-index = mysql1-bin.index(记录binlog日志文件夹)
binlog_cache_size=1200K
binlog_format = ROW(binlog的生成模式statement(SBR) ROW MIXED)
wait_timeout=2880000
interactive_timeout = 2880000
max_allowed_packet = 256M(一个sql最大的长度)

一丶数据库丢失

1.创建数据库 
create database kuaiyun

2.找到系统的自动备份  kuaiyun.sql

3.导入数据库备份数据

mysql -h127.0.0.1 -P3306 -uroot -p kuaiyun < kuaiyun.sql

备份数据库

/mysql/server/mysql/bin/mysqldump -h127.0.0.1 -P3306 -uroot -p jingan >/root/jingan.sql

查看binlog文件  找到时间和位点 (尽量用位点)

 mysqlbinlog --base64-output=decode-rows -v mysql1-bin.000004(解码,在查看位点的是解码,在导入binlog数据时不解码)

4.在binlog文件中找到系统自动备份时间节点,比如时间是2017-07-12 03:30:00 或者节点数999

mysqlbinlog --start-datetime="2017-07-12 03:30:00" ./mysql-bin.000001 |mysql -h127.0.0.1 -P3306 -uroot -p kuaiyun

mysqlbinlog --start-position=999 ./mysql-bin.000001 |mysql -h127.0.0.1 -P3306 -uroot -p kuaiyun

二丶误操作drop数据库

方法可以和数据库丢失一样,但是要找到执行drop的位点,排除drop的操作或者通过flushback或者binlog2sql恢复drop的文件

用mysqlbinlog_flushback恢复drop的文件

1.下载flushback包
   1 ). 下载地址
    https://github.com/58daojia-dba/mysqlbinlog_flashback
    基于binlog恢复工具mysqlbinlog_flashback
  2 ).简介
    mysqlbinlog_back.py 是在线读取row格式的mysqld的binlog,然后生成反向的sql语句的工具。
    一般用于数据恢复的目的。 所谓反向的sql语句就是如果是insert,则反向的sql为delete。
    如果delete,反向的sql是insert,如果是update, 反向的sql还是update,但是update的值是原来的值。
 3 ).这个项目需要安装
    python-pip
    pip install pymysql
    安装pip
    安装pip,最新版本为1.4 这里以1.3版本为例
wget http://pypi.python.org/packages/source/p/pip/pip-1.3.tar.gz
    tar zxvf pip-1.3.tar.gz
    cd pip-1.3
    python setup.py install
或者使用pip的安装脚本get-pip.py
    
wget https://raw.github.com/pypa/pip/master/contrib/get-pip.py
python get-pip.py
2.利用脚本生成回滚sql
   
 python mysqlbinlog_back.py --help 看在线的帮助
    python mysqlbinlog_back.py --host="127.0.0.1" --port=3306 --username="root" --password="" --schema=local_world -- tables="area_template" -S "mysql1-bin.000002" -L "2000"
3.生成的sql文件在./log目录下
    flashback_local_world_20170713_141202.sql
4.把生成的sql文件导入进数据库,相当于数据库的所有sql
    1)创建同名数据库  create dtaabase local_world;
    2)mysql -h127.0.0.1 -P3306 -uroot -p kuaiyun < flashback_local_world_20170713_141202.sql
完成
误操作update,delete
利用备份+binlog恢复
1.和drop的一样但是一定要在binlog中排除掉update和delete操作,找准位点
***利用工具生成sql
不用创建数据库,和drop操作一样

三丶其他---binlog2sql的使用

用途
    数据回滚
    1 ) .主从切换后数据不一致的修复
    2 ) .从binlog生成标准SQL,带来的衍生功能

安装
$ git clone https://github.com/danfengcao/binlog2sql.git
$ pip install -r requirements.txt
基本用法
解析出标准SQL
$ python binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' -d dbname -t table1 table2 --start-file='mysql-bin.000002' --start-pos=1240
输出:
INSERT INTO d(`did`, `updateTime`, `uid`) VALUES (18, '2016-12-07 14:01:14', 4);
INSERT INTO c(`id`, `name`) VALUES (0, 'b');
UPDATE d SET `did`=17, `updateTime`='2016-12-07 14:01:14', `uid`=4 WHERE `did`=18 AND `updateTime`='2016-12-07 14:01:14' AND `uid`=4 LIMIT 1;
DELETE FROM c WHERE `id`=0 AND `name`='b' LIMIT 1;
解析出回滚SQL
$ python binlog2sql.py --flashback -h127.0.0.1 -P3306 -uadmin -p'admin' -d dbname -t table1 table2 --start-file='mysql-bin.000002' --start-pos=1240
输出:
INSERT INTO c(`id`, `name`) VALUES (0, 'b');
UPDATE d SET `did`=18, `updateTime`='2016-12-07 14:01:14', `uid`=4 WHERE `did`=17 AND `updateTime`='2016-12-07 14:01:14' AND `uid`=4 LIMIT 1;
DELETE FROM c WHERE `id`=0 AND `name`='b' LIMIT 1;
DELETE FROM d WHERE `did`=18 AND `updateTime`='2016-12-07 14:01:14' AND `uid`=4 LIMIT 1;
具体参数用法

python binlog2sql.py --help

参考相关文档
http://blog.csdn.net/jerry____wang/article/details/56285859   基于binlog恢复工具mysqlbinlog_flashback
http://www.cnblogs.com/martinzhang/p/3454358.html MySQL的binlog日志
http://blog.csdn.net/lxpbs8851/article/details/39316589 mysqlbinlog 查看执行的sql (row模式)
https://www.ilanni.com/?p=7911 烂泥:通过binlog恢复mysql数据库
https://yq.aliyun.com/articles/43163 学习mysql的binlog配置 
http://www.cnblogs.com/langtianya/p/5504774.html mysql中binlog_format模式与配置详解
http://www.linuxidc.com/Linux/2014-11/108811.htm CentOS/Ubuntu下安装Python-Pip和Fabric
https://github.com/58daojia-dba/mysqlbinlog_flashback 源码社区
http://www.cnblogs.com/liujingyuan789/p/6674756.html binlog2sql 实战心得
http://blog.csdn.net/shudaqi2010/article/details/54412895 原创工具binlog2sql:从MySQL binlog得到你要的SQL
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章