Mysql - binlog

日志:
1. 为什么会有这个日志?
2. 日志记录在哪里?谁触发的,记录格式是什么?
3. 如何使用?

 

binlog:server的日志

binlog的作用
binlog是数据库server层的日志,用来恢复数据库,备份数据库等使用的。所有的mysql引擎都可以使用binlog。
3个作用:
1. For replication 主从复制
2. Certain data recovery operations require use of the binary log 确切时间点恢复
3. 审计,判断是否有sql注入

binlog的触发条件
binlog在修改数据库的时候触发,如update、delete、insert、alter等,除了select/show等的查询语句外的所有语句。
    
binlog的记录格式
binlog的记录格式分为statement、row和mix(mix就是在warning的情况下使用row,正常情况下使用statement)   

1.    statement 可能会导致主从不一致的情况,比如limit 5中使用的索引不一致。

    Statements are stored in the form of "events" that describe the modifications
    The binary log also contains information about how long each statement took that updated data.
   如果statement没有执行到任何一行,也会记录下来。

2.     row 日志在某些情况下可能会很多,比如alter table的时候。 (ddl的时候会记录binlog)

3.     mix 正常情况下使用statement,无法使用statement的时候就使用row。


这个二进制日志包括两类文件:
索引文件(文件名后缀为.index)用于记录哪些日志文件正在被使用  -- rotate??
日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句)语句事件。

binlog配置及查看

配置分两种:
1. 在mysql的配置文件my.cnf文件中的mysqld节中添加以下配置文件:

[mysqld]
#设置日志格式
binlog_format = mixed
#设置日志路径,注意路经需要mysql用户有权限写
log-bin = /data/mysql/logs/mysql-bin.log
#设置binlog清理时间
expire_logs_days = 7
#binlog每个日志文件大小
max_binlog_size = 100m
#binlog缓存大小
binlog_cache_size = 4m
#最大binlog缓存大小
max_binlog_cache_size = 512m

2. set globalbinlog_format='ROW/STATEMENT/MIXED
    showvariables like 'binlog_format'

可以使用mysqlbin命令查看二进制日志的内容

如何删除binlog:
(1) 使用reset master,该命令将会删除所有日志,并让日志文件重新从000001开始。
(2) 使用命令
PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr }

例如:
purge master logs to "binlog_name.00000X"
将会清空00000X之前的所有日志文件.
(3) 使用--expire_logs_days=N选项指定过了多少天日志自动过期清空。

binlog是怎么保存的
binlog也分为binlog buffer 和 binlog file。
使用sync_binlog设置buffer刷到file的机制,如果 = 1,则代表每个事务都刷盘。

BLGC: binlog group commit 解决并发时的性能瓶颈

这是binlog的group commit:

上图有3个队列,分别是flush list,sync list,commit list。

flush: 将binlog 从 用户内存 刷到 OS的内存

sync: 将OS内存中的binlog,刷到磁盘上

commit: 事务的提交,包括redolog的提交,脏数据刷盘等。

一个安全事务(sync_binlog = 1)的流程是: redoLog prepare -> binlog flush -> binlog sync -> redoLog commit

当有第一个线程进入flush队列时,自动成为leader,当leader需要操作时,会把队列内的所有线程的数据一起操作。 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值