MySql的binlog与数据的恢复

news2025/1/18 3:55:10

目录

  • 什么是binlog
  • binlog的作用
  • binlog的三种模式
  • binlog的开启
  • 数据的恢复与回滚
  • binlog日志的删除

什么是binlog

binlog我们一般叫做归档日志,他是mysql服务器层的日志,跟存储引擎无关,他记录的是所有DDL和DML的语句,不包含查询语句,binlog是一种逻辑日志,他记录的是sql语句的原始逻辑,binlog写满后会切换到下一个日志继续写,不会覆盖以前的日志。mysql8版本之后是默认是开的,这之前的版本需要我们手动的开启。

  • DDL(Data Definition Language):数据库定义语言,主要用于定义和管理数据库的结构,包括创建,修改,删除库,表,视图,索引等,DDL的常用命令CREATE,ALTER ,DROP等。
  • DML(Data Manipulation Language) :数据库操作语言,用于对数据的操作,包括查询,插入,修改,删除等,DML常用的命令INSERT,UPDATE,DELETE等

binlog的作用

binlog组要有两个作用:

  • MySql主从复制:主机开启binlog,主机会将binlog同步复制该从节点,从节点通过读取binlog来同步主节点的数据
  • mysql的数据恢复:通过使用binlog工具结合binlog可以将数据恢复到数据库某一时刻

binlog的三种模式

基于SQL语句的复制(statement-based replication, SBR),基于行的复制(row-based replication, RBR),混合模式复制(mixed-based replication, MBR)。对应的,binlog的格式也有三种:STATEMENT,ROW,MIXED。
① STATEMENT模式(SBR)
每一条会修改数据的sql语句会记录到binlog中。优点是并不需要记录每一条sql语句和每一行的数据变化,减少了binlog日志量,节约IO,提高性能。缺点是在某些情况下会导致master-slave中的数据不一致(如sleep()函数, last_insert_id(),以及user-defined functions(udf)等会出现问题)
② ROW模式(RBR)
不记录每条sql语句的上下文信息,仅需记录哪条数据被修改了,修改成什么样了。而且不会出现某些特定情况下的存储过程、或function、或trigger的调用和触发无法被正确复制的问题。缺点是会产生大量的日志,尤其是alter table的时候会让日志暴涨。
③ MIXED模式(MBR)
以上两种模式的混合使用,一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,MySQL会根据执行的SQL语句选择日志保存方式。

binlog的开启

mysql> show variables like '%log_bin%';

在这里插入图片描述
默认是没有开启的,所以需要开启,需要编辑/etc/my.cnf 配置文件

#开启bin 日志
log-bin=mysql-bin
#服务器标志号,注意在配置文件中不能出现多个这样的标识,如果出现多个的话mysql以第一个为准,一组主从中此标识号不能重复。
server-id=1
#开启bin-log,并指定文件目录和文件名前缀。
log-bin=/home/mysql/logs/binlog/bin-log 
# 每个bin-log最大大小,当此大小等于500M时会自动生成一个新的日志文件。一条记录不会写在2个日志文件中,所以有时日志文件会超过此大小。
max_binlog_size=500M
#日志缓存大小
binlog_cache_size=128K 
#需要同步的数据库名字,如果是多个,就以此格式在写一行即可
binlog-do-db=syn_test    
#不需要同步的数据库名字,如果是多个,就以此格式在写一行即可。
#binlog-ignore-db=mysql 
#当Slave从Master数据库读取日志时更新新写入日志中,如果只启动log-bin 而没有启动log-slave-updates则Slave只记录针对自己数据库操作的更新。
log-slave-updates
expire_logs_day=7 #设置bin-log日志文件保存的天数,此参数mysql5.0以下版本不支持。
binlog_format="MIXED" #设置bin-log日志文件格式为:MIXED,可以防止主键重复

然后重启mysql 即可 systemctl mysqld resteart
在这里插入图片描述
也可以查看当前的模式:

mysql> show variables like '%binlog_format%';

在这里插入图片描述
这个时候操作syn_test的话就有日志了,但是生成的日志是二进制的,我们需要工具mysqlbinlog来查看:

[root@node03 mysql]# mysqlbinlog master-bin.000004

在这里插入图片描述
使用myslq的命令可以查看:

mysql> show binlog events in 'master-bin.000004'

在这里插入图片描述

数据的恢复与回滚

恢复数据库中的数据的话,指定位置即可:

mysqlbinlog mysql-bin.000009 --start-position 154 --stop-position 755 | mysql -uroot -p mytest

或者可以根据时间将日志转为我们可以看的懂的sql:

mysqlbinlog --no-defaults --base64-output=decode-rows -v 
--start-datetime="2023-12-12 00:00:00" 
--stop-datetime="2023-12-28 00:00:00" mysql-bin.000001 > output.txt

特别需要注意的是binlog通常是用来做数据恢复,而不是回滚,比如说0点数据库备份之后,到早上7点数据库损坏,那么可以根据binlog恢复0点到7点的所有操作数据,因为binlog下大部分记录的是sql语句,那就可以按照sql语句执行一遍即可,如果是数据回滚,在STATEMENT和MIXED模式下,update了某一个数据或者delete数据,binlog记录只是update和delete语句,那么update和delete的完整数据就不存在了,所以没办法进行数据的回滚。在row模式下,必须是binlog_row_image为full的情况下,update和delete是有记录详细的update信息的,是可以回滚的。
比如在row模式执行下面语句

update teacher set t_name = '小七' WHERE t_id = '04';
delete from  teacher WHERE t_id = '04';
使用mysqlbinlog:
mysqlbinlog --base64-output=decode-rows -v  mysql-bin.000036 > test.sql
在ROW模式下使用mysqlbinlog要添加参数--base64-output=decode-rows 否则看不懂

在这里插入图片描述
我们只需要将数据还原回去就可以了,比如DELETE改为INSERT,update则是where和set互换等。
这个日志中有记录事务的具体ID的,比如说XID=680,这个再事务中非常用,用于保证事务的持久性,这个需要和数据库引擎产生的日志redolog一起使用,这个redolog后面再说。

binlog_row_image 这个参数是在基于行复制的情况下必要的参数,用于控制行镜像(row images)是如何写入到二进制日志(binlog)中,包含FULL,MINIMAL和 NOBLOB。
FULL模式下会记录更改前后的值,MINMAL只记录行数据的最小部分默认情况下不知道是不是这个值,默认情况下我测试出来没有找打update具体的值,只看到有个操作。
NOBLOB类似语句FULL模式,但是BLOD和TEXT这种字段可能不记录,在没有BLOD和TEXT的情况下和FULL没有区别,
默认情况再不写binlog_row_image这个参数的情况下,日志是下面这中:

BEGIN
/*!*/;
# at 295
#241010 15:53:14 server id 1  end_log_pos 354 CRC32 0x39c16fbf 	Table_map: `syn_test`.`teacher` mapped to number 427
# at 354
#241010 15:53:14 server id 1  end_log_pos 400 CRC32 0x107e5e6b 	Write_rows: table id 427 flags: STMT_END_F
# at 400
#241010 15:53:14 server id 1  end_log_pos 431 CRC32 0x157bc910 	Xid = 318
COMMIT/*!*/;
# at 431
#241010 15:55:06 server id 1  end_log_pos 496 CRC32 0xe0e36b12 	Anonymous_GTID	last_committed=1	sequence_number=2
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 496
#241010 15:55:06 server id 1  end_log_pos 572 CRC32 0x76eabfdf 	Query	thread_id=16	exec_time=0	error_code=0
SET TIMESTAMP=1728546906/*!*/;
BEGIN
/*!*/;
# at 572
#241010 15:55:06 server id 1  end_log_pos 631 CRC32 0x5e8da5ca 	Table_map: `syn_test`.`teacher` mapped to number 427
# at 631
#241010 15:55:06 server id 1  end_log_pos 689 CRC32 0x4eb2b41a 	Update_rows: table id 427 flags: STMT_END_F
# at 689
#241010 15:55:06 server id 1  end_log_pos 720 CRC32 0x5a8ed720 	Xid = 842
COMMIT/*!*/;
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*/

你会发现根本没有具体的相关信息,那就没办法恢复了。
回滚数据在少数的情况下我们可以手动的去还原,但是多的话,那就麻烦了,这就需要用到第三方工具了比如开源工具binlog2sql ,美团开源的闪回工具MyFlash等。

binlog日志的删除

手动删除:

rest master  删除全部的日志,删除之后,日志从00001开始记录
purge master logs to 'binlog.xxxxx'  删除xxx之前的日志
purge master logs before 'yyyy-mm-dd hh24:mi:ss' 删除yyyy-mm-dd hh24:mi:ss之前的日志

自动删除:

  • 设置过期时间:可以通过设置expire_logs_days参数来自动删除旧的binlog文件。这个参数定义了MySQL清除过期日志的时间,默认值为0,表示不自动删除。例如,设置expire_logs_days=7表示只保留最近7天的binlog文件
  • 设置binlog文件大小:通过max_binlog_size参数可以限制单个binlog文件的最大大小,当超过这个大小时,会自动创建新的binlog文件
  • 对于MySQL 8.0及以上版本,建议使用binlog_expire_logs_seconds参数来设置binlog的过期时间,单位是秒。例如,设置binlog_expire_logs_seconds=604800表示binlog文件在7天后过期

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

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

相关文章

文本语义检索系统的搭建过程,涵盖了召回、排序以及Milvus召回系统、短视频推荐等相关内容

大家好,我是微学AI,今天给大家介绍一下本文详细介绍了文本语义检索系统的搭建过程,涵盖了召回、排序以及Milvus召回系统的相关内容。通过使用PyTorch框架,我们提供了样例代码,以帮助读者更好地理解和实践。该系统具有广…

基于STM32的车牌识别系统

基于STM32的车牌识别系统硬件设计 在智能交通系统中,车牌识别技术扮演着至关重要的角色。它不仅用于道路交通监控,还广泛应用于小区和停车场管理、收费站管理系统、车流统计以及移动车载系统等领域。本文将详细介绍基于STM32单片机的车牌识别系统的硬件…

Vue3 + TypeScript + Vite + Echarts

Vue3 TypeScript Vite Echarts 1、创建工程 npm create vitelatestcd echarts npm install npm run dev2、安装项目依赖模块 npm install types/node --save-devnpm install vue-router4npm install animate.css --save npm install gsap --savenpm install fetch --save …

2024年源代码加密软件推荐,十款超好用的源代码加密软件推荐

在当今数字化时代,源代码的安全性对于企业和开发者来说至关重要。无论是为了保护知识产权,还是为了防止恶意攻击,选择一款可靠的源代码加密软件都是必不可少的。本文将为您推荐2024年十款超好用的源代码加密软件,帮助您在保护代码…

10款超好用的电脑加密软件推荐|2024年常用电脑加密软件排行榜

随着数字化办公的普及,企业的数据安全面临前所未有的挑战。文件的泄露、窃取和丢失不仅会影响企业的商业利益,还可能导致客户隐私泄露,进而影响企业声誉。因此,选择一款合适的加密软件来保护公司机密文件变得尤为重要。2024年&…

AI产品经理怎么准备面试啊?

最近有些小伙伴,想要求职AI领域的产品经理,特别是AIGC的产品经理,但是不知道面试官会问哪些问题,也就不知道如何开始准备?该准备哪些东西?要准备到什么程度?最终导致迟迟不敢开始。 下面总共5家…

多级代理与提权维权

目录 代理构建FRP介绍下载配置⽂件: sock5代理Venom介绍下载配置 icmpsh介绍下载配置 pingtunnel介绍下载配置 EarthWorm介绍下载使用 权限提升win权限提升常⻅利⽤⼯具 Linux权限提升SUID提权 权限维持win权限维持系统服务后⻔⾃启动⽬录注册表后⻔其他类似隐藏⽤户…

西安国际数字影像产业园:文化创意产业的加速器

西安国际数字影像产业园作为文化创意产业的加速器,正为西安乃至全国的文化创意产业发展注入强大动力: 优越的基础条件:西安作为历史文化名城,文化底蕴深厚,为数字影像产业提供了丰富的创作素材和灵感源泉。西安国际数…

magic-html : 通用HTML数据提取器!DocAI:从非结构化文档中提取结构化数据!强大、快速、开源的微信机器人底层框架:wcf.js!

magic-html : 通用HTML数据提取器!DocAI:从非结构化文档中提取结构化数据!强大、快速、开源的微信机器人底层框架:wcf.js! magic-html : 通用HTML数据提取器 magic-html提供了一套工具,能够轻松地从HTML中…

闪电麦昆 语音控制齿轮行进轨迹,ESP32搭配语音控制板,串口通信,附视频演示地址

演示地址 https://www.bilibili.com/video/BV1cW421d79L/?vd_sourceb8515e53f6d4c564b541d98dcc9df990 语音控制板的配置 web展示页面 esp32 程序 #include <ESP8266WiFi.h> #include <ESP8266WebServer.h> #include <LittleFS.h> #include <WebSo…

最全方案解决Android Studio中使用lombok插件错误: 找不到符号的问题

直接原因 先直接说原因&#xff0c;小部分是因为配置错误导致的&#xff0c;注意查看下面的步骤即可&#xff0c;另一大部分是因为Java和Kotlin混编的问题&#xff0c;lombok和kapt冲突&#xff0c;其实你用了kotlin基本不需要用lombok&#xff0c;多此一举&#xff01;所以可…

最新版 Global Mapper 26 发布

我们在《工作中常用的软件&#xff0c;可直接下载0.3m卫星影像、DEM和土地覆盖数据》一文中&#xff0c;为你分享了GlobalMapper25版本。 现在&#xff0c;该神器的最新版GlobalMapper26已发布&#xff0c;如果这两个版本的软件你都需要&#xff0c;请在文末查看它们的下载方法…

Spring源码分析:bean加载流程

背景 在Spring中&#xff0c;Bean的加载和管理是其核心功能之一&#xff0c;包括配置元数据解析、Bean定义注册、实例化、属性填充、初始化、后置处理器处理、完成创建和销毁等步骤。 源码入口 AbstractBeanFactory#doGetBean 具体源码流程如下&#xff1a; bean加载流程&#…

怎么利用商品详情API接口实现数据获取与应用?

在当今数字化的商业时代&#xff0c;高效获取和利用商品数据对于企业和开发者来说至关重要。商品详情 API 接口为我们提供了一种便捷的方式来获取丰富的商品信息&#xff0c;从而实现各种有价值的应用。本文将深入探讨如何利用商品详情 API 接口实现数据获取与应用。 一、商品…

信号转导的风暴中心:ERK1/2

前 言 ERK1/2是RAF-MEK-ERK信号通路的关键组成部分&#xff0c;在Thr202、Tyr204位点被磷酸化从而激活&#xff0c;进而激活多种与细胞增殖、分化、迁移和血管生成相关的底物&#xff08;超过160种&#xff09;。因此ERK1/2的(Thr202, Tyr204)/(Thr185, Tyr187)磷酸化是ERK激…

从SQL Server过渡到PostgreSQL:理解模式的差异

前言 随着越来越多的企业转向开源技术&#xff0c;商业数据库管理员和开发者也逐渐面临向PostgreSQL迁移的需求。 虽然SQL Server和PostgreSQL共享许多数据库管理系统&#xff08;RDBMS&#xff09;的基本概念&#xff0c;但它们在处理某些结构上的差异可能会让人感到困惑&…

利用Spring Boot实现医疗病历的B2B平台集成

第5章 系统实现 5.1 管理员角色 5.1.1 医院管理 管理员可以在医院管理界面对医院信息进行添加&#xff0c;修改&#xff0c;删除&#xff0c;查询操作。医院管理页面的运行结果如图5-1所示&#xff1a; 图5-1医院管理界面 5.1.2 医院注册 管理员可以在医院注册界面对医院信息…

【LeetCode】动态规划—1312. 让字符串成为回文串的最少插入次数(附完整Python/C++代码)

动态规划—1312. 让字符串成为回文串的最少插入次数 题目描述前言基本思路1. 问题定义目标&#xff1a;举例&#xff1a; 2. 理解问题和递推关系动态规划思路&#xff1a; 3. 解决方法动态规划方法伪代码&#xff1a; 4. 进一步优化5. 小总结 Python代码Python代码解释&#xf…

基于Spring Boot的医疗病历B2B平台开发策略

第4章 系统设计 4.1 系统总体设计 系统不仅要求功能完善&#xff0c;而且还要界面友好&#xff0c;因此&#xff0c;对于一个成功的系统设计&#xff0c;功能模块的设计是关键。由于本系统可执行的是一般性质的学习信息管理工作&#xff0c;本系统具有一般适用性&#xff0c;其…

Java项目:148 基于springboot的校友管理系统

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 校友管理系统项目说明 ​ 本系统是一个学校与毕业生的交流平台。方便校友们了解母校的最新动态&#xff0c;同学的情况&#xff1b;同时学校也可以通过平台了解…