文章目录
0、binlog 的作用
binlog,即二进制日志,它记录了数据库上的所有改变,并以二进制的形式保存在磁盘中;
它可以用来查看数据库的变更历史、数据库增量备份和恢复、Mysql的复制(主从数据库的复制)。
1、binlog 三种模式
类型 | 全称 |
---|---|
Row | 基于行的复制(row-based replication,RBR) |
Statement | 基于SQL语句的复制(statement-based replication,SBR) |
Mixed | 混合模式复制(mixed-based replication,MBR) |
1.1、比较
目前看公司使用的是 Row 模式
1.1.1、Row
- 5.1.5版本的MySQL才开始支持row level的复制
- 它不记录sql语句上下文相关信息,仅保存哪条记录被修改。
- 优点: binlog中可以不记录执行的sql语句的上下文相关的信息,仅需要记录那一条记录被修改成什么了。所以rowlevel的日志内容会非常清楚的记录下每一行数据修改的细节。而且不会出现某些特定情况下的存储过程,或function,以及trigger的调用和触发无法被正确复制的问题.
- 缺点:所有的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容,比如修改表结构,每一行记录都会产生一条变更日志。
- ps:新版本的MySQL中对row level模式也被做了优化,并不是所有的修改都会以row level来记录,像遇到表结构变更的时候就会以statement模式来记录,如果sql语句确实就是update或者delete等修改数据的语句,那么还是会记录所有行的变更。
1.1.2、Statement
- 每一条会修改数据的sql都会记录在binlog中。
- 优点:不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。
- 缺点:由于记录的只是执行语句,为了这些语句能在slave上正确运行,因此还必须记录每条语句在执行的时候的一些相关信息,以保证所有语句能在slave得到和在master端执行时候相同 的结果。另外mysql 的复制,像一些特定函数功能,slave可与master上要保持一致会有很多相关问题。
- ps:相比row能节约多少性能与日志量,这个取决于应用的SQL情况,正常同一条记录修改或者插入row格式所产生的日志量还小于Statement产生的日志量,但是考虑到如果带条件的update操作,以及整表删除,alter表等操作,ROW格式会产生大量日志,因此在考虑是否使用ROW格式日志时应该跟据应用的实际情况,其所产生的日志量会增加多少,以及带来的IO性能问题。
1.1.3、Mixed
- 从5.1.8版本开始,MySQL提供了Mixed格式,实际上就是Statement与Row的结合。
- 在Mixed模式下,一般的语句修改使用statment格式保存binlog,如一些函数,statement无法完成主从复制的操作,则采用row格式保存binlog,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种。
2、查看/修改binlog 格式
2.1、查看 binlog
select @@binlog_format;
show variables like 'binlog_format';
2.2、修改 binlog 级别
#修改会话级别 Row、Statement、Mixed
SET SESSION binlog_format = 'ROW';
#修改全局级别 Row、Statement、Mixed
set globle binlog_format='MIXED'
3、mysql 支持 binlog 吗?
3.1、查看 binlog 记录是否开启
# 查看当前mysql 是否开启 binlog, ON 表示开启
select @@log_bin;
show variables like 'log_bin';
3.2、开启/关闭 binlog 日志记录
比如手动恢复数据的时候,需要关闭日志记录,避免资源浪费
-
vim /etc/my.cnf把里面的 log-bin 这一行注释掉,重启mysql服务即可。
-
sql_log_bin ,*开启 set sql_log_bin=1; 关闭 set sql_log_bin=0 ;*是一个动态变量,修改该变量时,可以只对当前会话生效(Session),也可以是全局的(Global),当全局修改这个变量时,只会对新的会话生效(这意味当对当前会话也不会生效),因此一般全局修改了这个变量后,都要把原来的所有连接 kill 掉。
-
用处:
当还原数据库的时候,如果不关闭二进制日志,那么你还原的过程仍然会记录在二进制日志里面,不仅浪费资源,那么增加了磁盘的容量,还没有必要(特别是利用二进制还原数据库的时候)所以一般还原的时候会选择关闭二进制日志,可以通过修改配置文件,重启关闭二进制日志。也可以动态命令关闭sql_log_bin,然后导入数据库。
4、binlog 文件
4.1、查看所有binlog文件
show master logs;
show binary logs;
4.2、 查看目前使用的是哪一个binlog 文件
show master status;
4.3、 从新创建一个binlog 文件,历史文件不动
flush logs;
4.4、查看第一个 binlog 文件内容
show binlog events;
4.5、查看指定binlog文件内容
show binlog events in ‘binlog.000004’;
参考
https://blog.csdn.net/ouyang111222/article/details/50300851