mysql二进制日志bin-log的基本了解,以及简单使用的案例

前言:

    bib-log二进制日志,是从网上查询主从复制的配置中了解的,下面摘抄至网上的基本介绍: 

 

 binlog 基本认识
    MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。

    一般来说开启二进制日志大概会有1%的性能损耗(参见MySQL官方中文手册 5.1.24版)。二进制有两个最重要的使用场景: 
    其一:MySQL Replication在Master端开启binlog,Mster把它的二进制日志传递给slaves来达到master-slave数据一致的目的。 
    其二:自然就是数据恢复了,通过使用mysqlbinlog工具来使恢复数据。
    
    二进制日志包括两类文件:二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件,二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句)语句事件。

 

一、如何开启这个日志呢?

 

    1.1   在my.ini中配置log-bin,它等于配置了三个变量 log_bin, l og_bin_basename, log_bin_index 

[mysqld]
basedir=D:\mysql-5.6.10-win32
datadir=D:\mysql-5.6.10-win32\data
port=3306
server_id=3306
#开启二进制日志
log-bin=mysql-bin

    参数解释: 第一个是开启,第二个是文件存放的目录及文件前缀(mysql-bin.000001),第三个是文件索引(等于n个版本的日志文件,用mysql-bin.index记录版本)

    1.2 配置好了就要查看下,默认是不开启的,用show variables like 'log_%' 查询。

    mysql二进制日志bin-log的基本了解,以及简单使用的案例_第1张图片

    备注:  show variables like 一般用于一些固定配置量  show status like 一般查一些运行时状态,比如 show variables like 'max_connections%', 查最大链接配置。show status like 'thread%' 查运行中打开了多少线程。

     mysql二进制日志bin-log的基本了解,以及简单使用的案例_第2张图片

    二、基本的一些命令操作

        flush logs 生成一份新的文件比如mysql-bin.000002 (重启就会生成一份新的文件)

        show master status   查询当前的记录文件和最大position

        show binlog events   查询里面的内容,默认查询最新一份的。

         ---------------------show binlog events in mysql-bin.000002 from 4 limit 10  //指定文件,指定位置,指定数量

     mysqlbinlog mysql-bin.000001 --start-position=startPosition --stop-position=endPosition | mysql -uroot -p 123456 myTestDatabase  //注意:这个不是mysql语句,是./bin下执行的,用来恢复数据用。没加数据库是全部数据库。

    三、 实战

        3.1    flush logs ; 首先刷一份新的log出来,记录新的操作日志。

        3.2  建立一个库,一个表,插入N条数据

create database if not EXISTS mytest; #创建库
use mytest;
drop table if exists `blog`; #删除表
create table `blog` (  #创建表
	`id` int(11) not null auto_increment,
	`title` varchar(200) not null,
	`content` varchar(8000) not null,
	PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
INSERT INTO `blog` VALUES ('6', 'werw', 'erwer'); #插入数据
INSERT INTO `blog` VALUES ('7', 'weewr', 'werwer');
INSERT INTO `blog` VALUES ('8', 'werw', 'erwerwer');
INSERT INTO `blog` VALUES ('9', 'werwe', 'rwerwer');
INSERT INTO `blog` VALUES ('10', 'werw', 'erwer');
INSERT INTO `blog` VALUES ('11', 'werw', 'erwerwer');

     3.3 然后,我不小心删掉了2条数据

delete from blog where id in (6,7);

    3.4 执行刷新(等于把错误定位到上一个文件,这样更小的范围,方便分析和恢复)。备注:错误发生在5号文件

    mysql二进制日志bin-log的基本了解,以及简单使用的案例_第3张图片

    mysql二进制日志bin-log的基本了解,以及简单使用的案例_第4张图片

    3.5 执行恢复  (--no-defaults 解决一个报错)

      mysqlbinlog --no-defaults --start-position=4 --stop-position=2704 "C:\ProgramData\MySQL\MySQL Server 5.7\Data\USER-20180920FW-bin.000006" | mysql -u root -p123456

    mysql二进制日志bin-log的基本了解,以及简单使用的案例_第5张图片

   这是数据恢复后的样子.

    后记总结: mysqlbinlog 记录的是增量数据,假如一个数据库已经存在一批数据,而这些数据没有任何备份,那么就算开启bin-log,在出现删库时,也无法恢复。这个时候可能有些朋友要说我举的这个例子好像就是删除了能恢复,也没有初始insert的数据,起始例子的数据在create datebase,create table insert values 已经创建好了数据,删除掉部分数据时,恢复执行mysqlbinlog 等于重新拿到了一次全量的数据,剔除掉删除语句,就是ok的数据了。

    细节,我们具体操作mysqlbinlog的时段起始点就是,每一次全量备份后(保证无失误情况下,全量备份前的bin-log可以忽略),加上备份后自动或手动刷新bin-log,生成的起始点之后的bin-log数据,就是完整的数据库备份。任何删库都不怕啦。。

 

你可能感兴趣的:(数据库)