1、What's binlog

* 二进制日志包含描述数据库更改(如表创建操作或表数据更改)的“ 事件 ”。
* 在row模式下,不记录DML不匹配任何行的SQL,statement 和mixed记录
* 二进制日志还包含有关每个语句花费更新数据的时间的信息。
* 二进制日志不用于诸如SELECT或 SHOW不修改数据的语句
*  mysqld还会创建一个二进制日志索引文件,其中包含所有使用的二进制日志文件的名称。

2、二进制日志的作用:

* 用于复制,从库重做从主库复制的binlog日志,实现主从数据一致性。
* 用于恢复。恢复数据库全备后执行binlog日志,使数据库保持最新状态。

3、 binlog 记录模式

3.1 STATEMENT

语句模式,记录执行的sql,对于模糊函数rand,只记录这个函数,主从造成数据不一致

1 mysql> set @@session.binlog_format=STATEMENT;
2 mysql> update test set name='dcd3' where id = 2 ;
3 # mysqlbinlog -vv logbinfile.000019
4 # at 609
5 #170210  4:27:09 server id 1  end_log_pos 735 CRC32 0x4d7239cf    Query    thread_id=62872    exec_time=0    error_code=0
6 use `test`/*!*/;
7 SET TIMESTAMP=1486672029/*!*/;
8 update test set name='dcd3' where id = 2;

3.2 ROW

行模式,基于数据行一行一行的记录,对于模糊函数能知道最后在行上的值,保证数据一致性。
mysql> set @@session.binlog_format=row;
mysql> update test set name='dcd4' where id=2;

 1 BINLOG '
 2 3NGcWBMBAAAAMgAAALkDAAAAANoAAAAAAAEABHRlc3QABHRlc3QAAgMPAjwAAuO+e6s=
 3 3NGcWB8BAAAAYAAAABkEAAAAANoAAAAAAAEAAgAC///8AgAAAARkY2Qz/AIAAAAEZGNkNPwDAAAA
 4 BGRjZDP8AwAAAARkY2Q0/AQAAAAEZGNkM/wEAAAABGRjZDRch6c1
 5 '/*!*/;
 6 ### UPDATE `test`.`test`
 7 ### WHERE
 8 ###  @1=2 /* INT meta=0 nullable=0 is_null=0 */
 9 ###  @2='dcd3' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
10 ### SET
11 ###  @1=2 /* INT meta=0 nullable=0 is_null=0 */
12 ###  @2='dcd4' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */

3.3 MIXED

混合模式,一般情况下,记录statement语句,

mysql> set @@session.binlog_format=mixed;
mysql> begin;
mysql> insert into t2 values (4,now());
mysql> commit;

#170921 23:27:18 server id 1  end_log_pos 855 CRC32 0x1ba5d0e5    Query    thread_id=38    exec_time=0    error_code=0
SET TIMESTAMP=1506007638/*!*/;
BEGIN
/*!*/;
# at 855
#170921 23:27:18 server id 1  end_log_pos 968 CRC32 0x621c1f2b    Query    thread_id=38    exec_time=0    error_code=0
SET TIMESTAMP=1506007638/*!*/;
insert into t2 values (4,now())
/*!*/;
# at 968
#170921 23:27:20 server id 1  end_log_pos 999 CRC32 0x94dc56be    Xid = 495
COMMIT/*!*/;

4、binlog的分析

4.1. 在行模式下记录binlog

mysql> create table test.t4 (id int primary key ,name varchar(20));  -- 自动提交第一个事务
mysql> begin;    -- 第二个事务
mysql> insert into test.t4 values (1,'a');
mysql> commit;
mysql> begin;    -- 第三个事务
mysql> insert into test.t4 values (2,'b');
mysql> commit;
mysql> show master status \G
*************************** 1. row ***************************File: mysql-bin.000004Position: 842Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set: 59fe7a3e-9dd6-11e7-9d6c-000c29e57c69:1-36
1 row in set (0.00 sec)

4.2. 找到对应的binlog

DELIMITER /*!*/;
# at 4
#170922  5:42:36 server id 1  end_log_pos 120 CRC32 0x7f5ab2c2    Start: binlog v 4, server v 5.6.36-log created 170922  5:42:36
# Warning: this binlog is either in use or was not closed properly.
BINLOG '
TDLEWQ8BAAAAdAAAAHgAAAABAAQANS42LjM2LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAXAAEGggAAAAICAgCAAAACgoKGRkAAcKy
Wn8=
'/*!*/;
# at 120
#170922  5:42:36 server id 1  end_log_pos 191 CRC32 0x3921881b    Previous-GTIDs
# 59fe7a3e-9dd6-11e7-9d6c-000c29e57c69:1-33     -- 在binlog文件开头表明执行过的GTID
# at 191
#170922  5:42:50 server id 1  end_log_pos 239 CRC32 0xc083f02e    GTID [commit=yes]
SET @@SESSION.GTID_NEXT= '59fe7a3e-9dd6-11e7-9d6c-000c29e57c69:34'/*!*/;  -- 设置create table 事务的GTID值
# at 239
#170922  5:42:50 server id 1  end_log_pos 368 CRC32 0xc6e65837    Query    thread_id=43    exec_time=0    error_code=0
SET TIMESTAMP=1506030170/*!*/;
SET @@session.pseudo_thread_id=43/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1073741824/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
create table test.t4 (id int primary key ,name varchar(20))
/*!*/;
# at 368
#170922  5:43:09 server id 1  end_log_pos 416 CRC32 0x3c41cd8f    GTID [commit=yes]
SET @@SESSION.GTID_NEXT= '59fe7a3e-9dd6-11e7-9d6c-000c29e57c69:35'/*!*/;                 -- 设置insert事务的GTID值
# at 416
#170922  5:43:07 server id 1  end_log_pos 484 CRC32 0x1a1b279a    Query    thread_id=43    exec_time=0    error_code=0
SET TIMESTAMP=1506030187/*!*/;
BEGIN
/*!*/;
# at 484
#170922  5:43:07 server id 1  end_log_pos 532 CRC32 0x81bf433a    Table_map: `test`.`t4` mapped to number 81
# at 532
#170922  5:43:07 server id 1  end_log_pos 574 CRC32 0x672093bd    Write_rows: table id 81 flags: STMT_END_FBINLOG '
azLEWRMBAAAAMAAAABQCAAAAAFEAAAAAAAEABHRlc3QAAnQ0AAIDDwIUAAI6Q7+B
azLEWR4BAAAAKgAAAD4CAAAAAFEAAAAAAAEAAgAC//wBAAAAAWG9kyBn
'/*!*/;
### INSERT INTO `test`.`t4`
### SET
###  @1=1 /* INT meta=0 nullable=0 is_null=0 */
###  @2='a' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
# at 574
#170922  5:43:09 server id 1  end_log_pos 605 CRC32 0x187dba42    Xid = 536
COMMIT/*!*/;
# at 605
#170922  5:43:40 server id 1  end_log_pos 653 CRC32 0x1c079044    GTID [commit=yes]
SET @@SESSION.GTID_NEXT= '59fe7a3e-9dd6-11e7-9d6c-000c29e57c69:36'/*!*/;                  -- 设置insert事务的GTID值
# at 653
#170922  5:43:38 server id 1  end_log_pos 721 CRC32 0x73ec94af    Query    thread_id=43    exec_time=0    error_code=0
SET TIMESTAMP=1506030218/*!*/;
BEGIN
/*!*/;
# at 721
#170922  5:43:38 server id 1  end_log_pos 769 CRC32 0x4d300601    Table_map: `test`.`t4` mapped to number 81
# at 769
#170922  5:43:38 server id 1  end_log_pos 811 CRC32 0xd4bd7ab4    Write_rows: table id 81 flags: STMT_END_FBINLOG '
ijLEWRMBAAAAMAAAAAEDAAAAAFEAAAAAAAEABHRlc3QAAnQ0AAIDDwIUAAIBBjBN
ijLEWR4BAAAAKgAAACsDAAAAAFEAAAAAAAEAAgAC//wCAAAAAWK0er3U
'/*!*/;
### INSERT INTO `test`.`t4`
### SET
###  @1=2 /* INT meta=0 nullable=0 is_null=0 */
###  @2='b' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
# at 811
#170922  5:43:40 server id 1  end_log_pos 842 CRC32 0xac2e4d04    Xid = 540
COMMIT/*!*/;
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog *//*!*/;                  -- 设置gtid值为AUTOMATIC
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

4.3. 通过分析上面的binlog

可以得到以下结论:
1.  row模式下,insert 是对表中每个列进行赋值插入的
2. 在每个binlog文件的末尾会有rollback
3. 在每个事务前binlog 设置了gtid_next的值。

5、binlog相关的变量

5.1 log_bin

启动时,--log-bin
log_bin 写在配置文件中

5.2 sql_log_bin

1. 此变量控制是否完成对二进制日志的日志记录,默认值为1(做日志记录)。
2. mysql> set @@session.sql_log_bin=OFF; 需要具有SUPER权限。
3. 在MySQL 5.7中,不可能在事务或子查询中进行设置 @@session.sql_log_bin

5.3 binlog_cache_size

mysql> show variables like 'binlog_cache_size';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| binlog_cache_size | 32768 |         -- 基于会话分配,建议16M
+-------------------+-------+

在 Binlog_cache_use与 Binlog_cache_disk_use 状态变量可以用于调整该变量的大小

mysql> show variables like '%binlog_cache%';
+-----------------------+----------------------+
| Variable_name         | Value                |
+-----------------------+----------------------+
| binlog_cache_size     | 32768                |
| max_binlog_cache_size | 18446744073709547520 |
+-----------------------+----------------------+

mysql> show global status like "binlog_cache_disk_use";
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| Binlog_cache_disk_use | 0     |
+-----------------------+-------+

5.4 binlog_stmt_cache_size

此变量确定二进制日志的高速缓存的大小,以保存在事务期间发出的非事务性语句。
mysql> show variables like '%binlog_stmt%';
+----------------------------+----------------------+
| Variable_name              | Value                |
+----------------------------+----------------------+
| binlog_stmt_cache_size     | 32768                |
| max_binlog_stmt_cache_size | 18446744073709547520 |
+----------------------------+----------------------+

5.5 max_binlog_size

mysql> show variables like '%binlog_size%';
+-----------------+------------+
| Variable_name   | Value      |
+-----------------+------------+
| max_binlog_size | 1073741824 |    -- binlog 文件大小,默认1G
+-----------------+------------+

5.6 sync_binlog

* sync_binlog=0,系统默认
当事务提交之后,不做磁盘同步,在这种情况下,依赖于文件系统的刷新。
值为0,性能是最好的,但是风险也是最大的。
因为一旦系统Crash,在binlog_cache中的所有binlog信息都会被丢失。,
* sync_binlog=n,
当值不为0时,fdatasync() 同步binlog到磁盘,最安全但是性能损耗最大的设置。
因为当设置为1的时候,即使系统Crash,也最多丢失binlog_cache中未完成的一个事务,对实际数据没有任何实质性影响。

5.7 expire_logs_days

mysql> show variables like '%expire_logs_days%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| expire_logs_days               | 0     |
+--------------------------------+-------+

values:
* 自动删除binlog 的天数
* 0 表示不自动删除

5.8 innodb_flush_log_at_trx_commit

  • 0: log buffer将大约每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行.该模式下,在事务提交的时候,不会主动触发写入磁盘的操作。
  • 1: 每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去.
  • 2: 每次事务提交时MySQL都会把log buffer的数据写入log file.但是flush(刷到磁盘)操作并不会同时进行。
    • 该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作,可以通过把这个值设成2来提高写入的速度

5.9 xa

* 事务在提交时,redo log 写入失败、bin log 写入成功时,主库会执行回滚操作,从库写入,造成主从数据不一致
* xa参数保证 redo 、binlog 都写入成功,事务提交成功。
mysql> show variables like '%xa%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| innodb_support_xa      | ON    |

转载于:https://www.cnblogs.com/jesper/p/7614890.html

mysql binlog 日志相关推荐

  1. Mysql binlog日志及binlog恢复数据库操作

    初识MySQL 日志binlog MySQL重要log,二进制日志文件,记录所有DDL和DML语句(除select),事件形式记录,包含语句所执行的消耗时间,事务安全型. DDL(数据库定义语言),主 ...

  2. 设置自动清理mysql binlog日志和手动删除的方法

    MYSQL主从复制(replication)采用 RBR 模式后,binlog的格式为"ROW",能解决很多原先出现的主键重复问题. 在一个繁忙的master db server上 ...

  3. 4 款 MySQL Binlog 日志处理工具对比,谁才是王者?

    作者 | stone-no1 来源 | https://blog.csdn.net/weixin_38071106/article/details/88547660 Canal 定位:基于数据库增量日 ...

  4. mysql binlog日志优化及思路

    在数据库安装完毕,对于binlog日志参数设置,有一些参数的调整,来满足业务需求或使性能最大化.Mysql日志主要对io性能产生影响,本次主要关注binlog 日志.   查一下二进制日志相关的参数  ...

  5. MySQL binlog日志

    binlog 基本认识 MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日 ...

  6. MySQL bin-log 日志清理方式

    MySQL bin-log 作用 1.数据恢复:如果你的数据库出问题了,而你之前有过备份,那么可以看日志文件,找出是哪个命令导致你的数据库出问题了,想办法挽回损失. 2.主从服务器之间同步数据:主服务 ...

  7. mysql binlog日志的三种模式

    1.statement level模式 每一条会修改数据的sql都会记录到master的bin-log中.slave在复制的时候sql进程会解析成和原来master端执行过的相同的sql来再次执行. ...

  8. canal解析mysql日志异常_利用Canal解析mysql binlog日志

    一.安装包下载(canal.deployer-x.x.x.tar.gz  官方建议使用1.0.22版本) 二.解压文件 tar -zxvf canal.deployer-1.0.22.tar.gz - ...

  9. mysql binlog日志定时删除---计划任务

    公司的数据库由于读写操作很多,所以bin-log日志的增长速度很快,于是乎就要定时删除binlog,但是在网上看了很多文章都是几天或指定时间删一次,可有时需要几天有时需要几个小时就要删一次,也有可能几 ...

  10. mysql binlog 统计_对MySQL binlog日志解析,统计每张表的DML次数

    想要获取每天数据库每张表的DML的次数,统计热度表,可以使用该脚本 # coding:utf-8 # 解析binlog,统计热度表,表的DML个数 import sys import os # mys ...

最新文章

  1. 中国爬虫违法违规案例汇总
  2. 使用VS code 创建 Azure Functions,从blob触发,解析,发送至Service Bus
  3. 每天一个linux 命令 find命令
  4. kafka生产数据时的应答机制(ACK)
  5. POJ PKU 2305 java大数进制转化 JAVA 大数转换成字符串 转
  6. SQL 函数NULLIF、NULL、ISNULL、COALESCE、IIF
  7. 面试常问:BIO,NIO,AIO
  8. jpa 人大金仓数据库方言_人大金仓数据库(kingbase7d)操作入门指南 Windows
  9. iOS-性能优化的那些事
  10. matlab保存pdf图片太大,matlab中的图片保存方法精选.pdf
  11. 推特员工大规模辞职,马斯克被“问候”;腾讯10多万员工平均月薪超8万;雪欲“白嫖”网易百万玩家数据...
  12. 【已解决】U盘文件误删 恢复,实用有效 免费无充值 Recuva
  13. 人民币符号¥单横线?双横线?
  14. axios跨域解决方案
  15. seo方法 seo优化技巧 教你如何提高网站排名
  16. Android电池驱动
  17. matlab关闭文本,matlab parpool 关闭
  18. 【Web书城】书城前端开发
  19. 门控图神经网络(GGNN)及代码分析
  20. 【趣味实践】自动化抠图工具——XMem的使用

热门文章

  1. 京东的交易系统 之 高并发架构分享
  2. 【linux】 linux 查看系统信息
  3. Scaling For iPad mini
  4. [JavaScript] 事件
  5. jQuery Howto: 如何快速创建一个AJAX的加载的图片效果
  6. 应用虚拟化之规划篇二 项目流程规划
  7. 1019. 数字黑洞 (20)-PAT乙级真题
  8. 1011. A+B和C (15)-PAT乙级真题
  9. linux 系统性能分析常用命令
  10. Oracle的取整和四舍五入函数——floor,round,ceil,trunc使用说明