利用Mysqlbinlog恢复数据库数据
关于binlog的详解请参考:http://zlyang.blog.51cto.com/1196234/1833062
binlog日志用于记录所有更新了数据或者已经潜在更新了数据的所有语句。语句以“事件”的形式保存,它描述数据更改。当我们因为某种原因导致数据库出现故障时,就可以利用binlog日志来挽回(前提是已经配置好了binlog),接下来我们来配置
一、开启mysql-binlog日志
在mysql配置文件my.cnf加上如下配置
[mysqld]
log-bin=mysql-bin
binlog_do_db=bin_test
重启mysql
service mysqld restart
二、备份数据库
1)先查看一下当前数据库情况及binlog日志情况:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
3 rows in set (0.00 sec)
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 106 | bin_test | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
2)创建库及数据:bin_test
mysql> create database bin_test;
Query OK, 1 row affected (0.00 sec)
mysql> use bin_test;
Database changed
mysql> create table abc(id int(10) primary key auto_increment,name varchar(255));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into abc(name) value('zhangsan');
Query OK, 1 row affected (0.00 sec)
mysql> insert into abc(name) value('lisi');
Query OK, 1 row affected (0.00 sec)
mysql> insert into abc(name) value('wangwu');
Query OK, 1 row affected (0.00 sec)
mysql> select * from abc;
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan |
| 2 | lisi |
| 3 | wangwu |
+----+----------+
3 rows in set (0.00 sec)
3)备份数据到/tmp/test.sql
[root@localhost ~]# whereis mysqldump
mysqldump: /usr/bin/mysqldump /usr/share/man/man1/mysqldump.1.gz
[root@localhost ~]# /usr/bin/mysqldump -uroot -p123456 bin_test > /tmp/test.sql
4)查看下binlog日志情况:
mysql> show binlog events in 'mysql-bin.000001';
+------------------+-----+-------------+-----------+-------------+-------------------------------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+-------------+-----------+-------------+-------------------------------------------------------------------------------------------+
| mysql-bin.000001 | 4 | Format_desc | 1 | 106 | Server ver: 5.1.73-log, Binlog ver: 4 |
| mysql-bin.000001 | 106 | Query | 1 | 197 | create database bin_test |
| mysql-bin.000001 | 197 | Query | 1 | 337 | use `bin_test`; create table abc(id int(10) primary key auto_increment,name varchar(255)) |
| mysql-bin.000001 | 337 | Intvar | 1 | 365 | INSERT_ID=1 |
| mysql-bin.000001 | 365 | Query | 1 | 471 | use `bin_test`; insert into abc(name) value('zhangsan') |
| mysql-bin.000001 | 471 | Intvar | 1 | 499 | INSERT_ID=2 |
| mysql-bin.000001 | 499 | Query | 1 | 601 | use `bin_test`; insert into abc(name) value('lisi') |
| mysql-bin.000001 | 601 | Intvar | 1 | 629 | INSERT_ID=3 |
| mysql-bin.000001 | 629 | Query | 1 | 733 | use `bin_test`; insert into abc(name) value('wangwu') |
+------------------+-----+-------------+-----------+-------------+-------------------------------------------------------------------------------------------+
9 rows in set (0.00 sec)
三、这时模拟误操作(删除数据库)
此时突然数据库损坏或者人为删除
mysql> drop database bin_test;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
3 rows in set (0.00 sec)
再查看下binlog日志有没有记录删库的操作:
mysql> show binlog events in "mysql-bin.000001";
+------------------+-----+-------------+-----------+-------------+-------------------------------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+-------------+-----------+-------------+-------------------------------------------------------------------------------------------+
| mysql-bin.000001 | 4 | Format_desc | 1 | 106 | Server ver: 5.1.73-log, Binlog ver: 4 |
| mysql-bin.000001 | 106 | Query | 1 | 197 | create database bin_test |
| mysql-bin.000001 | 197 | Query | 1 | 337 | use `bin_test`; create table abc(id int(10) primary key auto_increment,name varchar(255)) |
| mysql-bin.000001 | 337 | Intvar | 1 | 365 | INSERT_ID=1 |
| mysql-bin.000001 | 365 | Query | 1 | 471 | use `bin_test`; insert into abc(name) value('zhangsan') |
| mysql-bin.000001 | 471 | Intvar | 1 | 499 | INSERT_ID=2 |
| mysql-bin.000001 | 499 | Query | 1 | 601 | use `bin_test`; insert into abc(name) value('lisi') |
| mysql-bin.000001 | 601 | Intvar | 1 | 629 | INSERT_ID=3 |
| mysql-bin.000001 | 629 | Query | 1 | 733 | use `bin_test`; insert into abc(name) value('wangwu') |
| mysql-bin.000001 | 733 | Query | 1 | 822 | drop database bin_test |
+------------------+-----+-------------+-----------+-------------+-------------------------------------------------------------------------------------------+
10 rows in set (0.00 sec)
可以看到第20条的操作为删除数据库的操作。
四、此时数据库已经被完全破坏
1)使用mysqlbinlog命令进行恢复;首先在恢复前要确认正确的position起始值与终止值:
mysql> show binlog events in "mysql-bin.000001";
+------------------+-----+-------------+-----------+-------------+-------------------------------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+-------------+-----------+-------------+-------------------------------------------------------------------------------------------+
| mysql-bin.000001 | 4 | Format_desc | 1 | 106 | Server ver: 5.1.73-log, Binlog ver: 4 |
| mysql-bin.000001 | | Query | 1 | 197 | create database bin_test |
| mysql-bin.000001 | 197 | Query | 1 | 337 | use `bin_test`; create table abc(id int(10) primary key auto_increment,name varchar(255)) |
| mysql-bin.000001 | 337 | Intvar | 1 | 365 | INSERT_ID=1 |
| mysql-bin.000001 | 365 | Query | 1 | 471 | use `bin_test`; insert into abc(name) value('zhangsan') |
| mysql-bin.000001 | 471 | Intvar | 1 | 499 | INSERT_ID=2 |
| mysql-bin.000001 | 499 | Query | 1 | 601 | use `bin_test`; insert into abc(name) value('lisi') |
| mysql-bin.000001 | 601 | Intvar | 1 | 629 | INSERT_ID=3 |
| mysql-bin.000001 | 629 | Query | 1 | | use `bin_test`; insert into abc(name) value('wangwu') |
| mysql-bin.000001 | 733 | Query | 1 | 822 | drop database bin_test |
+------------------+-----+-------------+-----------+-------------+-------------------------------------------------------------------------------------------+
10 rows in set (0.00 sec)
此时我们已经确认“起始值”为创建库时的起始:106;"终止值"为drop库时的前一句的结束:733
2)使用mysqlbinlog进行恢复:
mysqlbinlog --no-defaults --start-position="106" --stop-position="733" /var/lib/mysql/mysql-bin.000001 |mysql -uroot -p
Enter password:
3)查看下数据是否恢复成功:
11mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| bin_test |
| mysql |
| test |
+--------------------+
4 rows in set (0.00 sec)
11mysql> select * from bin_test.abc;
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan |
| 2 | lisi |
| 3 | wangwu |
+----+----------+
3 rows in set (0.00 sec)
3)恢复成功
【总结】:mysql备份和bin-log日志
备份数据:
mysqldump -uroot -p123456 bin_test -l -F '/tmp/test.sql'
-l:读锁(只能读取,不能更新)
-F:即flush logs,可以重新生成新的日志文件,当然包括log-bin日志
查看binlog日志:
mysql>show master status
如果数据较多,先导入之前备份数据:
mysql -uroot -p123456 bin_test -v -f </tmp/test.sql
-v查看导入的详细信息
-f是当中间遇到错误时,可以skip过去,继续执行下面的语句
恢复binlog-file二进制日志文件:
mysqlbinlog --no-defaults binlog-file | mysql -uroot -p123456
从某一(567)点开始恢复:
mysqlbinlog --no-defaults --start-position="567" mysql-bin.000001| mysql -uroot -p123456 test
先查好那一点(用more来查看)
[root@localhost mysql]# /usr/bin/mysqlbinlog --no-defaults mysql-bin.000001 --start-position="794" --stop-position="1055" | more
然后恢复:
[root@localhost mysql]# /usr/bin/mysqlbinlog --no-defaults mysql-bin.000001 --start-position="794" --stop-position="1055" | /usr/bin/mysql -uroot -p123456 test
重置binlog日志
mysql> reset master;
Query OK, 0 rows affected (0.01 sec)
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 106 | | |
+------------------+----------+--------------+------------------+
mysql> flush logs;#关闭当前的二进制日志文件并创建一个新文件,新的二进制日志文件的名字在当前的二进制文件的编号上加1。
利用Mysqlbinlog恢复数据库数据的更多相关文章
- 实战演习:mysqlbinlog恢复bin-log数据
mysqlbinlog恢复bin-log数据 Binlog日志即binary log,是二进制日志文件,有两个作用,一个是增量备份,另一个是主从复制,即从节点同步主节点数据时获取的即是bin-log, ...
- SQL中利用脚本恢复数据库
SQL中利用脚本恢复数据库 编写人:CC阿爸 2014-6-15 在日常SQL数据库的操作中,如何恢复数据库 use master drop database SCS1 RESTORE DATAB ...
- CentOS下利用mysqlbinlog恢复MySQL数据库
如果不小心对数据库进行误操作,而又没有及时备份怎么办?这恐怕是广大的coder经常遇到的一类问题.我今天就因为不小心删除了某个数据库,但最后的备份是1个礼拜前的,唯一能解决的办法就是通过mysqlbi ...
- 如何通过Mysql的二进制日志恢复数据库数据
经常有网站管理员因为各种原因和操作,导致网站数据误删,而且又没有做网站备份,结果不知所措,甚至给网站运营和盈利带来负面影响.所以本文我们将和大家一起分享学习下如何通过Mysql的二机制日志(binlo ...
- (转)mysql5.7 根据二进制文件mysqlbinlog恢复数据库 Linux
原文:http://blog.csdn.net/qq_15058425/article/details/61196085 1.开始mysqlbinlog日志功能 先找打my.cnf文件的位置: 2.编 ...
- MySql通过Data恢复数据库数据
公司的服务器开不了机,把硬盘装在其他机器上面,文件是没有丢失,可是数据库开不了了.上网查了下,用DATA恢复了数据. 1.先通过MYSQL目录下的my.ini配置文件找到 datadir的文件夹地址. ...
- 利用dbms_backup_restore恢复数据库
测试环境:OEL+11.2.0.1 实例名:orcl2 DBID:1336959433 场景:Oracle数据库的存储坏了,数据文件和控制文件全部丢失,只有数据文件的备份集,且备份集中无控制文件.(当 ...
- mysqlbinlog恢复误删数据
概述 代码bug,在处理上传出现异常时执行了DELETE FROM t_resource WHERE resource_id = ? OR parent_id = ?因为OR条件导致用户的上传的所有数 ...
- 利用nodejs读取数据库数据生成树结构的json数据
在做后台管理界面的时候,几乎少不了的一个结构就是树形结构,用来做菜单导航: 那么,最希望的就是树结构的所有数据都是读取的数据库,而不是直接代码当中写死,那我们就一步一步来看: 一,建表 字段通常包括: ...
随机推荐
- Linux网络安全篇,认识防火墙(三),TCP Wrappers
1.防火墙设置文件 任何以xinetd管理的服务都可以通过 /etc/hosts.allow /etc/hosts.deny 这两个文件来设置防火墙(针对源IP或域进行允许或操作的设置). 其实/et ...
- C语言 刷新缓冲区
fflush int fflush(FILE* stream); 用于清空文件缓冲区,如果文件是以写的方式打开 的,则把缓冲区内容写入文件. eg: 1. #include <stdio.h&g ...
- MODIS系列之NDVI(MOD13Q1)三:.jdk文件配置+MRT安装
MRT(MODIS Reprojection Tool)简介: MODIS的全称为中分辨率成像光谱仪(Moderate-Resolution Imaging Spectroradiometer),是搭 ...
- 30.1 HashSet存储自定义对象 未去重解决
问题: package day30_HashSet; import java.util.HashSet; /* * 通过hashset存储自定义对象,没有进行去重. * * */ public cla ...
- Python爬虫系列(四):Beautiful Soup解析HTML之把HTML转成Python对象
在前几篇文章,我们学会了如何获取html文档内容,就是从url下载网页.今天开始,我们将讨论如何将html转成python对象,用python代码对文档进行分析. (牛小妹在学校折腾了好几天,也没把h ...
- python如何操作excel 基础代码
一 基础操作1打开excel表格并获取表格名称 wookbook = load_workbook(filename = 表格文件路径) (注意只能打开存在的表格,不能用该方法创建一个新表格文件) wo ...
- go中的error小结
go中的error error和panic error接口 go中err的困局 推荐方法 总结 参考 go中的error go中的错误处理,是通过返回值的形式来出来,要么你忽略,要么你处理(处理也可以 ...
- leetcode c++做题思路和题解(4)——队列的例题和总结
队列的例题和总结 0. 目录 栈实现队列 队列实现栈 滑动窗口最大值 1. 栈实现队列 FIFO和FILO,相当于+-号,互转都是利用"负负得正"的原理. 官方解答中第二种思路很6 ...
- ConcurrentHashMap 同步安全 的真正含义(stringbuff 是同步安全的,stringbutter 不安全)
同步安全的集合,在多线程下用到这个map是安全的,但这个安全指的是什么?线程安全指的是指get.remove.put等操作时即同一对象,同一时间只有一个线程能在这几个方法上运行,也就是说线程安全是在这 ...
- 浅谈requests库
本文为博客园ShyButHandsome的原创作品,转载请注明出处 右边有目录,方便快速浏览 安装 pip install requests # 是requests而不是request(有s的) re ...