ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MySQL Binlog解析

2021-11-30 19:04:03  阅读:285  来源: 互联网

标签:bin Binlog log binlog mysql MySQL 日志 解析 +---------------+-------+


binlog 是一个二进制格式的文件,用于记录用户对数据库更新的SQL语句信息,例如更改数据库表和更改内容的SQL语句都会记录到binlog里,但是对库表等内容的查询不会记录。默认情况下,binlog 日志是二进制格式的,不能使用查看文本工具的命令(比如,cat,vi等)查看,而使用mysqlbinlog解析查看。

binlog 的作用

用于数据库的主从复制及数据的增量恢复。

binlog 三种模式

 Row Level 模式(RBR)

不记录每条sql语句的上下文信息,只需记录哪条数据被修改了,修改成什么样了。 优点: * 准确性强,能准确复制数据的变更 * 减少数据库锁的使用 缺点: * 会产生大量的日志,导致较大的网络IO和磁盘IO * 要求主从数据库表结构完全一致 * 无法在从数据库上单独执行触发器

Statement Level 模式(SBR)

每一条修改数据的 sql 都会记录到 master 的 bin_log 中,slave 在复制的时候 sql 进程会解析成 master 端执行过的相同的 sql 在 slave 库上再次执行。 优点: * 不需要记录每一条sql语句和每一行的数据变化,减少了binlog日志量,节约IO,提高性能 * 并不强制要求主从数据库的表结构定义完全相同 缺点: * 在某些情况下会导致 master-slave 中的数据不一致(如sleep()函数, last_insert_id(),以及user-defined functions(udf)等会出现问题) * 相比于 RBR 模式,在执行复制时需要更多的行锁

MIXED模式(MBR)

以上两种模式的混合使用,一般的复制使用 STATEMENT 模式保存 binlog,对于 STATEMENT 模式无法复制的操作使用 ROW 模式保存 binlog,MySQL会根据执行的 SQL 语句选择日志保存方式。 优点: 准确性强,文件大小适中 缺点: 有可能发生主从不一致问题

binlog模式的选择

1. 不用存储过程、触发器、函数,选择默认的 Statement level 2. 用到MySQL的特殊功能(存储过程、触发器、函数)选择Mixed模式 3. 用到MySQL的特殊功能(存储过程、触发器、函数),又希望数据最大化一直则选择Row模式

binlog 常用参数

参数名 含义
log_bin = {on | off | base_name} 指定是否启用记录二进制日志或者指定一个日志路径
sql_log_bin ={ on | off } 指定是否启用记录二进制日志
expire_logs_days 指定自动删除二进制日志的时间,即日志过期时间
log_bin_index 指定mysql-bin.index文件的路径
binlog_format = { mixed | row | statement } 指定二进制日志基于什么模式记录
max_binlog_size 指定二进制日志文件最大值
binlog_cache_size 指定事务日志缓存区大小
max_binlog_cache_size 指定二进制日志缓存最大大小
sync_binlog = { 0 | n } 指定写缓冲多少次,刷一次盘

配置实践

5.1 检查 binlog 功能是否开启

mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | OFF   |
+---------------+-------+
1 row in set (0.00 sec)
可以看到 binlog 功能默认是关闭的。

开启 binlog 功能

创建 binlog 存放路径并赋权
[root@VM_0_15_centos log]# mkdir -p /var/log/mysql
[root@VM_0_15_centos log]# chown -R mysql.mysql /var/log/mysql
编辑 my.cnf 配置文件
[root@VM_0_15_centos log]# vim /etc/my.cnf
在 [mysqld] 标签下编辑如下内容:
# binlog 存放路径
log_bin=/var/log/mysql/mysql-bin
# 服务Id,保持唯一
server_id=1
重启 MySQL 服务
[root@VM_0_15_centos log]# systemctl restart mysqld
重新检查是否开启日志功能
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.00 sec)

查看 binlog 模式

mysql> show variables like '%binlog_format%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW   |
+---------------+-------+
1 row in set (0.00 sec)
可以看到 MySQL 5.7 版本默认 binlog 模式是 ROW。

修改 binlog 模式

编辑 my.cnf 配置文件
[root@VM_0_15_centos log]# vim /etc/my.cnf
在 [mysqld] 标签下编辑如下内容:
binlog_format=mixed
重启服务
[root@VM_0_15_centos log]# systemctl restart mysqld
查看 binlog 模式
mysql> show variables like '%binlog_format%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | MIXED |
+---------------+-------+
1 row in set (0.00 sec)

查看 binlog 文件

查看 statement 模式文件:
mysqlbinlog 文件名
查看 row 模式文件
mysqlbinlog -vv 文件名

删除 binlog 文件

方法一:
reset master
注:此命令将会删除所有日志,并让日志文件重新从000001开始。 方法二:
PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr }
实例:
purge master logs to "binlog_name.00000X"
将会清空 00000X 之前的所有日志文件. 方法三:修改 my.cnf 配置
expire_logs_days = 3 #保留最近3天的binlog;默认值是0,表示不自动删除.

标签:bin,Binlog,log,binlog,mysql,MySQL,日志,解析,+---------------+-------+
来源: https://www.cnblogs.com/johnvwan/p/15620578.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有