MySQL学习-MySQL日志(二)

谈谈MySQL的日志系统

binlog(归档日志)和 redo log(重做日志)

首先谈谈binlog

binlog是MySQL的server层的日志系统,它记录了MySQL除了查询操作以外的所有操作。

当系统需要做主从系统,或者数据迁移等操作的时候,就可以使用binlog日志重放来实现。也可以使用系统全量备份加上binlog来实现这些功能。

binlog有三种记录模式:STATMENT、ROW、MIXED

STATMENT模式:记录的是具体执行的sql语句

ROW模式:记录的是改变的数据行的具体变化

MIXED模式:前两种的混合记录模式,MySQL会根据执行的sql选择记录日志的模式

查看binlog日志是否开启

sql:show variables like '%log_bin%'; 

mysql> show variables like '%log_bin%';
+---------------------------------+------------------------------------------+
| Variable_name                   | Value                                    |
+---------------------------------+------------------------------------------+
| log_bin                         | ON    (此处是on表示开启状态,如果是off表示关闭状态)                                   |
| log_bin_basename                | C:\ProgramData\MySQL\log\mysql_bin       |
| log_bin_index                   | C:\ProgramData\MySQL\log\mysql_bin.index |
| log_bin_trust_function_creators | OFF                                      |
| log_bin_use_v1_row_events       | OFF                                      |
| sql_log_bin                     | ON                                       |
+---------------------------------+------------------------------------------+

如果是关闭状态,更改MySQL配置文件的选项(Linux为my.cnf  windows为my.ini)

log-bin=*****/log/mysql_bin.log    ***是你的具体文件路径,这个配置表示binlog日志的输出路径

binlog_format=MIXED                这个配置是指定binlog记录模式(上面介绍的三种STATMENT、ROW、MIXED

然后保存配种文件重启myql

查看binlog日志

首先我们执行一条更新sql:update s_user set name='dangdongli' where id=2;

mysql> update s_user set name='dangdongli' where id=2;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

命令:进入到上面配置的binlog日志目录下  使用命令  mysqlbinlog  mysql_bin.000001

C:\ProgramData\MySQL\log>mysqlbinlog mysql_bin.000001
********************************表示省略了很多行
SET TIMESTAMP=1561218195/*!*/;
update s_user set name='dangdongli' where id=2    //这里就是记录的上面执行的更新语句,记录模式采用的是STATMENT
**********************************表示省略了很多行

redolog

redolog是innodb存储引擎独有的日志系统。redolog实现了crash-safe能力

redolog 是一个可设定大小的固定大小的文件,当日志文件写满时,会擦出掉旧的日志并将数据写道磁盘,然后继续记录日志

write pos 是日志记录的当前位置,check point 是日志的开始位置,当write pos赶上check point的时候,check point 就会往前赶,擦出一部分数据并且写入磁盘。

redolog实现了crash-safe能力。因为当执行器调用存储引擎的更新接口执行更新操作的时候,innodb会首先记录redolog日志,这个日志是磁盘上的文件,也就是说相当于该更新操作是被持久化的,记录完日志,才会更改内存中的数据。

如果此时,MySQL异常重启了,通过redolog是可以恢复之前提交的更改的记录。如果没有日志记录,内存中的数据还没来得及写入磁盘,MySQL异常重启了,内存中的数据就会消失。执行器提交的更新操作是没办法恢复的。

两阶段提交机制

实际上,如果使用了innodb引擎,binlog和redolog是配合工作的。他们之间有一个机制:两阶段事物提交,就是为了保证两个日志文件的数据的一致性。如果日志数据不一致,当做数据恢复的时候,就会出现恢复出来的数据和线上的数据不一致。造成严重的后果。

两阶段提交流程是:

1、记录redolog并更新内存后,redolog处于prepare状态,告知执行器更新操作执行完成未提交事务

2、执行器收到更新操作完成通知后写入binlog然后通知存储引擎提交事务

3、存储引擎提交更新操作事务

这样就保证了redolog和binlog数据的一致性。

 

 

给大家推荐一个MySQL的实力课程,前阿里资深技术专家林晓斌的技术分享,总共45节课程,总时长大约12个小时。

花费12个小时时间从此不再害怕MySQL,从sql执行的每一个细节到MySQL的事物、索引、锁的机制的理解,将帮助你在工作中解决关于mysql的绝大部分问题。

从此不再问度娘这条sql怎么这么慢!!!哈哈哈

欢迎撩我,大家共同探讨学习MySQL。

 

上一篇:MySQL学习-MySQL逻辑架构(一)

下一篇:MySQL学习-MySQL事务(三)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值