MySQL中的binlog和redo浅析(r12笔记第5天)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介:    有一个小问题可能很多人都想起过,那就是MySQL中既然已经有了binlog,为什么还需要redo,这个问题看起来好像很简单,但是细细品来,还是有不少值得注意的地方。

   有一个小问题可能很多人都想起过,那就是MySQL中既然已经有了binlog,为什么还需要redo,这个问题看起来好像很简单,但是细细品来,还是有不少值得注意的地方。

    对于数据恢复,尤其是异常宕机的情况下,再次启动的时候,如何恢复,恢复的数据依据,这个尤为重要,在MySQL中是有checkpoint的技术来做一个基本的检查点控制,也就是常说的LSN,对于事务性数据库,大都会采用write ahead log的策略,即当前事务提交的时候,先写redo,在修改相应的页,如果发生宕机导致数据丢失的时候,可以通过重做日志来完成数据的恢复,但是MySQL和其它有些数据库有些特别的是这个binlog,它不是采用checkpoint的实现方式,我们可以设想这样一个情况,一个事务提交的时候,信息会写入redo,而在这个操作的过程中,其实binlog的写入也是同步的,如果redo的信息在redo log buffer中可能还没有刷新到磁盘中,出现宕机的情况,就可能导致从库的数据已经应用了binlog传输的数据变化,而redo中还没来得及提交,这可能就会有数据不一致的情况发生,如果在异常状态下启动数据库就会开启数据恢复的模式,可能从库的数据就会出现不一致。

   这种情况听起来有些特别,但是对于我们理解redo和binlog的问题蛮有帮助,我们来做一个测试吧,仅仅在测试环境中进行调试所用。

首先为了减少数据的变更影响,我们先做一个flush logs的操作,尽可能保留少,数据变化新的日志内容

在主库端切换日志:
flush logs;

查看binlog的情况,使用show master status或者show binary logs都可以。
mysql> show master status\G
*************************** 1. row ***************************
             File: binlog.000014
         Position: 230
     Binlog_Do_DB:
 Binlog_Ignore_DB:
Executed_Gtid_Set: 1bb1b861-f776-11e6-be42-782bcb377193:1,
25ee7482-07cd-11e7-a40c-0026b935eb76:1-1502468
1 row in set (0.00 sec)

我们得到mysql服务的进程号。
# ps -ef|grep -w mysqld|grep -v grep|awk '{print $2}'
1751

我们创建一个表test 字段为id和name(id int ,name varchar(20))

已经存在4条数据如下:

mysql> select *from test.test;
+------+------+
| id   | name |
+------+------+
|    1 | aa   |
|    2 | bb   |
|    3 | cc   |
|    4 | dd   |
+------+------+
4 rows in set (0.00 sec)


从库 查看数据和主库此时是同步的。这是我们测试的一个基础。

我们可以通过gdb的方式进行简单调试。
# gdb -p 1751

就马上进入了调试模式,我们可以设置一个断点。


我们在设置断点之前先插入2条数据,从库此时也是5条数据。

mysql> insert into test values(5,'ee');
Query OK, 1 row affected (0.00 sec)

mysql> insert into test values(6,'ff');
Query OK, 1 row affected (0.00 sec)

然后设置断点,这是关键所在。
(gdb) b MYSQL_BIN_LOG::process_commit_stage_queue
Breakpoint 1 at 0xec73ca: file /export/home/pb2/build/sb_0-21378219-1480347226.17/mysql-5.7.17/sql/binlog.cc, line 8430. (2 locations)


然后在主库尝试插入一条记录
insert into test values(7,'gg');
毫无疑问,这条语句会hang住。因为我们的断点就在提交的时候。

这个时候我们前进一小步,使用c即continue

(gdb) c
Continuing.
[Switching to Thread 0x409c0940 (LWP 1798)]

Breakpoint 1, MYSQL_BIN_LOG::process_commit_stage_queue (this=0x1e8ba00, thd=0xec254e0, first=0xec254e0)
    at /export/home/pb2/build/sb_0-21378219-1480347226.17/mysql-5.7.17/sql/binlog.cc:8430
8430    /export/home/pb2/build/sb_0-21378219-1480347226.17/mysql-5.7.17/sql/binlog.cc: No such file or directory.
        in /export/home/pb2/build/sb_0-21378219-1480347226.17/mysql-5.7.17/sql/binlog.cc
这个时候那条SQL语句依旧是hang的状态,但是可以看出堆栈,binlog是写入完成了


从库此时是应用了数据变更,此时是7条数据。
我们也可以抓取一下binlog,看看里面是否已经写入了数据。
[root@grtest s1]# /usr/local/mysql/bin/mysqlbinlog -vv binlog.0000014
可以明显看到这样的语句:

...

BINLOG '
DK3KWBPqDAAALgAAAHcDAAAAAOUAAAAAAAEABHRlc3QABHRlc3QAAgMPAhQAAw==
DK3KWB7qDAAAJwAAAJ4DAAAAAOUAAAAAAAEAAgAC//wHAAAAAmdn
'/*!*/;
### INSERT INTO `test`.`test`
### SET
###   @1=7 /* INT meta=0 nullable=1 is_null=0 */
###   @2='gg' /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
# at 926
#170316 23:19:40 server id 3306  end_log_pos 953        Xid = 55
COMMIT/*!*/;
我们此时模拟宕机的情况,杀掉进程

 kill -9 1751 29617

然后把binlog改个名字,关闭log_bin
[root@grtest s1]# mv binlog.000014  binlog.000014.bak
再次启动之后,就会发现此时的主库中数据还是6条,而从库却是7条。
  而如果我们把binlog改回来,开启log_bin并启动主库
mv binlog.000014.bak binlog.000014

   然后再次查看数据,就会发现主从库此时的数据竟然不同。从库的数据明显要多,这也就从一个侧面映射了我们开始的一个设想,在异常宕机的情况下,redo的数据还没有刷新到redo文件中,此时已经写入了binlog,这样就在这样一个临界点导致了主从数据的不一致。

   当然我是使用一个调试的态度来做的测试,里面还有很多技巧需要巩固。



相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
17天前
|
关系型数据库 MySQL
【MySQL实战笔记】07 | 行锁功过:怎么减少行锁对性能的影响?-01
【4月更文挑战第18天】MySQL的InnoDB引擎支持行锁,而MyISAM只支持表锁。行锁在事务开始时添加,事务结束时释放,遵循两阶段锁协议。为减少锁冲突影响并发,应将可能导致最大冲突的锁操作放在事务最后。例如,在电影票交易中,应将更新影院账户余额的操作安排在事务末尾,以缩短锁住关键行的时间,提高系统并发性能。
14 4
|
18天前
|
关系型数据库 MySQL 数据库
【MySQL实战笔记】 06 | 全局锁和表锁 :给表加个字段怎么有这么多阻碍?-01
【4月更文挑战第17天】MySQL的锁分为全局锁、表级锁和行锁。全局锁用于全库备份,可能导致业务暂停或主从延迟。不加锁备份会导致逻辑不一致。推荐使用`FTWRL`而非`readonly=true`因后者可能影响其他逻辑且异常处理不同。表级锁如`lock tables`限制读写并限定操作对象,常用于并发控制。元数据锁(MDL)在访问表时自动加锁,确保读写正确性。
66 31
|
2天前
|
存储 SQL 关系型数据库
MySQL万字超详细笔记❗❗❗
MySQL万字超详细笔记❗❗❗
38 1
MySQL万字超详细笔记❗❗❗
|
7天前
|
SQL 关系型数据库 MySQL
【MySQL系列笔记】MySQL总结
MySQL 是一种关系型数据库,说到关系,那么就离不开表与表之间的关系,而最能体现这种关系的其实就是我们接下来需要介绍的主角 SQL,SQL 的全称是 Structure Query Language ,结构化的查询语言,它是一种针对表关联关系所设计的一门语言,也就是说,学好 MySQL,SQL 是基础和重中之重。SQL 不只是 MySQL 中特有的一门语言,大多数关系型数据库都支持这门语言。
86 8
|
7天前
|
SQL 关系型数据库 MySQL
【MySQL系列笔记】常用SQL
常用SQL分为三种类型,分别为DDL,DML和DQL;这三种类型的SQL语句分别用于管理数据库结构、操作数据、以及查询数据,是数据库操作中最常用的语句类型。 在后面学习的多表联查中,SQL是分析业务后业务后能否实现的基础,以及后面如何书写动态SQL,以及完成级联查询的关键。
64 6
|
7天前
|
存储 关系型数据库 MySQL
【MySQL系列笔记】InnoDB引擎-数据存储结构
InnoDB 存储引擎是MySQL的默认存储引擎,是事务安全的MySQL存储引擎。该存储引擎是第一个完整ACID事务的MySQL存储引擎,其特点是行锁设计、支持MVCC、支持外键、提供一致性非锁定读,同时被设计用来最有效地利用以及使用内存和 CPU。因此很有必要学习下InnoDB存储引擎,它的很多架构设计思路都可以应用到我们的应用系统设计中。
67 4
|
7天前
|
SQL 存储 关系型数据库
【MySQL系列笔记】SQL优化
SQL优化是通过调整数据库查询、索引、表结构和配置参数等方式,提高SQL查询性能和效率的过程。它旨在减少查询执行时间、减少系统资源消耗,从而提升数据库系统整体性能。优化方法包括索引优化、查询重写、表分区、适当选择和调整数据库引擎等。
71 3
|
8天前
|
DataWorks 关系型数据库 MySQL
DataWorks产品使用合集之在DataWorks中,如何通过PolarDB for MySQL来查看binlog日志
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
25 1
|
16天前
|
关系型数据库 MySQL 中间件
【MySQL实战笔记】07 | 行锁功过:怎么减少行锁对性能的影响?-02 死锁和死锁检测
【4月更文挑战第19天】在高并发环境下,死锁发生在多个线程间循环等待资源时,导致无限期等待。MySQL中,死锁可通过`innodb_lock_wait_timeout`参数设置超时或`innodb_deadlock_detect`开启死锁检测来解决。默认的50s超时可能不适用于在线服务,而频繁检测会消耗大量CPU。应对热点行更新引发的性能问题,可以暂时关闭死锁检测(风险是产生大量超时),控制并发度,或通过分散记录减少锁冲突,例如将数据分拆到多行以降低死锁概率。
24 1
|
19天前
|
关系型数据库 MySQL 索引
【MySQL实战笔记】 05 | 深入浅出索引(下)-02
【4月更文挑战第16天】B+树索引利用最左前缀原则加速检索,即使只是部分字段匹配也能生效。联合索引[name-age]可按最左字段"张"找到记录,并遍历获取结果。优化索引顺序能减少维护成本,通常先考虑复用性。若需独立查询部分字段,则需权衡空间占用,如(name,age)与(age)。索引下推自MySQL5.6起,允许在索引遍历时预过滤条件,减少回表次数,提高效率。
27 4