使用全备+binlog日志恢复数据库
1.binlog日志类型
- Statement 只记录执行的sql语句,磁盘占用少,但是恢复的时候容易出问题。InodeDB不能使用Statement 。
- Row 记录修改后的具体数据,磁盘占用较多
- Mixed 上面两种混合,mysqlsql根据具体情形,选择较好的方案
查看当前的类型:
show variables like 'binlog_format'
/etc/my.cnf 里面的binlog_format参数
2. 恢复方式
全备+恢复部分binlog日志
3.恢复方法
1. 全备
mysqldump -uroot -pfjselinfgsiengiseg test3 > /data1/test3.sql.
2. 执行操作
SQL1:update student set age=21 where id=4;
SQL2:update student set age=22 where id=5;
这时执行了两个sql,对应的是两个事务。
如果我们想把数据库状态恢复到执行SQL1之后
3.刷新日志
要刷新日志后,我们才能查看日志,找到需要恢复的binlog
执行:
flush logs;
4. 找到最新的日志
找到binlog日志:/var/lib/mysql/mysql-bin.000031
5. 分析日志
mysql执行:
show binlog events in "mysql-bin.000031"
- Log_name 日志文件名
- Pos 事件的开始位置
- Event_type事件类型
- Server_id服务器ID,和主从关系的server_id对应
- End_log_pos 事件的结束位置
- Info 事件信息
找到刚才的两次事务
|
mysql-bin.000031 | 6622 | Query | 1 | 6691 | BEGIN |
| mysql-bin.000031 | 6691 | Table_map | 1 | 6745 | table_id: 308 (test3.student) |
| mysql-bin.000031 | 6745 | Update_rows | 1 | 6801 | table_id: 308 flags: STMT_END_F |
| mysql-bin.000031 | 6801 | Xid | 1 | 6828 | COMMIT /* xid=6771600 */ |
| mysql-bin.000031 | 6828 | Query | 1 | 6897 | BEGIN |
| mysql-bin.000031 | 6897 | Table_map | 1 | 6951 | table_id: 308 (test3.student) |
| mysql-bin.000031 | 6951 | Update_rows | 1 | 7007 | table_id: 308 flags: STMT_END_F |
| mysql-bin.000031 | 7007 | Xid | 1 | 7034 | COMMIT /* xid=6771607 */ |
| mysql-bin.000031 | 7034 | Rotate | 1 | 7077 | mysql-bin.000032;pos=4 |
+------------------+-------+--------------+-------------+---------------+-----------------------------------------------------------------------------+
BEGIN是开始事务
COMMIT是提交事务
所以我们需要恢复的是6622 到 6828
6.重新建库
把旧的test3数据库改名,或者删除。建议先备份
drop database test3;
创建数据库test3
create database test3;
导入全备份
source /data1/test3.sql;
恢复部分binlog日志
mysqlbinlog --start-position=6622 --stop-position=6828 --database=test3 /var/lib/mysql/mysql-bin.000031 |mysql -uroot -pfjselinfgsiengiseg -D test3
- start-position 开始位置
- stop-position 结束位置
- database 只获取test3库的日志
- /var/lib/mysql/mysql-bin.000031 binlog日志路径
mysqlbinlog 命令会把对应的binlog日志转换为sql语句,导出来,然后通过mysql命令来执行sql语句
恢复前的数据:
mysql root@localhost:test3> select * from student;
+------+--------+-------+---------+
| id | name | age | class |
|------+--------+-------+---------|
| 4 | 2 | 20 | B |
| 5 | 2 | 21 | B |
+------+--------+-------+---------+
恢复后的数据
mysql root@localhost:test3> select * from student;
+------+--------+-------+---------+
| id | name | age | class |
|------+--------+-------+---------|
| 4 | 2 | 21 | B |
| 5 | 2 | 21 | B |
+------+--------+-------+---------+
可以看到,SQL1执行了,SQL2没有执行。
其他
- 要定期全备,不然恢复的时候需要恢复大量的binlog日志,容易出错
- 操作恢复前,做好备份
- 除了用位置筛选binlog日志,还可以用时间
- 有些恢复需要跨多个binlog文件
未经允许,请不要转载
使用全备+binlog日志恢复数据库的更多相关文章
- Mysql之binlog日志说明及利用binlog日志恢复数据操作记录
众所周知,binlog日志对于mysql数据库来说是十分重要的.在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全备份+binlog日志恢复增量数据部分),化险为夷! 一 ...
- 解说mysql之binlog日志以及利用binlog日志恢复数据
众所周知,binlog日志对于mysql数据库来说是十分重要的.在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全备份+binlog日志恢复增量数据部分),化险为夷! 废 ...
- 如何通过Mysql的二进制日志恢复数据库数据
经常有网站管理员因为各种原因和操作,导致网站数据误删,而且又没有做网站备份,结果不知所措,甚至给网站运营和盈利带来负面影响.所以本文我们将和大家一起分享学习下如何通过Mysql的二机制日志(binlo ...
- Mysql利用binlog日志恢复数据操作(转)
a.开启binlog日志:1)编辑打开mysql配置文件/etc/mys.cnf[root@vm-002 ~]# vim /etc/my.cnf在[mysqld] 区块添加 log-bin=mysql ...
- MySQL的binlog日志恢复(转)
binlog 基本认识 MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日 ...
- 【转】Mysql之binlog日志说明及利用binlog日志恢复数据操作记录
众所周知,binlog日志对于mysql数据库来说是十分重要的.在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全备份+binlog日志恢复增量数据部分),化险为夷! 废 ...
- 使用Binlog日志恢复误删的MySQL数据
解到: MySQL的binlog日志是什么?通常是用来干什么的? 模拟一次误删数据的操作,并且使用binlog日志恢复误删的数据. 写这篇文章的初衷,是有一次我真的险些把测试数据库的一张表给删除了,当 ...
- MySQL二进制binlog日志说明以及利用binlog日志恢复数据
MySQL的binlog日志对于mysql数据库来说是十分重要的.在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全量备份+binlog日志恢复增量数据部分). 一.关于 ...
- MySQL通过binlog日志恢复数据
一.查看下自己的MySQL是否开启了binlog日志 # 是否启用binlog日志 OFF:关闭 ON:开启 show variables like 'log_bin'; 二.开启binlog日志 在 ...
随机推荐
- P5325 【模板】Min_25筛
题意:定义积性函数f(x)f(x)f(x),且f(p^k)=p^k*(p^k−1) (p是一个质数),求f(1)+f(2)+...f(n); 思路:板子题.重新打了一份装起来. /* 定义积性函数 ...
- Maven的下载以及配置
Maven的下载以及配置 Maven的两大核心作用: (1)依赖管理:对Jar包的依赖,解决Jar包之间的冲突 (2)项目构建:项目从编译到测试到运行发布 一.Mavenu的下载(现在的eclipse ...
- sleep、yield、wait、join的区别(阿里)
只有runnable到running时才会占用cpu时间片,其他都会出让cpu时间片.线程的资源有不少,但应该包含CPU资源和锁资源这两类.sleep(long mills):让出CPU资源,但是不会 ...
- applyMiddleware 沉思录
let newStore = applyMiddleware(mid1, mid2, mid3, ...)(createStore)(reducer, null); 给({ getState, dis ...
- 修改mysql 8.0.16 root 密码--mac
https://blog.csdn.net/HECTOR_1368391900/article/details/90732097 https://my.oschina.net/u/3251146/bl ...
- IDEA创建Mybatis的配置文件---sqlMapConfig.xml
Mybatis的配置文件不像Spring的配置文件,在Maven当中添加过依赖之后就可以在下面这个地方打开,需要自己去手动去编写配置文件,但是自己编写的话会记不住要引入的DTD,所以就需要自己创建一个 ...
- @EnableFeignClients 客户端详细
在Spring cloud应用中,当我们要使用feign客户端时,一般要做以下三件事情 : 1.使用注解@EnableFeignClients启用feign客户端: 示例 : @SpringBootA ...
- 牛客网CSP-S提高组赛前集训营Round4
牛客网CSP-S提高组赛前集训营 标签(空格分隔): 题解 算法 模拟赛 题目 描述 做法 \(BSOJ6377\) 求由\(n\)长度的数组复制\(k\)次的数组里每个连续子序列出现数字种类的和 对 ...
- A1138 | 根据前序、中序生成后序
参考了博客上码量不到50行的代码,完成了这题的AC重构.感觉真的基础很重要,这题其实是很简单的一道树的前中后序的题目.但是我之前练习的时候,都是用的自己总结的骚套路,虽然理解起来很直观,但是用了动态数 ...
- NodeJS基础学习总结
一.nodeJS解释 JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充当了解析器的角色.而对于需要独立运行的JS,NodeJS就是一个解析器. 每一种解析器都是 ...