采用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

参考相关文档


   基于binlog恢复工具mysqlbinlog_flashback


MySQL的binlog日志


mysqlbinlog 查看执行的sql (row模式)


https://www.ilanni.com/?p=7911 烂泥:通过binlog恢复mysql数据库


https://yq.aliyun.com/articles/43163 学习mysql的binlog配置 


mysql中binlog_format模式与配置详解


http://www.linuxidc.com/Linux/2014-11/108811.htm CentOS/Ubuntu下安装Python-Pip和Fabric


https://github.com/58daojia-dba/mysqlbinlog_flashback 源码社区


binlog2sql 实战心得


原创工具binlog2sql:从MySQL binlog得到你要的SQL