MySQL BinLog-2020-02

2020-02-07  本文已影响0人  花神子

MySQL binlog的几种日志录入格式以及区别
binlog文件中存储的内容称之为二进制事件,简称事件。我们的每一个数据库更新操作(Insert、Update、Delete等),都会对应的一个事件。
从大的方面来说,binlog主要分为2种格式:

不同的binlog模式,在binlog文件包含的事件类型也不相同(Mysql中定义了30多个event类型),如: 1)在Statement模式下,我们就看不到Row模式下独有的事件类型。2)有一些类型的event,必须在我们开启某些特定配置的情况下,才会出现;3)当然也会有一些公共的event类型,在任何模式下都会出现。

mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | OFF   |  #默认是关闭的
+---------------+-------+

mysql> set @@global.log_bin=on;
ERROR 1238 (HY000): Variable 'log_bin' is a read only variable

Statement

Statement模式下的binlog日志中记录每一条会修改数据的sql。

优点:

不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。(相比row能节约多少性能 与日志量,这个取决于应用的SQL情况,正常同一条记录修改或者插入row格式所产生的日志量还小于Statement产生的日志量,但是考虑到如果带条件的update操作,以及整表删除,alter表等操作,ROW格式会产生大量日志,因此在考虑是否使用ROW格式日志时应该跟据应用的实际情况,其所 产生的日志量会增加多少,以及带来的IO性能问题。)

缺点:

Statement模式下的事件

可以使用"show binlog events" 语法查看binary log中的内容,如下:

show binary logs;
log_name File_size Encrypted
binlog.000083   178 No
binlog.000084   155 No
binlog.000085   178 No
binlog.000086   178 No
binlog.000087   178 No
binlog.000088   155 No
binlog.000089   178 No
binlog.000090   155 No
binlog.000091   155 No
binlog.000092   1189    No
show binlog events in 'binlog.000092';
log_name       pos  event_type  server_id  end_log_pos  info
binlog.000055   4   Format_desc 1   124 Server ver: 8.0.15, Binlog ver: 4
binlog.000055   124 Previous_gtids  1   155 ""
binlog.000055   155 Anonymous_Gtid  1   232 SET @@SESSION.GTID_NEXT= 'ANONYMOUS'
binlog.000055   232 Query   1   389 CREATE SCHEMA `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci /* xid=168 */
binlog.000055   389 Anonymous_Gtid  1   468 SET @@SESSION.GTID_NEXT= 'ANONYMOUS'
binlog.000055   468 Query   1   660 "use `test`; create table user (
id int(11) not null,
name varchar(10) not null,
primary key(id,name)
) engine=innodb /* xid=199 */"
binlog.000055   660 Anonymous_Gtid  1   739 SET @@SESSION.GTID_NEXT= 'ANONYMOUS'
binlog.000055   739 Query   1   814 BEGIN
binlog.000055   814 Table_map   1   870 table_id: 75 (test.user)
binlog.000055   870 Write_rows  1   917 table_id: 75 flags: STMT_END_F
binlog.000055   917 Xid 1   948 COMMIT /* xid=1126 */

关于"show binlog events"语法显示的每一列的作用说明如下:

在Event_Type列中,我们看到了三个事件类型:

Row

不记录sql语句上下文相关信息,仅保存哪条记录被修改。(binlog记录的是每一行记录的每个字段变化前后得到值。)

优点:

缺点:

binlog_rows_query_log_events参数

在Statement模式下,直接记录SQL比较直观,事实上,在Row模式下,也可以记录。mysql提供了一个binlog_rows_query_log_events参数,默认为值为FALSE,如果为true的情况下,会通过Rows Query Event来记录SQL。

show variables like '%binlog_rows_query_log_events%'

binlog_row_image参数

经常会看到一些Row模式和Statement模式的比较。ROW模式下,即使我们只更新了一条记录的其中某个字段,也会记录每个字段变更前后的值,binlog日志就会变大,带来磁盘IO上的开销,以及网络开销。事实上,这个行为可以通过binlog_row_image控制其有3个值,

show global variables like '%binlog_row_image%';

Mixedlevel:

binlog 文件存储

mysql 将数据库更新操作对应的event记录到本地的binlog文件中,
mysql中,我们可以通过"show binary logs"语句,来查看当前有多少个binlog文件,以及每个binlog文件的大小,如下:

show binary  logs;
binlog.000049   155 No
binlog.000050   155 No
binlog.000051   178 No
binlog.000052   155 No
binlog.000053   155 No
binlog.000054   178 No
binlog.000055   3288    No

mysql提供了:

上一篇 下一篇

猜你喜欢

热点阅读