mysql二进制日志恢复数据

1、开启mysql的二进制日志

  在mysql的配置文件my.ini中添加:

  log-bin=mysql-bin(这个名称可以随便取,英文,不知道中文可不可以,没试过)

2、重启mysql

  重启后,假如在mysql的存储数据的目录中出现一下文件,则已经二进制日志已经开启

  

  mysql-bin.000001是mysql的二进制日志文件,不可以直接查看,可以通过导出数据查看,导出数据的语句为

  

  解释一下:红色下划线的是mysql二进制mysql-bin.000001文件所在的目录,要进入这里执行后面的语句,这是我的情况

  mysqlbinlog的语法:

  mysqlbinlog 二进制日志文件 > 目标文件

  要导出到哪里自己决定,但一定先要有这个目录,导出的文件则mysql会自动生成,所以不必新建

3、查看二进制日志状态

  show master status;

  +------------------+----------+--------------+------------------+
  | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
  +------------------+----------+--------------+------------------+
  | mysql-bin.000001 | 349 | | |
  +------------------+----------+--------------+------------------+
  1 row in set (0.00 sec)

4、测试两个例子

  第一个:

   create table bin_test(

    id int,

    name char(32)

  )engine myisam charset utf8;

drop table bin_test;

  注意,下面的语句前面已经说过,必须开启另一个cmd,然后进入mysql-bin.000001的二进制文件的目录中执行

  E:\itcast\GZClass14\GZBasicClass14\web\mysql\data\data>mysqlbinlog mysql-bin.000001 >D:/binlog/binlog.txt

  查看binlog.txt文件

   E:\itcast\GZClass14\GZBasicClass14\web\mysql\data\data>mysqlbinlog mysql-bin.000001 --stop_pos=239 | mysql -uroot -p
  Enter password: ****

  解释一下:--stop_pos=239是上面create语句的位置,mysql二进制恢复数据的原理就是让mysql重新执行二进制里面的sql语句,我们执行限制它的执行位置,让它在哪个位置停止不往下执行

  第二个例子:

  因为刚才的bin_test已经恢复,所以向它插入数据

  mysql> select * from bin_test;
  Empty set (0.00 sec)

  mysql> insert into bin_test values(1,‘hello‘);
  Query OK, 1 row affected (0.08 sec)

  mysql> insert into bin_test values(default,‘hi‘);
  Query OK, 1 row affected (0.00 sec)

  mysql> insert into bin_test values(default,‘guangzhou‘);
  Query OK, 1 row affected (0.00 sec)

  mysql> insert into bin_test values(default,‘lonely‘);
  Query OK, 1 row affected (0.00 sec)

  mysql> select * from bin_test;
  +------+-----------+
  | id | name |
  +------+-----------+
  | 1 | hello |
  | NULL | hi |
  | NULL | guangzhou |
  | NULL | lonely |
  +------+-----------+

  mysql> delete from bin_test;
  Query OK, 4 rows affected (0.08 sec)

  mysql> select * from bin_test;
  Empty set (0.00 sec)

  

  查看二进制日志

create table bin_test(id int,name char(32))engine myisam charset utf8
/*!*/;
# at 481
#160917 15:27:45 server id 1 end_log_pos 549 Query thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1474097265/*!*/;
BEGIN
/*!*/;
# at 549
#160917 15:27:45 server id 1 end_log_pos 650 Query thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1474097265/*!*/;
insert into bin_test values(1,‘hello‘)
/*!*/;
# at 650
#160917 15:27:45 server id 1 end_log_pos 719 Query thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1474097265/*!*/;
COMMIT
/*!*/;
# at 719
#160917 15:28:00 server id 1 end_log_pos 787 Query thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1474097280/*!*/;
BEGIN
/*!*/;
# at 787
#160917 15:28:00 server id 1 end_log_pos 891 Query thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1474097280/*!*/;
insert into bin_test values(default,‘hi‘)
/*!*/;
# at 891
#160917 15:28:00 server id 1 end_log_pos 960 Query thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1474097280/*!*/;
COMMIT
/*!*/;
# at 960
#160917 15:28:09 server id 1 end_log_pos 1028 Query thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1474097289/*!*/;
BEGIN
/*!*/;
# at 1028
#160917 15:28:09 server id 1 end_log_pos 1139 Query thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1474097289/*!*/;
insert into bin_test values(default,‘guangzhou‘)
/*!*/;
# at 1139
#160917 15:28:09 server id 1 end_log_pos 1208 Query thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1474097289/*!*/;
COMMIT
/*!*/;
# at 1208
#160917 15:28:17 server id 1 end_log_pos 1276 Query thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1474097297/*!*/;
BEGIN
/*!*/;
# at 1276
#160917 15:28:17 server id 1 end_log_pos 1384 Query thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1474097297/*!*/;
insert into bin_test values(default,‘lonely‘)
/*!*/;
# at 1384
#160917 15:28:17 server id 1 end_log_pos 1453 Query thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1474097297/*!*/;
COMMIT
/*!*/;
# at 1453
#160917 15:29:11 server id 1 end_log_pos 1521 Query thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1474097351/*!*/;
BEGIN
/*!*/;
# at 1521
#160917 15:29:11 server id 1 end_log_pos 1604 Query thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1474097351/*!*/;
delete from bin_test

另一个cmd窗口执行下面的语句

上面的at 1521的对应点:

不过这个时候恢复数据报错,那是因为我们再恢复数据的时候给了一个终点,没有给起点,所以mysql会从开始一直回复到终点的地方,而二进制文件中已经存在

这个可以对比上面二进制文件的内容

而此刻mysql数据库中已经存在bin_test数据表了,这个是我们前面恢复的,所以sql会报这个错误:

针对这个问题,我们可以给它设置一个恢复数据的启点来解决:

E:\itcast\GZClass14\GZBasicClass14\web\mysql\data\data>mysqlbinlog mysql-bin.000001 --start_pos=549 --stop_pos=1521 | mysql -uroot -p
Enter password: ****

E:\itcast\GZClass14\GZBasicClass14\web\mysql\data\data>

这里的起点位置就是第一次开始插入sql语句的位置,可以对比前面的二进制日志的时间点,这里就不再截图,这里没有报错表示已经成功了

时间: 2024-12-27 21:32:13

mysql二进制日志恢复数据的相关文章

mysql 二进制日志恢复数据实验

一:binlog基础知识 1.mysqlbinlog常见选项: --start-datetime:从二进制日志中读取指定等于时间戳或者晚于本地计算机的时间 --stop--datetime:从二进制日志中读取指定小于时间戳或者等于本地计算机的时间  取值和上述一样 --start-position:从二进制日志中读取指定position事件位置作为起始 --stop-position:从二进制日志中读取指定position事件位置作为事件截止 2.binlog最重要的使用场景 mysql主从复制

MySQL binlog日志恢复数据

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

mysql使用二进制日志恢复数据

一.恢复到某个二进制文件 1.开启二进制日志 在mysqld的配置节点下添加如下配置 log-bin="E:/Mysql57BinLog/binlog"(windows下的路径,linux下自行修改路径)  expire_logs_days=10 max_binlog_size=100M 2.重启mysql服务 使用命令show VARIABLES like '%log_bin%';查看 3.创建库和表 create database mytest; use mytest; creat

通过二进制日志恢复数据

二进制日志会记录所有更改数据库状态的sql操作,比如create drop update...... 二进制日志文件存放在我们的数据目录里,格式如mysql-bin.000001 准备: 进入mysql命令行做如下操作: create database a1; #创建一个a1库 create database a2; #创建一个a2库 drop database a1; #删掉a1库 use a2; create table aaa (name char(40)); #在a2库里创建一个叫aaa

MySQL二进制日志操作

二进制日志 概念 记录对数据发生或潜在发生更改的SQL语句,并且是以二进制格式保存的日志 使用用途 查看数据库变更历史 数据库增量备份 数据库灾难恢复 MySQL复制(主从.主主复制) 二进制日志性能影响 日志即影响MySQL性能又占用大量磁盘空间.因此,往往需要做采样分析时才会打开 即使做采样分析,也最好仅在一台测试机上开启 二进制日志由于用途广泛,大多数情况下会开启.需要制定合理的备份计划和管理策略 开启二进制日志 方法一:不重启修改二进制日志配置 SET @@global.log_bin=

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

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

mysql二进制日志详解及备份恢复、基于mysqldump及lvmsnapshot做备份恢复详解

二进制日志: 时间点恢复 复制 20140411 回顾: 日志文件:6类 一般查询日志:log, general_log, log_output 慢查询日志: 错误日志 二进制日志 中继日志 事务日志 二进制日志:"修改" position:位置 time: 时间 滚动: 1.大小 2.时间 二进制日志的功用: 即时点恢复: 复制: mysql> SHOW MASTER STATUS; mysql> FLUSH LOGS; mysql> SHOW BINARY LOG

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

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

MySQl Study学习之--MySQl二进制日志管理

MySQl Study学习之--MySQl二进制日志管理 MySQL二进制日志(Binary Log):   a.它包含的内容及作用如下:    包含了所有更新了数据或者已经潜在更新了数据(比如没有匹配任何行的一个DELETE)    包含关于每个更新数据库(DML)的语句的执行时间信息    不包含没有修改任何数据的语句,如果需要启用该选项,需要开启通用日志功能    主要目的是尽可能的将数据库恢复到数据库故障点,因为二进制日志包含备份后进行的所有更新    用于在主复制服务器上记录所有将发送