TimeM

青春不散场

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包
下载地址
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

 

晓楠

时光不老,青春不散

发表评论

电子邮件地址不会被公开。