> 数据库 > MySQL >

Mysql Binlog 数据备份还原

第一:Mysql Binlog有三种模式
binlog有三种格式:Statement、Row以及Mixed。
–基于SQL语句的复制(statement-based replication,SBR),
–基于行的复制(row-based replication,RBR),
–混合模式复制(mixed-based replication,MBR)。
1 Statement ,简单的说能记录每条操作sql
每一条会修改数据的sql都会记录在binlog中。
优点:不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。
缺点:由于记录的只是执行语句,为了这些语句能在slave上正确运行,因此还必须记录每条语句在执行的时候的一些相关信息,以保证所有语句能在slave得到和在master端执行时候相同 的结果。另外mysql 的复制,像一些特定函数功能,slave可与master上要保持一致会有很多相关问题。
ps:相比row能节约多少性能与日志量,这个取决于应用的SQL情况,正常同一条记录修改或者插入row格式所产生的日志量还小于Statement产生的日志量,但是考虑到如果带条件的update操作,以及整表删除,alter表等操作,ROW格式会产生大量日志,因此在考虑是否使用ROW格式日志时应该跟据应用的实际情况,其所产生的日志量会增加多少,以及带来的IO性能问题。
2 Row
5.1.5版本的MySQL才开始支持row level的复制,它不记录sql语句上下文相关信息,仅保存哪条记录被修改。
优点: binlog中可以不记录执行的sql语句的上下文相关的信息,仅需要记录那一条记录被修改成什么了。所以rowlevel的日志内容会非常清楚的记录下每一行数据修改的细节。而且不会出现某些特定情况下的存储过程,或function,以及trigger的调用和触发无法被正确复制的问题.
缺点:所有的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容。***

这个模式数据恢复时还原sql无法执行!!!

ps:新版本的MySQL中对row level模式也被做了优化,并不是所有的修改都会以row level来记录,像遇到表结构变更的时候就会以statement模式来记录,如果sql语句确实就是update或者delete等修改数据的语句,那么还是会记录所有行的变更。
3 Mixed
从5.1.8版本开始,MySQL提供了Mixed格式,实际上就是Statement与Row的结合。
在Mixed模式下,一般的语句修改使用statment格式保存binlog,如一些函数,statement无法完成主从复制的操作,则采用row格式保存binlog,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种。

总结:配置时最好用mixed

第二 相关配置
binlog_format=mixed //日志模式,最好调成mixed,row 模式用mysqlbinlog 还原的sql是无法直接执行恢复的!!
datadir = /www/server/data //数据存储文件,包括bin-log
log-bin=mysql-bin //开启log-bin 名称叫mysql-bin 位置在上面配置

第三恢复操作
1:根据配置文件找到bin-log 位置,根据时间判断需要恢复的log
2:用 mysqlbinlog 工具将bin-log 还原成sql
ps:
1:查找bin-log 跟mysqlbinlog 可以用 find /(文件夹) -name mysqlbinlog
2:查看数据库bin-log 相关 mysql> show variables like ‘log_%’;

下面是使用mysqlbinlog工具相关
eg1: /www/server/mysql/bin/mysqlbinlog --skip-gtids=true mysql-binl.000006 > sss1.sql //直接将整个binlog 转成sql,这仅限于bin-log 模式是Statement 时,row 模式会被加密成base64,–skip-gtids=true 这是去除数据库gtids,不然同一个数据库数据无法恢复,gtids只能执行一次所以要去除

eg2:/www/server/mysql/bin/mysqlbinlog -v --base64-output=decode-rows mysql-bin.000013 > sss1.sql //这个适用于row模式或者mixed 模式,会将bin-log 解析成下面类似的sql,这对还原数据没什么卵用,所以还是要把bin-log模式 设置成mixed

BEGIN
/*!*/;
# at 192
#200605 16:44:59 server id 1  end_log_pos 251 CRC32 0x3ae104fe  Table_map: `jfqp`.`jz_nav_cat` mapped to number 70
# at 251
#200605 16:44:59 server id 1  end_log_pos 323 CRC32 0xbbadc0d9  Write_rows: table id 70 flags: STMT_END_F
### INSERT INTO `jfqp`.`jz_nav_cat`
### SET
###   @1=4
###   @2='测试导航'
###   @3=1
###   @4='测试测试'
# at 323
#200605 16:44:59 server id 1  end_log_pos 396 CRC32 0x0daea76d  Query thread_id=31 exec_time=0 error_code=0
SET TIMESTAMP=1591346699/*!*/;
COMMIT


(责任编辑:IT)