前言:
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_%' 查询。
备注: show variables like 一般用于一些固定配置量 show status like 一般查一些运行时状态,比如 show variables like 'max_connections%', 查最大链接配置。show status like 'thread%' 查运行中打开了多少线程。
二、基本的一些命令操作
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号文件
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
这是数据恢复后的样子.
后记总结: mysqlbinlog 记录的是增量数据,假如一个数据库已经存在一批数据,而这些数据没有任何备份,那么就算开启bin-log,在出现删库时,也无法恢复。这个时候可能有些朋友要说我举的这个例子好像就是删除了能恢复,也没有初始insert的数据,起始例子的数据在create datebase,create table insert values 已经创建好了数据,删除掉部分数据时,恢复执行mysqlbinlog 等于重新拿到了一次全量的数据,剔除掉删除语句,就是ok的数据了。
细节,我们具体操作mysqlbinlog的时段起始点就是,每一次全量备份后(保证无失误情况下,全量备份前的bin-log可以忽略),加上备份后自动或手动刷新bin-log,生成的起始点之后的bin-log数据,就是完整的数据库备份。任何删库都不怕啦。。