MySql之binlog与数据恢复(Binlog and Data Recovery in MySQL)

news2025/4/5 21:43:44

MySql之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-updatesexpire_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 = 318COMMIT/*!*/;# at 431#241010 15:55:06 server id 1  end_log_pos 496 CRC32 0xe0e36b12   Anonymous_GTID  last_committed=1  sequence_number=2SET @@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=0SET 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 = 842COMMIT/*!*/;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/2326514.html

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

相关文章

JDK1.8和Maven、Git安装教程自用成功

一.JDK安装 JRK:java运行环境 JDK:java语言的软件开发工具包;JDK里包含了java开发工具,也包含了JRE 1.下载JDK1.8并安装 Java Downloads | Oracle 进入官网后往下翻,找到JAVA8; 然后选择对应的版本&am…

数据采集助力AI大模型训练

引言使用抓取浏览器采集ebay商品页面选购亮数据AI训练数据总结 引言 AI技术在今天已经是我们工作生活中不可或缺的工具,很多小伙伴也在致力于训练AI模型。高质量的数据是训练强大AI模型的核心驱动力,无论是自然语言处理、计算机视觉还是推荐系统&#xf…

Rust 为什么不适合开发 GUI

前言 在当今科技蓬勃发展的时代,Rust 编程语言正崭露头角,逐步为世界上诸多重要基础设施提供动力支持。从存储海量信息到应用于 Linux 内核,Rust 展现出强大的实力。然而,当涉及构建 GUI(图形用户界面)时&…

消息队列篇--通信协议篇--理解HTTP、TLS和TCP如何协同工作

前面介绍了HTTP/HTTPS,SSL/TLS以及TCP和UDP,这些在网络传输上分别有着自己的作用。为了深入理解下这些概念,本篇重点介绍下HTTP、TLS 和 TCP是如何协同工作的?我们从底层到上层逐步分析每个协议的作用及其相互关系。这些协议共同协…

代码随想录算法训练营第三十四天 | 62.不同路径 63.不同路径II 343.整数拆分

62.不同路径 题目链接:62. 不同路径 - 力扣(LeetCode) 文章讲解:代码随想录 视频讲解:动态规划中如何初始化很重要!| LeetCode:62.不同路径_哔哩哔哩_bilibili 思路:机器人位于一…

2023第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(真题题解)(C++/Java题解)

记录刷题的过程、感悟、题解。 希望能帮到,那些与我一同前行的,来自远方的朋友😉 大纲: 1、日期统计-(解析)-暴力dfs(😉蓝桥专属 2、01串的熵-(解析)-不要chu…

RK3568-适配ov5647摄像头

硬件原理图 CAM_GPIO是摄像头电源控制引脚,连接芯片GPIO4_C2 CAM_LEDON是摄像头led灯控制引脚,连接芯片GPIO4_C3编写设备树 / {ext_cam_clk: external-camera-clock {compatible = "fixed-clock";clock-frequency = <25000000>;clock-output-names = "…

实战篇Redis

黑马程序员的Redis的笔记&#xff08;后面补一下图片&#xff09; 【黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目】https://www.bilibili.com/video/BV1cr4y1671t?p72&vd_source001f1c33a895eb5ed820b9a4…

沉浸式体验测评|AI Ville:我在Web3小镇“生活”了一周

最近&#xff0c;我在朋友的推荐下&#xff0c;体验了 aivillebot 的项目。起初&#xff0c;我只是抱着试试看的心态&#xff0c;心想这不就是个 Web3 版的《星露谷物语》吗&#xff1f; 但是一周下来&#xff0c;我发现这个虚拟小镇也没那么简单——里面的居民不是目前端游或链…

TTL 值 | 在 IP 协议、ping 工具及 DNS 解析中的作用

注&#xff1a;本文为 “TTL” 相关文章合辑。 未整理去重。 如有内容异常&#xff0c;请看原文。 TTL 值的意义 2007-10-18 11:33:17 TTL 是 IP 协议包中的一个值&#xff0c;用于标识网络路由器是否应丢弃在网络中停留时间过长的数据包。数据包可能因多种原因在一定时间内…

人工智能之数学基础:初等反射阵

本文重点 在线性代数中,初等反射阵(Householder矩阵)作为一类特殊的正交矩阵,在矩阵变换、特征值计算及几何变换等领域具有广泛应用。其简洁的构造方式和丰富的数学性质,使其成为数值分析和几何处理中的重要工具。 什么是初等反射阵(豪斯霍尔德变换) I为单位矩阵,wwT…

4.1 代码随想录第三十二天打卡

准备:完全背包理论基础-二维DP数组 1.完全背包就是同一物品可以往里多次装 2.这里先遍历背包 或物品都可以 3.dp[i][j] 表示从下标为[0-i]的物品&#xff0c;每个物品可以取无限次&#xff0c;放进容量为j的背包&#xff0c;价值总和最大是多少 518.零钱兑换II (1)题目描述…

SQL Server:数据库镜像端点检查

目录标题 **1. 端点的作用****2. 检查的主要内容****&#xff08;1&#xff09;端点是否存在****&#xff08;2&#xff09;端点状态****&#xff08;3&#xff09;协议与端口****&#xff08;4&#xff09;权限配置** **3. 操作步骤&#xff08;示例&#xff09;****&#xff…

【区块链安全 | 第九篇】基于Heimdall设计的智能合约反编译项目

文章目录 背景目的安装1、安装 Rust2、克隆 heimdall-dec3、编译 heimdall-dec4、运行 heimdall-dec 使用说明1、访问 Web 界面2、输入合约信息3、查看反编译结果 实战演示1、解析普通合约2、解析代理合约 背景 在区块链安全研究中&#xff0c;智能合约的审计和分析至关重要。…

批量删除 txt/html/json/xml/csv 等文本文件空白行

我们常常会遇到需要删除 txt 文本文件中空白行的情况&#xff0c;如果文本文件较大&#xff0c;行数较多的时候&#xff0c;有些空白行不容易人工识别&#xff0c;这使得删除文本文件空白行变得非常繁琐&#xff0c;我们需要先找到空白的行&#xff0c;然后才能进行删除操作。尤…

ES5内容之String接口

注意&#xff1a;slice、substr、substring 都接受一个或两个参数&#xff0c;第一个参数指定字符串的开始位置&#xff0c;第二个参数表示子字符串到哪里结束&#xff0c;slice 和 substring 的第二个参数指定的是子字符串的最后一个字符后面的位置&#xff0c;substr 第二个参…

Mysql之事务(下)

&#x1f3dd;️专栏&#xff1a;Mysql_猫咪-9527的博客-CSDN博客 &#x1f305;主页&#xff1a;猫咪-9527-CSDN博客 “欲穷千里目&#xff0c;更上一层楼。会当凌绝顶&#xff0c;一览众山小。” 目录 5. 事务的隔离级别与并发控制 5.1事务的隔离级别 5.2查看与设置事务的…

某地老旧房屋自动化监测项目

1. 项目简介 自从上个世纪90年代以来&#xff0c;我国经济发展迅猛&#xff0c;在此期间大量建筑平地而起&#xff0c;并且多为砖混结构的住房&#xff0c;使用寿命通常约为30-50年&#xff0c;钢筋混凝土结构&#xff0c;钢结构等高层建筑&#xff0c;这些建筑在一般情况下的…

【QT】QT的多界面跳转以及界面之间传递参数

QT的多界面跳转以及界面之间传递参数 一、在QT工程中添加新的界面二、多界面跳转的两种情况1、A界面跳到B界面&#xff0c;不需要返回2、A界面跳到B界面&#xff0c;需要返回1&#xff09;使用this指针传递将当前界面地址传递给下一界面2&#xff09;使用parentWidget函数获取上…

【学习笔记】计算机网络(五)

第5章 运输层 文章目录 第5章 运输层5.1 运输层协议概述5.1.1 进程之间的通信5.1.2 运输层的两个主要协议5.1.3 运输层的端口 5.2 用户数据报协议 UDP5.2.1 UDP 概述5.2.2 UDP的首部格式 5.3 传输控制协议 TCP 概述5.3.1 TCP 最主要的特点5.3.2 TCP 的连接 5.4 可靠传输的工作原…