Mariadb(Mysql)通过二进制日志实现数据恢复

mysql从删库到跑路,你真的删干净了吗。。。数据库的日志还在吗,同步备份数据库日志脚本在执行吗,这么说来你是不是至少还有两个东西没删,会不会有种想回去继续删完在跑路0.0

binlog:

简介: mariadb的二进制日志文件,以事件的形式记录了mariadb的库表结构以及表数据的所有变更信息。mysql(mariadb是mysql的一个分支而已)系列还提供了其他三种日志:错误日志(error log)、普通日志(general log)、慢日志(slow log)。binlog不会记录SELECT和SHOW这类操作,因为这类操作对数据本身并没有修改,但可以通过查询普通日志(general log)来查看MySQL执行过的所有语句。

作用: 个人认为主要的用途有两个:1、数据恢复,起到一个备份的作用;2、用于主从复制(从库copy主库的二进制文件从而导致从库数据和主库保持一致)

开启二进制日志:

1、打开mariadb的配置文件:D:\mariaDB\mariadb-10.0.17-winx64\my.ini

2、查看[mysqld]下面的log-bin是否配置(网上都说这个默认是关闭的,但是mariadb好像默认是开启的0.0)

3、设置log-bin名字:log-bin=XXX,其中XXX位日志的名字,如果没有指定文件名,默认使用 datadir/log-basename-bin, datadir/mysql-bin 或者 datadir/mariadb-bin(如果也没有 –log-basename 选项,根据server版本的不同,会使用后两个中的一个);

4、设置binlog_format:即日志以哪种形式记录,默认值是mixed
Mariadb(Mysql)通过二进制日志实现数据恢复_第1张图片
5、重启mariadb服务,然后查看binlog是否开启:show variables like ‘log_bin’; on表示开启了
Mariadb(Mysql)通过二进制日志实现数据恢复_第2张图片

binlog_format: 二进制日志记录模式,分为三种:row,statement,mixed

1、row:
简介:日志中记录每一行被修改的记录。
优点:记录每行数据修改的记录,不需要太注重sql执行的上下文(即sql执行的顺序,但是只是不太需要注意,很多时候还是需要注意的),日志清晰容易理解,不会出现因为存储过程、某些函数或者触发器从而导致数据无法恢复的问题。
缺点:因为记录的是每行被修改的日志,这样容易使日志的内容大大增加,比如:一句批量修改的sql,如果有1行满足修改的条件那完全能接受,如果是100万条呢,如果在row模式下,就会产生100万条的记录,想想就可怕。如果执行的是修改表结构的sql产生的日志就更是一个惊人的数量。

2、statement:
简介:记录的是每条执行的sql。
优点:不需要记录每一行数据的变化,只记录每条执行的sql,减少了 bin-log 日志量,节省 I/O 以及存储资源,提高性能。
缺点:必须记录每条语句在执行的时候的一些相关信息,也就是上下文信息,保证sql执行的顺序。

3、mixed:根据执行的每一条具体的 SQL 语句来区分对待记录的日志形式,也就是在 statement 和 row 之间选择一种。

如何通过二进制日志恢复数据呢

完成以上配置之后,我们来进行一个实例:

1、创建一个名字为ceshi的数据源

2、创建表和数据

CREATE TABLE `testtbale` (

`id`  int NULL ,

`name`  varchar(255) NULL 

);
INSERT INTO `testtbale` (`id`, `name`) VALUES ('1', '小明');
INSERT INTO `testtbale` (`id`, `name`) VALUES ('2', '小红')

3、然后把小红给删了:

delete FROM testtbale where id=2;

4、查看当前日志是那个文件:show master status;
Mariadb(Mysql)通过二进制日志实现数据恢复_第3张图片
5、查看所有二进制文件列表(这里是因为新建的缘故,所以日志文件才一个):show binary logs;
Mariadb(Mysql)通过二进制日志实现数据恢复_第4张图片
6、将日志转成sql脚本:mysqlbinlog ../data/mysql-bin.000001
这里写图片描述
然后问题来了,它的意思应该是默认值设置的有问题。。。

解决方法:

① 设置mariadb配置文件,即my.ini,将default-character-set=utf8改为character_set_server=utf8
Mariadb(Mysql)通过二进制日志实现数据恢复_第5张图片
然后重启mariadb,转换为sql脚本之后在讲这里改回去,然后再重启mariadb,显然很繁琐。。。

② 加一个参数:no-defaults
总的语句为:mysqlbinlog - -no-defaults ../data/mysql-bin.000001 >myhzt.sql
成功执行完之后,myhzt.sql这个文件将会在bin这个目录下产生,打开你会发现有一些其他数据源的日志也在里面,这样就使得整个sql脚本很乱

解决方法:解决方法当然是配置数据源喽

mysqlbinlog - -no-defaults - -database=ceshi ../data/mysql-bin.000001 >myhzt.sql 这样一来导出的就只有ceshi 这个数据源了,就算这个用户下还有其他数据源,导出来的sql脚本也只是躲了一下无效语句而已,如图:这些是其他数据源的sql脚本,设置数据源之后就会变成这样。
Mariadb(Mysql)通过二进制日志实现数据恢复_第6张图片

7、找到我们刚才执行的那条delete语句,删除他,然后再其他地方新建一个数据源,然后执行以下这个sql脚本即可恢复数据。我们可以看到小红回来了0.0
这里写图片描述

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