当前位置: 首页 > news >正文

MySQL日志详解

目录

1 redo日志

1.1 redo日志相关参数

1.2 redo日志写入过程分析

1.3 redo日志落盘机制

1.4 redo日志作用

2 binlog日志

2.1 binlog日志相关参数

2.2 查看binlog日志文件

2.3 删除binlog日志文件

2.4 binlog日志切换时机

2.5 binlog日志写入磁盘机制

2.6 binlog日志格式

3 undo日志

3.1 undo日志的类型

3.1.1 insert undo日志

3.1.2 update/delete undo 日志

3.2 undo日志的作用

3.2.1 事务回滚

3.2.2 多版本并发控制(MVCC)

3.3.3 崩溃恢复

3.3 回滚段

3.4 undo日志生命周期

3.4.1 生成阶段

3.4.2 提交/回滚处理

3.4.3 purge清理

3.5 undo日志参数

3.6 undo日志监控

3.7 undo日志优化

3.7.1 undo表空间膨胀

3.7.2 高并发事务undo slot不足

3.7.3 MVCC读性能下降

4 错误日志

5 慢查询日志

6 通用日志


1 redo日志
1.1 redo日志相关参数
  • innodb_log_buffer_size:redo日志缓冲区大小。默认16MB

  • innodb_log_group_home_dir:redo日志文件目录,默认在data目录下
  • innodb_log_files_in_group:redo日志文件个数
  • innodb_log_file_size:单个redo日志文件大小,默认48MB

  • innodb_log_write_ahead_size:
    • redo日志预写块大小
    • 用于优化redo日志写入效率
    • 默认为文件系统块大小
    • 建议值最小为文件系统块大小或者其整数倍

1.2 redo日志写入过程分析

  • redo日志从头开始写,写完一个文件继续写另外一个文件
  • 写到最后一个文件后又回到第一个文件开头开始写
  • write pos是当前记录的位置,一边写一边后移,写到3号文件末尾就回到0号文件开头开始写
  • check point是当前要擦除的开始位置,这个位置开始到wirte pos之间的数据都是需要同步到数据文件里的数据
  • write pos和check point之间的位置是可写区域,
  • 当write pos追上check point时,代表redo日志写满了,需要进行擦除操作才能继续写入
  • 当check point追上write pos时,表示redo数据已全部同步至数据文件

1.3 redo日志落盘机制
  • innodb_flush_log_at_trx_commit:redo日志写入策略
    • 设置为0:表示每次事务提交时都将redo日志写入redo日志缓冲区,数据库宕机时可能会丢失数据
    • 设置为1时(默认值),表示每次事务时都会将redo日志持久化到磁盘,数据最安全,不会因为数据库或者系统宕机导致数据丢失,但是性能差一点
    • 设置为2时,表示每次提交事务时都只是将redo日志写到操作系统缓存(page cache)中,这种情况数据库宕机不会丢失数据,操作系统宕机的话,如果page cache中的数据没来的及写入磁盘文件的话就会丢失数据
    • 同时innodb有一个后台线程,每隔1秒会将redo日志缓冲区中的数据调用操作系统函数write写到文件系统的page cache,然后调用fsync函数将数据持久化到磁盘文件

1.4 redo日志作用

  • redo记录已提交数据数据文件随机转换redo日志顺序提升写入性能

  • 当mysql异常宕机redo日志没来及刷盘
  • mysql启动check point开始按顺序重放redo日志数据写入数据文件确保了已提交数据丢失

2 binlog日志
  • binlog日志记录保存了所有执行过的修改操作语句
  • 不保存查询语句
  • 启用binlog日志,会对性能有一定影响
  • mysql8默认开启binlog
2.1 binlog日志相关参数
  • log_bin:binlog开关,ON|1开启,OFF|0关闭
  • log_bin_basename:binlog日志文件前缀,binlog日志文件名,后面跟着递增序列
  • log_bin_index:binlog日志文件索引,里面记录着当前存在的binlog日志名
  • max_binlog_size:binlog日志文件最大大小,超过该值时会自动切换binlog文件
  • binlog_expire_logs_seconds:binlog过期时间,超过该时间binlog日志文件会被清理
2.2 查看binlog日志文件
  • 查看binlog日志文件列表

  • 查看第一个binlog日志事件

  • 查看指定binlog日志事件

  • 查看当前使用binlog日志文件

  • mysqlbinlog解析binlog日志文件
mysqlbinlog --no-defaults -v --base64-output=decode-rows /var/lib/mysql/mysql-bin.000053

2.3 删除binlog日志文件
  • 删除所有binlog日志文件

  • 删除指定日期binlog日志文件
purge master logs before '2025-04-28 19:12:00';

  • 删除指定日志文件日志文件
purge master logs to 'mysql-bin.000006';

2.4 binlog日志切换时机
  • 执行flush logs
  • binlog日志文件达到配置大小
  • 重启mysql服务
  • mysql异常宕机
2.5 binlog日志写入磁盘机制
  • sync_binlog参数
    • 为0时默认)表示每次提交事务写到os 缓存page cache,由操作系统自行判断什么时候执行fsync写入磁盘服务器宕机有可能丢失数据
    • 1表示每次提交事务都会执行fsync写入磁盘
    • >1表示每次提交事务写入os缓存page cache积累N事务调用fsync写入磁盘服务宕机最多丢失N事务

2.6 binlog日志格式
  • binlog_format参数
  • STATEMENT格式
    • 基于SQL语句复制每一条修改SQL都会记录到binlog
    • 这种方式日志节约IO开销提升性能
    • 但是存在一些执行过程才能确定结果函数比如UUID()SYSDATE()函数会造成主从数据不一致问题
  • ROW格式
    • 基于复制日志会记录每一行数据修改形式然后slave相同数据进行修改
    • 记录下每一行数据修改细节可以解决函数存储过程slave执行导致主从数据不一致问题
    • 但是这种方式日志比较大占用存储影响MySQL性能
  • MIXED格式混合模式
    • MySQL根据每一条具体SQL语句来区分对待记录日志形式
    • 如果sql有函数或者执行知道结果情况就会选择ROW格式
    • 否则选择STATEMENT格式

3 undo日志
3.1 undo日志类型
3.1.1 insert undo日志
  • 记录insert操作仅用于事务回滚事务提交可直接删除无MVCC依赖)
  • 存储插入主键信息用于回滚时删除
3.1.2 update/delete undo 日志
  • 记录update/delete操作需要长期保留直接所有可能访问旧版本数据事务完成
  • 存储被修改数据旧行数据)形成版本
3.2 undo日志作用
3.2.1 事务回滚

执行rollback通过undo日志逆向操作恢复数据事务状态

3.2.2 多版本并发控制MVCC)

其他事务读取数据通过undo日志+read view读取可见数据避免读写冲突

3.3.3 崩溃恢复

数据库异常崩溃通过undo日志回滚未提交事务确保数据一致性

3.3 回滚段
  • mysql管理undo日志采用回滚段方式
  • 每个回滚段包含多个个undo slot每个slot对应一个事务undo日志
  • 不同事务undo日志分配不同slot避免冲突
  • InnoDB默认创建128回滚段每个回滚段支持1024undo slot
  • 因此mysql理论上最大事务并发128*1024=131072
3.4 undo日志生命周期
3.4.1 生成阶段

事务修改数据生成对应undo日志写入回滚段

3.4.2 提交/回滚处理
  • 事务提交时
    • insert undo日志立即标记位可删除
    • update/delete undo日志保留至活跃事务依赖版本
  • 事务回滚使用undo日志逆向恢复数据
3.4.3 purge清理
  • 后台线程定期清理不再需要undo日志
  • 无活跃事务需要访问undo日志才能清理
3.5 undo日志参数
  • innodb_undo_directoryundo表空间存储路径默认data目录
  • innodb_undo_tablespacesundo表空间数量,默认2
  • innodb_max_undo_log_size单个undo表空间最大大小默认1G
  • innodb_undo_log_truncate启用undo表空间自动收缩默认off

3.6 undo日志监控
  • 查看undo表空间使用情况
select *  from information_schema.INNODB_TABLESPACES where SPACE_TYPE = 'Undo'\G

  • 查看undo表空间文件
SELECT tablespace_name, file_name, status  FROM information_schema.FILES  WHERE file_type = 'UNDO LOG';

3.7 undo日志优化
3.7.1 undo表空间膨胀
  • 原因:长事务及时提交事务导致undo日志无法清理
  • 解决方案
    • 监控并终止事务
    • 启动undo表空间自动收缩
    • 手动收缩undo表空间
3.7.2 高并发事务undo slot不足
  • 现象错误 ER_INNODB_TOO_MANY_CONCURRENT_TRXS
  • 解决方案
    • 增加回滚段量(innodb_rollback_segments)
    • 增加undo日志文件innodb_undo_tablespaces
3.7.3 MVCC读性能下降
  • 原因undo版本过长遍历耗时
  • 解决方案
    • 优化事务提交频率减少事务
    • 合理设置隔离级别,如使用 READ COMMITTED 替代 REPEATABLE READ
4 错误日志

记录MySQL数据启动停止以及运行过程错误日志信息

5 慢查询日志
  • 查询sql执行时间超过long_query_time配置记录慢查询日志

  • 开启未使用索引查询sql写入查询日志
set global log_queries_not_using_indexes = on; 

  • mysqldumpslow命令分析慢查询日志
    • 常用参数说明

-s 表示按照何种方式排序
    c 访问次数
    l 锁定时间
    r 返回记录
    t 查询时间
    al 平均锁定时间
    ar 平均返回记录数
    at  平均查询时间
-t 返回前面多少条数据

    • 查询返回记录集最多SQL
mysqldumpslow -s r -t  10 /var/lib/mysql/db2node1-slow.log

    • 查询访问次数最多SQL
mysqldumpslow -s c -t  10 /var/lib/mysql/db2node1-slow.log

    • 查询耗时最多SQL
mysqldumpslow -s t -t  10 /var/lib/mysql/db2node1-slow.log

6 通用日志

记录用户所有操作包括语法错误sql语句

相关文章:

  • Spring事务开发经验 回滚和不回滚?
  • AI应用实战:Excel表的操作工具
  • 51la 统计登录日志-悟空统计成为高效的选择
  • (004)Excel 监视窗口
  • MIT6.S081-lab7
  • 清晰易懂的跨域请求知识——拿捏
  • 《解锁CSS Flex布局:重塑现代网页布局的底层逻辑》
  • 实习技能记录【4】-----消息分发中的观察者模型
  • Canvas基础篇:绘制矩形
  • Git 实操:如何使用交互式 Rebase 移除指定提交(真实案例分享)
  • gradle 下载的tencent的镜像
  • Spark,集群搭建-Standalone
  • 企业战略管理(设计与工程师类)-2-战略规划及管理过程-2-外部环境分析-PESTEL模型实践
  • 从“丈量勘界”到“云端智管”:解码自然资源统一调查监测的智慧密码
  • Linux 下编译BusyBox
  • 《算法笔记》10.5小节——图算法专题->最小生成树 问题 B: Freckles
  • TTL、RS-232 和 RS-485 串行通信电平标准区别解析
  • 如何对多维样本进行KS检验
  • Nerfstudio 环境配置与自有数据集(图片和视频)测试全方位全流程实战【2025最新版!!】
  • Linux 权限管理
  • 江西德安回应“义门陈遗址建筑被没收”:将交由规范的义门陈相关社会组织管理
  • 国有六大行一季度合计净赚超3444亿,不良贷款余额均上升
  • 日韩 “打头阵”与美国贸易谈判,汽车、半导体产业忧虑重重
  • 在差异中建共鸣,《20世纪美国文学思想研究》丛书出版
  • 洛阳原副市长收礼品消费卡,河南通报6起违反八项规定典型问题
  • 又一名90后干部被查,已有多人倒在乡镇领导岗位上