Mysql Binlog 数据备份还原
时间:2022-02-15 17:50 来源:linux.it.net.cn 作者:IT
第一: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)
第一: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) |