您的位置:首页 > 数据库 > MySQL

mysql通过binlog恢复数据的几种情况

2017-07-13 18:29 489 查看
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包

下载地址
https://github.com/58daojia-dba/mysqlbinlog_flashback
基于binlog恢复工具mysqlbinlog_flashback

简介

mysqlbinlog_back.py 是在线读取row格式的mysqld的binlog,然后生成反向的sql语句的工具。

一般用于数据恢复的目的。 所谓反向的sql语句就是如果是insert,则反向的sql为delete。

如果delete,反向的sql是insert,如果是update, 反向的sql还是update,但是update的值是原来的值。

这个项目需要安装

 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的使用

用途

    数据回滚

    主从切换后数据不一致的修复

    从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/mysqlbinlo 4000
g_flashback 源码社区
http://www.cnblogs.com/liujingyuan789/p/6674756.html binlog2sql 实战心得
http://blog.csdn.net/shudaqi2010/article/details/54412895 原创工具binlog2sql:从MySQL binlog得到你要的SQL
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息