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

InnoDB底层原理之MySQL的日志机制

文章目录

  • 架构
    • Server
    • 存储引擎
      • 语句执行过程
        • binLog二进制归档日志
        • 错误日志
        • 通用查询日志

架构

Server

  • 连接器:认证登录,连接管理;
  • 缓存(静态表:系统配置表,字典表,建议使用)(Mysql8.0移除使用);
在my.cnf中#query_cache_type有3个值0代表关闭查询缓存OFF1代表开启ON2(DEMAND)代表当sql语句中有SQL_CACHE关键词时才缓存 query_cache_type=2
  • 分析器:分析语法与字段;
  • 优化器: 拆解SQL语句,选择执行路径的最优解;
  • 执行器:调用存储引擎进行执行

存储引擎

Server层的执行器调用

语句执行过程

Server层对数据的操作都是在缓存里进行,不与磁盘直接交互

updatetableNamesetname="xxx"whereid=1;
  1. 加载旧值

ibd磁盘中加载id=1的整页数据到bufferPool缓存

  1. 修改缓存中的旧值,并存储旧值

bufferPool更新name为新值,将旧值写入undo Log(如果是新增,redoLog为commit状态后,就删除;如果是修改,不能立即删除,需要mvcc中无事务用到才会删除("快照"))中;

  1. 记录redo Log

将磁盘修改的大概位置记录在redo Log中,准备提交事务,为prepare阶段

  1. 记录binLog

将sql语句的逻辑修改写入binLog

  1. 修改redo Log为commit状态
  2. 新值写入磁盘

系统空闲时,将buffer Pool中的数据刷新至磁盘中

  • redoLog写入机制
innodb_flush_log_at_trx_commit

0:每次事务提交只写入buffer Pool;
1(默认):每次事务提交写入磁盘,性能差;
2:每次事务提交写入操作系统的PageCache(匹配内存与磁盘数据交互的速度);

  • InnoDB 有一个后台线程,每隔 1 秒,就会把 redo log buffer 中的日志写到 page cache中,然后调用操作系统函数 fsync 持久化到磁盘文件。
binLog二进制归档日志

只保存修改语句,不保存查询语句

  • 主从DB同步数据用到
binlog_format

0:基于SQL语句的复制(例如DATA()函数在从库上回放时,与主库不一样)
1:基于行的复制
MIXED:函数以行的形式记录,其他情况选择SQL语句形式

  • 数据丢失时用到

回放binLog中的sql记录

找到两条插入数据的sql,每条sql的上下都有BEGIN和COMMIT,我们找到第一条sql BEGIN前面的文件位置标识 at 219(这是文件的位置标识),再找到第二条sql COMMIT后面的文件位置标识 at 701

mysqlbinlog ‐‐no‐defaults ‐‐start‐position=219‐‐stop‐position=701‐‐database=test D:/dev/mysql5.7.25‐winx64/data/mysql‐binlog.000009|mysql ‐uroot ‐p123456 ‐v test

或者基于时间戳回放

mysqlbinlog ‐‐no‐defaults ‐‐startdatetime="2023‐1‐27 23:32:24"‐‐stop‐datetime="2023‐1‐27 23:34:>23"‐‐database=test D:/dev/mysql‐5.7.25‐winx64/data/mysql‐binlog.000009|mysql ‐uroot ‐p123456 ‐v test

若DB无了,需要备份全量数据库+binLog

mysqldump ‐u root 数据库名>备份文件名;#备份整个数据库
  • 数据审计时用到
错误日志

记录MySQL启动,停止,和执行过程中出现的重大错误事件信息;

1# 查看错误日志存放位置2showvariableslike'%log_error%';
通用查询日志

记录用户使用MySQL的所有操作记录,包括连接登录,执行的所有正确或不正确的SQL语句,包括查询,更新等;无论SQL执行成功或者失败。

一般不建议开启,在调试问题时开启

1showvariableslike'%general_log%';2# 打开通用查询日志3SETGLOBALgeneral_log=on;
http://www.jsqmd.com/news/523781/

相关文章:

  • Visual Place Recognition
  • 密码学学习记录
  • Go语言基础之数组
  • 世毫九实验室九大衍生理论课题与技术攻关方向(初审意见)
  • ai---openClaw 配置企业微信
  • CloudFlare域名接入与Nginx真实IP获取实战指南
  • LeetCode 234. 回文链表
  • 永磁同步电机FOC最小损耗算法
  • ESP32开发板国内镜像加速安装指南(附2023最新可用JSON地址)
  • 48个适合人力资源工作和运营的AI提示词
  • 基于MATLAB Simulink的PEM电解槽制氢仿真模型研究
  • 【认知雷达(Cognitive Radar)与深度学习融合架构】第5章 LSTM时序预测与多目标轨迹关联
  • 探索异构混合阶多智能体系统的一致性:UGV 与 UAV 的协同之旅
  • 51单片机初相识
  • 基于多因子定价模型解析:美元强势与利率预期重构驱动的金价8连跌机制
  • Cube MX实战:如何用STM32F系列和ADS1255构建高精度电流源(附完整代码)
  • 分布式驱动电动汽车:最优横摆力矩控制与规则扭矩分配控制的对比研究——基于LQR计算与最小附着利...
  • 聚焦镀锌管/角钢/方管/螺旋管,精选本土标杆企业,助力工程采购决策 - 深度智识库
  • Timer-S1 正式发布:首个十亿级时序基础模型,预测性能达到 SOTA
  • 从这8道Swift题逆袭大厂:2025最新类型系统考点精讲(含泛型实战)
  • 从干系人管理到项目交付:绩效域全流程避坑指南
  • SCN-Adaboost随机配置网络模型的多特征输入二分类及多分类模型实现
  • OpenClaw本地快速部署指南及主流AI模型API接入方法
  • 都在用 Java8 或 Java17,那 Java9 到 16 呢?他们真的没用吗?
  • VideoAgentTrek-ScreenFilter免配置环境:中文Web界面一键启动全流程
  • DeepSeek总结:JDK8-JDK22重要新特性
  • 【56页PPT】工业互联网工业超脑智能制造智慧工厂解决方案:总体架构设计、九大核心价值、九大数字化详细功能介绍、五大要素......
  • 杰理之有USB mic 的同时还需要有16K的IIS 输出 声音异常问题【篇】
  • GriddyCode:用Lua脚本打造个性化代码编辑器的终极指南
  • 手把手教你用fscan+MSF搞定CTFshow内网靶场(附PHAR攻击技巧)