【MySQL 数据宝典】【磁盘结构】- 006 bin log 二进制日志的基本模式和参数设置

news2024/9/22 19:31:11

一、基本概念

binlog是一个二进制格式的文件,用于记录用户对数据库更新的SQL语句信息,例如更改数据库表和更改内容的SQL语句都会记录到binlog里,但是不会记录SELECT和SHOW这类操作。

1.1 特点

  • binlog在MySQL的Server层实现(引擎共用)
  • binlog为逻辑日志,记录的是一条SQL语句的原始逻辑
    • binlog不限制大小,追加写入,不会覆盖以前的日志.
    • 默认情况下,binlog日志是二进制格式的,不能使用查看文本工具的命令(比如,cat,vi等)查看,而使用mysqlbinlog解析查看。

开启Binlog日志有以下两个最重要的使用场景:

  • 主从复制:在主库中开启Binlog功能,这样主库就可以把Binlog传递给从库,从库拿到Binlog后实现数据恢复达到主从数据一致性。
  • 数据恢复:通过mysqlbinlog工具来恢复数据。

二、日志的三种模式

2.1 ROW(row-based replication, RBR)

日志中会记录每一行数据被修改的情况,然后在slave端对相同的数据进行修改。

  • 优点:能清楚记录每一个行数据的修改细节,能完全实现主从数据同步和数据的恢复。而且不会出现某些特定情况下存储过程或function,以及trigger的调用和触发器无法被正确复制的问题。
  • 缺点:批量操作,会产生大量的日志,尤其是alter table会让日志暴涨。

2.2 STATMENT(statement-based replication, SBR)

记录每一条修改数据的SQL语句(批量修改时,记录的不是单条SQL语句,而是批量修改的SQL语句事件), slave在复制的时候SQL进程会解析成和原来master端执行过的相同的SQL再次执行。简称SQL语句复制。

  • 优点:日志量小,减少磁盘IO,提升存储和恢复速度
  • 缺点:在某些情况下会导致主从数据不一致,比如last_insert_id()、now()等函数。

30.jpg

2.3 MIXED(mixed-based replication, MBR)

以上两种模式的混合使用,一般会使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,MySQL会根据执行的SQL语句选择写入模式。
企业场景如何选择binlog的模式

  1. 如果生产中使用MySQL的特殊功能相对少(存储过程、触发器、函数)。选择默认的语句模式,Statement。
  2. 如果生产中使用MySQL的特殊功能较多的,可以选择Mixed模式。
  3. 如果生产中使用MySQL的特殊功能较多,又希望数据最大化一致,此时最好Row 模式;但是要注意,该模式的binlog日志量增长非常快.
  • 跳过语句模式:默认情况下,MySQL复制使用的是语句模式(Statement mode),即主服务器上执行的SQL语句会被发送到从服务器执行。然而,对于某些存储过程,MySQL可能无法正确复制执行过程中的SQL语句,因为存储过程可能包含了诸如非确定性函数、临时表等语句,这些语句在从服务器上可能无法正确执行,从而导致复制的不一致性。
  • 函数依赖:存储过程中可能会调用其他存储过程或自定义函数,而这些函数的结果可能会因为主服务器和从服务器上的数据不一致而产生不同的结果,导致数据不一致。
  • 依赖外部数据:存储过程可能会依赖外部的数据或环境变量,而这些数据在主服务器和从服务器上可能不同,导致存储过程的执行结果不一致。
  • 并发执行问题:如果多个客户端同时执行存储过程,可能会出现并发执行的问题,从而导致数据不一致。

三、 Binlog写入机制

3.1 binlog文件结构

  • MySQL的binlog文件中记录的是对数据库的各种修改操作,用来表示修改操作的数据结构是Log event。不同的修改操作对应的不同的log event。
    • 比较常用的log event有:Query eventRow eventXid event等。binlog文件的内容就是各种Log event的集合。

31.jpg

3.2 binlog落盘策略

binlog 的写入顺序: binlog cache (write) -> OS cache  -> (fsync) disk.

  • write表示: 写入文件系统缓存,fsync表示持久化到磁盘的时机
  • binlog刷数据到磁盘由参数sync_binlog进行配置
    • sync_binlog=0 的时候,表示每次提交事务都只 write,不 fsync;
    • sync_binlog=1 的时候,表示每次提交事务都会执行 fsync;
    • sync_binlog=N(N>1) 的时候,表示每次提交事务都 write,但累积 N 个事务后才 fsync。
mysql> show variables like '%sync_binlog%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sync_binlog   | 1     |
+---------------+-------+
1 row in set (0.00 sec)

注意: 不建议将这个参数设成 0,比较常见的是将其设置为 100~1000 中的某个数值。如果设置成0,主动重启丢失的数据不可控制。设置成1,效率低下,设置成N(N>1),则主机重启,造成最多N个事务的binlog日志丢失,但是性能高,丢失数据量可控

3.3 binlog 写入流程

  1. 根据记录模式和操作触发event事件生成log event.
  2. 事务执行过程中,先把日志(log event) 写到binlog cache,事务提交的时候,再把binlog cache写到binlog文件中。
  3. binlog cache,系统为每个线程分配了一片binlog cache内存 (每个线程都有自己的binlog cache,共用一份binlog文件) .
  4. 事务提交的时候,执行器把binlog cache里完整的事务写入binlog中。并清空binlog cache.

3.4 redo log 和 binlog的区别

特性redo logbinlog
引擎支持InnoDB 引擎特有MySQL 的 Server 层实现,所有引擎都可以使用
日志类型物理日志逻辑日志
记录内容记录的是“在XXX数据页上做了XXX修改”记录的是原始逻辑,其记录是对应的 SQL 语句
日志写入方式循环写追加写
写入空间管理需要 write pos 和 check point 搭配写到一定大小会切换到下一个,并不会覆盖以前的日志
用途作为服务器异常宕机后事务数据自动恢复使用可以作为主从复制和数据恢复使用
CrashSafe能力没有

CrashSafe指MySQL服务器宕机重启后,能够保证:

  • 所有已经提交的事务的数据仍然存在。
  • 所有没有提交的事务的数据自动回滚。

四、Binlog命令操作

4.1 使用sql命令查看binlog文件

启用Binlog

vim /etc/my.cnf

--增加下面几个参数
binlog-format=ROW
log-bin=mysqlbinlog
server-id=1

-- 重启mysql
systemctl restart mysqld
  • binlog-format: 文件模式
  • log-bin: mysql会根据这个配置自动设置log_bin为on状态,自动设置log_bin_index文件为你指定的文件名后跟.index
  • server-id=1:  随机指定一个不能和其他集群中机器重名的字符串,如果只有一台机器,那就可以随便指定了

启动成功之后,我们可以登陆查看我们的配置是否起作用

mysql> show variables like '%log_bin%';
+---------------------------------+----------------------------------+
| Variable_name                   | Value                            |
+---------------------------------+----------------------------------+
| log_bin                         | ON                               |
| log_bin_basename                | /var/lib/mysql/mysqlbinlog       |
| log_bin_index                   | /var/lib/mysql/mysqlbinlog.index |
| log_bin_trust_function_creators | OFF                              |
| log_bin_use_v1_row_events       | OFF                              |
| sql_log_bin                     | ON                               |
+---------------------------------+----------------------------------+
  • log_bin: 是否开启binlog日志
  • log_bin_basename: 基础文件名
  • log_bin_index : binlog文件的索引文件,管理所有binlog文件
  • sql_log_bin: 表示当前会话是否记录 bin log,默认值on(当sql_log_bin关闭后,主库服务器上的改动不记录bin log,不会复制到从库)。

查看binlog文件列表

  mysql> show binary logs;
+--------------------+-----------+
  | Log_name           | File_size |
  +--------------------+-----------+
  | mysqlbinlog.000001 |       177 |
  | mysqlbinlog.000002 |       177 |
  | mysqlbinlog.000003 |       154 |
  +--------------------+-----------+

查看正在写入的binlog文件

  show master status;

查看binlog文件信息

使用show binlog events命令查询到的每一行数据就是一个binlog管理事件

mysql> show binlog events;
+--------------------+-----+----------------+-----------+-------------+---------------------------------------+
| Log_name           | Pos | Event_type     | Server_id | End_log_pos | Info                                  |
+--------------------+-----+----------------+-----------+-------------+---------------------------------------+
| mysqlbinlog.000001 |   4 | Format_desc    |         1 |         123 | Server ver: 5.7.30-log, Binlog ver: 4 |
| mysqlbinlog.000001 | 123 | Previous_gtids |         1 |         154 |                                       |
| mysqlbinlog.000001 | 154 | Stop           |         1 |         177 |                                       |
+--------------------+-----+----------------+-----------+-------------+-----------

参数说明

  • Log_name:当前事件所在的binlog文件名称;
  • Pos:当前事件的开始位置,每个事件都占用固定的字节大小,结束位置(End_log_position)减去Pos,就是这个事件占用的字节数。

第一个事件位置并不是从0开始,而是从4。Mysql通过文件中的前4个字节,来判断这是不是一个binlog文件。这种方式很常见,很多格式文件,如pdf、doc、jpg等,都会通常前几个特定字符判断是否是合法文件。

  • Event_type:表示事件的类型;
  • Server_id:表示产生这个事件的mysql server_id,通过设置my.cnf中的server-id选项进行配置;
  • End_log_position:下一个事件的开始位置;
  • Info:当前事件的描述信息。

查看指定binlog文件内容

mysql> show binlog events in 'mysqlbinlog.000001'\G;
*************************** 1. row ***************************
   Log_name: mysqlbinlog.000001
        Pos: 4
 Event_type: Format_desc
  Server_id: 1
End_log_pos: 123
       Info: Server ver: 5.7.30-log, Binlog ver: 4
*************************** 2. row ***************************
   Log_name: mysqlbinlog.000001
        Pos: 123
 Event_type: Previous_gtids
  Server_id: 1
End_log_pos: 154
       Info: 
*************************** 3. row ***************************
   Log_name: mysqlbinlog.000001
        Pos: 154
 Event_type: Stop
  Server_id: 1
End_log_pos: 177
     Info: 
3 rows in set (0.00 sec)

使用mysqlbinlog命令查看binlog文件

  • mysql给我们提供了一个用于查看binlog日志的工具,叫做mysqlbinlog
[root@localhost mysql]# mysqlbinlog mysqlbinlog.000001
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
  /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
  # at 4
  #220125  6:40:35 server id 1  end_log_pos 123 CRC32 0x1e570724  Start: binlog v 4, server v 5.7.30-log created 220125  6:40:35 at startup
  ROLLBACK/*!*/;
BINLOG '
  4wvwYQ8BAAAAdwAAAHsAAAAAAAQANS43LjMwLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADjC/BhEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
  ASQHVx4=
  '/*!*/;
  # at 123
  #220125  6:40:35 server id 1  end_log_pos 154 CRC32 0x43fa19f1  Previous-GTIDs
  # [empty]
  # at 154
  #220125  6:41:17 server id 1  end_log_pos 177 CRC32 0x205de899  Stop
  SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
  DELIMITER ;
  # End of log file
  /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
  /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

输出指定position位置的binlog日志

 mysqlbinlog --start-position='154' --stop-position='177'

输出指定position位置的binlog日志到指定文件中

mysqlbinlog --start-position='154' --stop-position='177' mysqlbinlog.000001 > test.log

输出指定position位置的binlog日志到压缩文件中

mysqlbinlog --start-position="指定开始位置" --stop-position="指定结束位置" binlog文件|gzip > 压缩文件名

输出指定开始时间的binlog日志

mysqlbinlog --start-datetime="yyyy-MM-dd HH:mm:ss" binlog文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1616743.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

clickhouse数据去重函数介绍(count distinct)

非精确去重函数:uniq、uniqHLL12、uniqCombined 精确去重函数:uniqExact、groupBitmap 测试数据量:2000w 结论: 1.整形值精确去重场景,groupBitmap 比 uniqExact至少快 2x 2.groupBitmap仅支持无符号整形值去重&#x…

JavaAgent的agent与attach

文章目录 简介agent与attachagentattach如何attachpom.xml 简介 javaagent是什么? 从名字agent也可以看出,是一种代理。 javaagent用来做什么? 本质上是对class的一种增强,用来实现一些通用功能,例如链路追踪等。 …

日语里「直す」和「治す」的区别,柯桥日语考级培训

「直す(なおす)」 「直す(なおす)」是指纠正错误或人的性格,将坏掉的东西恢复原状。 例如:以「テレビを直す」为例,就是把坏掉的电视恢复到原来的正常状态。 「直す」可以加在动词后面,表现出主动改善的意愿。 例如:「写真を撮…

产品推荐 | 基于XILINX VERSAL的XW-NVME-X16-2SAS智能FPGA加速卡

01 产品概述 XW-NVME-X16-2SAS智能存储加速卡基于XILINX VERSAL ACAP MPSOC,EP侧提供1路PCIe GEN4 x16接口,RP侧最大可支持2路PCIe GEN4 x8,或4路PCIe GEN4 x 4,板载DDR4-3200MHz缓存,具有低延迟、高性能、低能耗、低…

智慧灯杆sip广播可视对讲解决方案

智慧灯杆sip广播可视对讲解决方案 智能路灯以城市公共设施的全面高效利用为出发点,根据路况加载智能照明、新能源汽车充电桩、城市广播、视频监控、WIFI热点、LED/LCD信息发布、环境监测、微型基站、停车场管理、井盖等。监控和USB手机充电灯功能,不仅能…

图像哈希:QDFT篇

这个领域的背景 相关性质 QDFT和IQDFT的公式: F ( u , v ) 1 M ∑ x 0 M − 1 ∑ y 0 M − 1 e − 2 μ π ( u x M v y M ) f ( x , y ) f ( x , y ) 1 M ∑ u 0 M − 1 ∑ v 0 M − 1 e − 2 μ π ( u x M v y M ) f ( u , v ) 注:如果是 …

05_Qt资源文件添加

Qt资源文件添加 Qt 资源系统是一个跨平台的资源机制,用于将程序运行时所需要的资源以二进制的形式存储于可执行文件内部。如果你的程序需要加载特定的资源(图标、文本翻译等),那么,将其放置在资源文件中,就…

10.Godot Input与自定义单例的使用

单例 单例是一个可以在任何一个脚本中对其进行直接访问的对象,分为内置单例与自定义单例。每个单例都是独一无二的对象。内置单例不是节点,主要成员是各类 Server,开发者可以使用它们直接控制游戏程序的图形与音效等内容。此外,还…

Keil中编译无error(有warning),但程序无法运行的一种情况

问题 void Run_Led(void) {HAL_GPIO_TogglePin(RUN_LED_GPIO_Port, RUN_LED_Pin);Delay_ms(500); }void StartDefaultTask(void *argument) {/* USER CODE BEGIN StartDefaultTask */char c;/* Infinite loop */for(;;){while(1) { Run_Led;}...}非常简单的一个程序&#xf…

直播回顾 | 长安链可验证数据库技术架构和代码解读

3月29日长安链可验证数据库技术架构和代码解读中,北京大学博士后研究员高健博带开发者一起了解了长安链可验证数据库的应用背景、设计实现方式和功能代码结构。 数据存证以及通过智能合约进行数据共享是目前联盟链最直接、最广泛的应用场景。在很多存证场景中&…

服务器如何开启远程连接?

服务器开启远程连接是网络管理中一项重要的功能。通过远程连接,用户可以在任何地方远程访问服务器,从而进行管理、维护和监控等操作。远程连接的开启可以为工作提供便利性和效率,但同时也带来了安全风险。确保远程连接的安全性和可靠性是至关…

html接入腾讯地图

1.申请key key申请地址&#xff1a;https://lbs.qq.com/dev/console/application/mine 官方文档 https://lbs.qq.com/webApi/javascriptGL/glGuide/glBasic 2.html接入示例 <!DOCTYPE html> <html lang"en"> <head><meta charset"U…

如何训练一个大语言模型(LLMs)

目录 前言大语言模型 Vs机器学习模型训练过程步骤1&#xff1a;数据策划&#xff08;Data Curation)步骤2&#xff1a;格式化与预处理步骤3&#xff1a;训练模型步骤4&#xff1a;模型评估 LLM Leaderboard[LLM Leaderboard 2024](https://www.vellum.ai/llm-leaderboard)[Open…

实时数仓选型

实时数仓选型 实时数仓选型第一版实时数仓选型第二版 实时数仓选型第一版 实时数仓分层: 计算框架:Flink;存储框架:消息队列(可以实时读取&可以实时写入)ODS:Kafka 使用场景:每过来一条数据,读取到并加工处理DIM: HBase 使用场景:事实表会根据主键获取一行维表数据(1.永…

6个好用的AI绘画网站,AI画画操作简单更好看

如今&#xff0c;越来越多的人在艺术领域选择使用AI绘画软件进行创作&#xff0c;这已经成为一种趋势。以下是几款好用的AI绘画软件&#xff0c;可以帮助你和你的小伙伴们的AI画画操作简单更好看。 下面先欣赏AI美图~ 爱制作AI: 独特优势&#xff1a;爱制作AI是爱制作AI拥有强…

网页视频录制技巧,这2个方法一定要收好!

“大家知道如何录制网页上的视频吗&#xff1f;我现在有一个重要的项目&#xff0c;需要录制一段在线视频作为参考。但是尝试了好几种方法&#xff0c;都没能成功。时间紧迫&#xff0c;我真的非常需要这个视频。大家有没有好的建议或者方法呢&#xff1f;谢谢了&#xff01;”…

UG10.如何设置鼠标滚轮操作模型放大缩小方向?

UG10.如何设置鼠标滚轮操作模型放大缩小方向呢&#xff1f;看一下具体操作步骤吧。 首先打开UG10.软件&#xff0c;在主菜单栏选择【文件】下拉菜单&#xff0c;选择【实用工具】。 点击【用户默认设置】。 文章源自四五设计网-https://www.45te.com/45545.html 选中【基本环…

分享基于鸿蒙OpenHarmony的Unity团结引擎应用开发赛

该赛题旨在鼓励更多开发者基于OpenHarmony4.x版本&#xff0c;使用团结引擎创造出精彩的游戏与应用。本次大赛分为“创新游戏”与“创新3D 化应用”两大赛道&#xff0c;每赛道又分“大众组”与“高校组”&#xff0c;让不同背景的开发者同台竞技。无论你是游戏开发者&#xff…

LabVIEW轴承表面缺陷检测系统

LabVIEW轴承表面缺陷检测系统 为了解决轴承生产中人工检测效率低下、误检率高的问题&#xff0c;实现了一套基于LabVIEW的轴承表面缺陷自动检测系统。该系统利用工业相机采集轴承图像&#xff0c;通过图像处理技术对轴承表面的划痕缺陷和倒角缺陷进行自动识别和分析&#xff0…

Linux中inode号与日志分析

一.inode号 1.inode表结构 元信息&#xff1a;每个文件的属性信息&#xff0c;比如&#xff1a;文件的大小&#xff0c;时间&#xff0c;类型&#xff0c;权限等&#xff0c;称为文件的元数据(meta data 元信息 ) 元数据是存放在inode&#xff08;index node&#xff09;表中…