专栏首页腾讯云数据库专家服务MySQL 案例:The age of the last checkpoint is X
原创

MySQL 案例:The age of the last checkpoint is X

背景

近期发现有一个实例 Crash 了,在排查问题的过程中遇到了一个比较少见的日志信息,就抽时间看了一下,在这里做一下记录。

问题描述

现象上,MySQL 出现了 Crash,摘录部分错误日志内容,如下:

2021-03-12T14:54:26.302945+08:00 0 [ERROR] InnoDB: The age of the last checkpoint is 8106349, which exceeds the log group capacity 7546061.
2021-03-12T14:54:37.165502+08:00 0 [Warning] InnoDB: A long semaphore wait:
--Thread 139648846694144 has waited at buf0buf.cc line 4090 for 241.00 seconds the semaphore:
S-lock on RW-latch at 0x7f04f5b122d8 created in file buf0buf.cc line 1428
a writer (thread id 139648846694144) has reserved it in mode  exclusive
number of readers 0, waiters flag 1, lock_word: 0
Last time read locked in file row0sel.cc line 3775
......

这个报错的直接原因就是A long semaphore wait,导致 InnoDB 自己主动 Crash,主要的问题是上面那一段 ERROR 的 log。

原因分析

按经验来推断的话,估计是 last checkpoint 的位置太远,导致 redo log 空间不够用了(8106349 > 7546061)。不过也有人提出了疑问,这个 age 代表的意思不一定是指上一次 checkpoint 到当前的时间,也有可能是指当前需要进行 checkpoint 的位点,超过了 redo log 的大小,所以抛出来这个 ERROR。

最简单的验证办法就是翻一下源代码了,找一下这个报错信息中,位点数据的计算方式。代码以 5.7.31 的官方版本为例,搜索之后找到这一段错误信息所在的位置:

./storage/innobase/log/log0log.cc

log_close(void)
/*===========*/
{
        ......
        lsn = log->lsn;
        ......
        checkpoint_age = lsn - log->last_checkpoint_lsn;

        if (checkpoint_age >= log->log_group_capacity) {
                DBUG_EXECUTE_IF(
                        "print_all_chkp_warnings",
                        log_has_printed_chkp_warning = false;);

                if (!log_has_printed_chkp_warning
                    || difftime(time(NULL), log_last_warning_time) > 15) {

                        log_has_printed_chkp_warning = true;
                        log_last_warning_time = time(NULL);

                        ib::error() << "The age of the last checkpoint is "
                                << checkpoint_age << ", which exceeds the log"
                                " group capacity " << log->log_group_capacity
                                << ".";
                }
        }
        ......
}

可以看到在日志中显示的数值是 checkpoint_age 和 log_group_capacity,后者应该就是 redo log 的大小,前者是通过一个公式计算出来的:

checkpoint_age = lsn - log->last_checkpoint_lsn

从公式上看,显然这个 age 代表的是当前的 LSN 和上一次 checkpoint 时 LSN 的差距。

因此引起这次A long semaphore wait的主要原因就是当前的日志 lsn 距离上一次 checkpoint 过久或者过远,更准确的原因则需要继续深入分析为什么一直没有进行 checkpoint 了,不在本文的讨论范围之内。

总结

知识重积累,不积跬步,无以至千里;不积小流,无以成江海。要认真对待工作中遇到的每一个理解上可能有歧义或者不清晰的问题点和知识点。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MySQL常见的几个错误汇总

    参考自:http://www.blogjava.net/xiaomage234/archive/2014/07/25/416200.html

    二狗不要跑
  • 记一次MYSQL备份失败的排查过程

    数据库实例运行正常的情况,在各个log buffer中,会存有 各个LSN,可以通过 show engine innodb status 查看,但是注意,这个l...

    SEian.G
  • MySQL 日志之 binlog 格式 → 关于 MySQL 默认隔离级别的探讨

      在讲 binlog 之前,我们先来回顾下主流关系型数据库的默认隔离级别,是默认隔离级别,不是事务有哪几种隔离级别,别会错题意了

    青石路
  • Nginx+ownCloud+PHP+MySQL搭建私有云

    ownCloud是一个免费开源的软件,用于为分享文件,日历,联系人,书签和个人音频/视频,它拥有全客户端,方便使用,同时也非常容易安装和管理。

    zhangheng
  • Python基础教程之第5章 条件, 循环和其他语句

    参考链接: Python成员资格和身份运算符 | in, not in, is, is not

    用户7886150
  • Flink源码走读(二):Flink+Kafka实现端到端Exactly Once语义

    Flink通过Checkpoint机制实现了消息对状态影响的Exactly Once语义,即每条消息只会影响Flink内部状态有且只有一次。但无法保证输出到Si...

    2011aad
  • 史上最强解读:Oracle里面为什么没有double write?

    导读:MySQL有double write机制,PostgreSQL有full page write机制,那么Oracle里面为什么没有类似机制呢?

    数据和云
  • 字符串插值_让我们帮助QueryProvider处理插值字符串

    QueryProvider的细节 (Specifics of QueryProvider)

    用户7886150
  • Database of Databases 搜索引擎的妙用

    最近在用 Database of Databases 去查询TiDB 、PolarDB、SequoiaDB、OceanBase的相关资料并做了一些简单的对比。比...

    哒呵呵
  • Managing Large State in Apache Flink®: An Intro to Incremental Checkpointing

    Apache Flink was purpose-built forstatefulstream processing. Let’s quickly revie...

    mikezou
  • 【MySQL(九)| undo log知识补充以及MySQL 系列整理 】

    重做日志缓冲(redo log buffer)是Innodb存储引擎的内存区域中的一部分。

    周三不加班
  • NotFoundError (see above for traceback):

    在训练并保存模型时遇到的错误,解决方法是在ckpt目录前面加个点就可以解决,如下图:

    狼啸风云
  • SDP(8):文本式数据库-MongoDB-Scala基本操作

      MongoDB是一种文本式数据库。与传统的关系式数据库最大不同是MongoDB没有标准的格式要求,即没有schema,合适高效处理当今由互联网+商业产生...

    用户1150956
  • Prometheus监控学习笔记之prometheus 版本1.7 常用启动参数

    -log.level 可选值 [debug, info, warn, error, fatal]  例:-log.level "info"

    Jetpropelledsnake21
  • prometheus 版本1.7 常用启动参数

    参数是使用./prometheus -h 获取的,部分翻译参考网上已有资料。部分参数已经废弃了,因此我这里就没有列出来。

    二狗不要跑
  • pytorch-pretrained-BERT:BERT PyTorch实现,可加载Google BERT预训练模型

    Github上刚刚开源了一个Google BERT的PyTorch实现版本,同时包含可加载Google BERT预训练模型的脚本,感兴趣的同学可以关注:

    AINLP
  • FileSystem/JDBC/Kafka - Flink三大Connector实现原理及案例

    本文分别讲述了Flink三大Connector:FileSystem Connector、JDBC Connector和Kafka Connector的源码实现...

    王知无-import_bigdata
  • 理解CheckPoint及其在Tensorflow & Keras & Pytorch中的使用

    Checkpointing Tutorial for TensorFlow, Keras, and PyTorch

    狼啸风云
  • 聊聊debezium的BinlogReader

    debezium-v1.1.1.Final/debezium-connector-mysql/src/main/java/io/debezium/connect...

    codecraft

扫码关注云+社区

领取腾讯云代金券