MySQL:简单记录删除binary log的接口和O_DIRECT不会用到REDO

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: 一、栈帧#0 my_delete (name=0x7ffff0fa0490 "./binlog.000005", MyFlags=0) at /root/softm/percona-server-5.

一、栈帧

#0  my_delete (name=0x7ffff0fa0490 "./binlog.000005", MyFlags=0) at /root/softm/percona-server-5.7.22-22/mysys/my_delete.c:25
#1  0x000000000186416f in inline_mysql_file_delete (key=2, src_file=0x2293340 "/root/softm/percona-server-5.7.22-22/sql/binlog.cc", src_line=6735, 
    name=0x7ffff0fa0490 "./binlog.000005", flags=0) at /root/softm/percona-server-5.7.22-22/include/mysql/psi/mysql_file.h:1331
#2  0x0000000001871497 in MYSQL_BIN_LOG::purge_index_entry (this=0x2e39c40, thd=0x7fffa4000b70, decrease_log_space=0x0, need_lock_index=false)
    at /root/softm/percona-server-5.7.22-22/sql/binlog.cc:6735
#3  0x0000000001870b35 in MYSQL_BIN_LOG::purge_logs (this=0x2e39c40, to_log=0x7ffff0fa0a80 "./binlog.000007", included=false, need_lock_index=true, 
    need_update_threads=true, decrease_log_space=0x0, auto_purge=false) at /root/softm/percona-server-5.7.22-22/sql/binlog.cc:6495
#4  0x0000000001868839 in purge_master_logs (thd=0x7fffa4000b70, to_log=0x7fffa4006570 "binlog.000007") at /root/softm/percona-server-5.7.22-22/sql/binlog.cc:3127
#5  0x00000000015b7874 in mysql_execute_command (thd=0x7fffa4000b70, first_level=true) at /root/softm/percona-server-5.7.22-22/sql/sql_parse.cc:2989
#6  0x00000000015c0362 in mysql_parse (thd=0x7fffa4000b70, parser_state=0x7ffff0fa2600) at /root/softm/percona-server-5.7.22-22/sql/sql_parse.cc:5901
#7  0x00000000015b3ef6 in dispatch_command (thd=0x7fffa4000b70, com_data=0x7ffff0fa2d70, command=COM_QUERY)
    at /root/softm/percona-server-5.7.22-22/sql/sql_parse.cc:1490
#8  0x00000000015b2c83 in do_command (thd=0x7fffa4000b70) at /root/softm/percona-server-5.7.22-22/sql/sql_parse.cc:1021
#9  0x00000000016fb8fc in handle_connection (arg=0x38f2910) at /root/softm/percona-server-5.7.22-22/sql/conn_handler/connection_handler_per_thread.cc:312
#10 0x0000000001932112 in pfs_spawn_thread (arg=0x3860a50) at /root/softm/percona-server-5.7.22-22/storage/perfschema/pfs.cc:2190
#11 0x00007ffff7bc6aa1 in start_thread () from /lib64/libpthread.so.0
#12 0x00007ffff6719bcd in clone () from /lib64/libc.so.6

二、大概过程

整个删除过程大概是:

  • 先提取需要删除的binary log 记录到一个 临时的index文件binlog.~rec~中。
  • 将需要保留的binary log文件存放到一个叫做binlog.index_crash_safe的文件中。
  • 将原有的binlog.index进行删除,将binlog.index_crash_safe重新命名为binlog.index。

下面是中间时刻的文件列表。

-rw-r----- 1 root root       80 Jun 26 10:25 binlog.index
-rw-r----- 1 root root       32 Jun 26 10:38 binlog.~rec~
-rw-r----- 1 root root       48 Jun 26 10:39 binlog.index_crash_safe
  • 然后就删除binlog.~rec~记录中的binary log文件。
  • 最后删除binlog.~rec~文件。整个过程集中在。
    函数MYSQL_BIN_LOG::purge_logs中,我们可以将断点设置在my_delete函数上很容易看出这种过程。

下面是我的debug中的一部分:

(gdb) p purge_index_file->file
$6 = 61
OS中我们可以看到这个文件描述符为

61 -> /root/softm/percona-server-5.7.22-22/mysql-test/var/mysqld.1/data/binlog.~rec~

三、innodb_flush_method = O_DIRECT不会影响REDO

innodb_flush_method = O_DIRECT不会影响REDO

os_file_create_func

/* We disable OS caching (O_DIRECT) only on data files */

    if (!read_only
        && *success
        && (type != OS_LOG_FILE && type != OS_DATA_TEMP_FILE)
        && (srv_unix_file_flush_method == SRV_UNIX_O_DIRECT
        || srv_unix_file_flush_method == SRV_UNIX_O_DIRECT_NO_FSYNC)) {

        os_file_set_nocache(file.m_file, name, mode_str);
    } else if (!srv_read_only_mode
           && *success
           && srv_unix_file_flush_method == SRV_UNIX_ALL_O_DIRECT) {
        /* Do fsync() on log and files when setting O_DIRECT fails.
        See log_io_complete() */
        if (!os_file_set_nocache(file.m_file, name, mode_str)) {
            srv_unix_file_flush_method = SRV_UNIX_O_DIRECT;
        }

4、O_DIRECT只影响datafille不影响redo

image.png
image.png

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
14天前
|
SQL 监控 关系型数据库
使用 pt-query-digest 工具分析 MySQL 慢日志
【8月更文挑战第5天】使用 pt-query-digest 工具分析 MySQL 慢日志
22 3
使用 pt-query-digest 工具分析 MySQL 慢日志
|
7天前
|
存储 监控 Java
|
17天前
分享一种接口的日志格式
分享一种接口的日志格式
35 13
|
12天前
|
SQL 关系型数据库 MySQL
MySQL 常见日志清理策略
MySQL 数据库服务器使用多种类型的日志来记录操作和事件,这对于故障诊断、审计和性能分析非常重要。然而,这些日志文件会随着时间的推移而不断增长,可能会占用大量的磁盘空间。因此,定期清理这些日志是必要的,本篇文章我们一起来学习下如何清理 MySQL 中的日志文件。
32 3
|
19天前
|
SQL 存储 监控
(十一)MySQL日志篇之undo-log、redo-log、bin-log.....傻傻分不清!
任何项目都会有日志,MySQL也不例外,而且MySQL更是其中的佼佼者,日志种类繁多,而本篇的目的就是全解MySQL中的各类日志,如撤销日志、错误日志、慢查询日志、中继日志、回滚日志.....
|
20天前
|
存储 开发框架 前端开发
循序渐进VUE+Element 前端应用开发(31)--- 系统的日志管理,包括登录日志、接口访问日志、实体变化历史日志
循序渐进VUE+Element 前端应用开发(31)--- 系统的日志管理,包括登录日志、接口访问日志、实体变化历史日志
|
7天前
|
SQL 关系型数据库 MySQL
MySQL——如何查看MySQL登录日志
MySQL——如何查看MySQL登录日志
21 0
|
12天前
|
关系型数据库 MySQL
清理MySQL的binlog日志
清理MySQL的binlog日志
|
23天前
|
SQL 关系型数据库 MySQL
Mysql 开启慢日志查询及查看慢日志 sql
Mysql 开启慢日志查询及查看慢日志 sql
20 0
|
6天前
|
存储 关系型数据库 MySQL
MySQL——数据库备份上传到阿里云OSS存储
MySQL——数据库备份上传到阿里云OSS存储
20 0