使用全备+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 [email protected]:test3> select * from student;
+------+--------+-------+---------+
| id   | name   | age   | class   |
|------+--------+-------+---------|
| 4    | 2      | 20    | B       |
| 5    | 2      | 21    | B       |
+------+--------+-------+---------+

恢复后的数据

mysql [email protected]:test3> select * from student;
+------+--------+-------+---------+
| id   | name   | age   | class   |
|------+--------+-------+---------|
| 4    | 2      | 21    | B       |
| 5    | 2      | 21    | B       |
+------+--------+-------+---------+

可以看到,SQL1执行了,SQL2没有执行。

其他

  1. 要定期全备,不然恢复的时候需要恢复大量的binlog日志,容易出错
  2. 操作恢复前,做好备份
  3. 除了用位置筛选binlog日志,还可以用时间
  4. 有些恢复需要跨多个binlog文件

未经允许,请不要转载

原文地址:https://www.cnblogs.com/Xjng/p/11401850.html

时间: 2024-09-30 04:22:02

使用全备+binlog日志恢复数据库的相关文章

MySQL binlog日志恢复数据

我们了解了MySQL 的 binlog 日志的开启方式以及 binlog 日志的一些原理和常用操作,我们知道,binlog 有两大作用,一个是使用 binlog 恢复数据,另一个就是用来做主从复制.本篇笔记就是来记录如何使用 binlog 日志来做数据恢复.当然了,使用 binlog 日志所恢复的数据只能是部分数据,并不能够使用 binlog 日志来做数据库的备份,如果想要做数据库备份,依然要使用我们传统的备份方法,而 binlog 可以作为增量备份. 视频链接:http://www.ronco

mysqldump备份结合binlog日志恢复

http://hongge.blog.51cto.com/ MySQL备份一般采取全库备份加日志备份的方式,例如每天执行一次全备份,每小时执行一次二进制日志备份.这样在MySQL故障后可以使用全备份和日志备份将数据恢复到最后一个二进制日志备份前的任意位置或时间. 1.binlog介绍 mysql的二进制日志记录着该数据库的所有增删改的操作日志(前提是要在自己的服务器上开启binlog),还包括了这些操作的执行时间.为了显示这些二进制内容,我们可以使用mysqlbinlog命令来查看. Binlo

如何通过Mysql的二进制日志恢复数据库数据

经常有网站管理员因为各种原因和操作,导致网站数据误删,而且又没有做网站备份,结果不知所措,甚至给网站运营和盈利带来负面影响.所以本文我们将和大家一起分享学习下如何通过Mysql的二机制日志(binlog)来恢复数据. 系统环境: 操作系统:CentOS 6.5 X64  (虚拟机): WEB服务:PHP+Mysql+apache: 网站:为方便,直接在本地用蝉知系统搭建一个DEMO站点: 操作步骤: 1.开启binlog功能及基本操作: 2.往站点添加数据: 3.刷新binlog日志: 4.删除

通过binlog日志恢复表记录

使用binlog日志 1 使用binlog日志1.1 问题 利用binlog恢复库表,要求如下: 启用binlog日志 创建db1库tb1表,插入3条记录 删除tb1表中刚插入的3条记录 使用mysqlbinlog恢复删除的3条记录 1.2 步骤 实现此案例需要按照如下步骤进行. 步骤一:启用binlog日志 1)调整/etc/my.cnf配置,并重启服务 [[email protected] ~]# vim /etc/my.cnf [mysqld] .. .. log-bin-index=my

Mysql之binlog日志说明及利用binlog日志恢复数据操作记录

众所周知,binlog日志对于mysql数据库来说是十分重要的.在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全备份+binlog日志恢复增量数据部分),化险为夷! 废话不多说,下面是梳理的binlog日志操作解说: 一.初步了解binlogMySQL的二进制日志binlog可以说是MySQL最重要的日志,它记录了所有的DDL和DML语句(除了数据查询语句select),以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的. DDL-

mysql数据库通过bin-log日志恢复数据

binlog日志用于记录所有更新数据,当我们的数据库出现故障时,我们可以利用binlog日志来挽回. 如果mysql数据库出现问题需要重新创建binlog二进制文件. # 关闭当前的binlog日志并创建一个新日志文件,编号加1. flush logs # 查看日志,查出需要恢复的时间点 mysqlbinlog --no-defaults fangx-bin.000001 |more #恢复具体时间导成SQL语句 mysqlbinlog fangx-bin.000001 --database=f

mysql-binlog日志恢复数据库

binlog日志用于记录所有更新了数据或者已经潜在更新了数据的所有语句.语句以“事件”的形式保存,它描述数据更改.当我们因为某种原因导致数据库出现故障时,就可以利用binlog日志来挽回(前提是已经配置好了binlog),接下来我们来配置 一.开启mysql-binlog日志 在mysql配置文件my.cnf加上如下配置 [mysqld] log-bin=mysql-bin 重启mysql service mysqld restart 二.备份数据库 1)先查看一下当前数据库情况 mysql>

MySQL使用二进制日志恢复数据库

一.二进制日志简介 MySQL有不同类型的日志,其中二进制文件记录了所有对数据库的修改,如果数据库因为操作不当或其他原因丢失了数据,可以通过二进制文件恢复. 在my.ini文件中设置了log-bin,重新启动MySQL后就开启了二进制日志.数据库每次重新启动(或执行flush logs命令)后,都会生成一个新的二进制日志,如在在my.ini文件中设置了 log-bin=F:\mysqllog\logbin 则数据库第一次启动会生成logbin.000001,第二次启动会生成logbin.0000

MySQL利用binlog来恢复数据库

1.根据binlog解析出所有ring数据库的所有sql [[email protected] ]$ mysqlbinlog --no-defaults --database=ring --start-datetime="2005-04-20 9:55:00" --stop-datetim="2009-04-08 08:05:00" /u01/mysql/log/mysql-bin.000005 > /u01/mysql/log/mysql_restore5.