MySQL 开启配置binlog以及通过binlog恢复数据

news2024/11/17 19:45:02

目录

    • 一、binlog日志基本概念
    • 二、开启binlog日志记录
      • 2.1、查看binlog日志记录启用状态
      • 2.2、开启配置binlog日志
    • 三、制作测试数据(可以先不执行,这里是为后续数据恢复做准备,先看数据恢复流程)
    • 四、使用binlog日志恢复数据
      • 4.1、前置准备
      • 4.2、恢复全部数据
      • 4.3、通过指定位置区间恢复

一、binlog日志基本概念

   binlog是MySQL sever层维护的一种二进制日志,binlog是记录所有数据库表结构变更(例如CREATE、ALTER TABLE、DROP等)以及表数据修改(INSERT、UPDATE、DELETE、TRUNCATE等)的二进制日志。不会记录SELECT和SHOW这类操作,因为这类操作对数据本身并没有修改。

作用主要有:

  • 主从复制:在MySQL的Master节点开启binlog,Master把它的二进制日志传递给slaves并回放来达到master-slave数据一致的目的。
  • 数据恢复:通过mysqlbinlog工具来恢复数据

二、开启binlog日志记录

2.1、查看binlog日志记录启用状态

MySQL安装完成后,MySQL5.7版本binlog默认是不开启的,MySQL8默认开启binlog,登录MySQL后,可以通过SHOW VARIABLES LIKE '%log_bin%';命令查看是否开启binlog。

# 登录 mysql
mysql -h127.0.0.1 -P3306 -uroot -p123456
# 查看是否开启binlog
mysql> SHOW VARIABLES LIKE '%log_bin%';

在这里插入图片描述

log_bin 的Value如果为ON代表开启,如果为OFF代表关闭,我这里使用的是MySQL8.0默认是开启的,如果没有开启可以通过下面方式开启:

2.2、开启配置binlog日志

修改MySQL配置文件,linux中配置文件为my.conf,window下为my.ini,下面以centos为例演示:

  • 编辑配置文件
# 在centos中mysql的配置文件一般都在/etc/mysql目录下,如果不在可以通过 find / -name "my.cnf" 查找
vi /etc/mysql/my.cnf
  • 添加配置
# 服务ID
server-id=1
# binlog 配置 只要配置了log_bin地址 就会开启
log_bin = /var/lib/mysql/mysql_bin
# 日志存储天数 默认0 永久保存
# 如果数据库会定期归档,建议设置一个存储时间不需要一直存储binlog日志,理论上只需要存储归档之后的日志
expire_logs_days = 30
# binlog最大值
max_binlog_size = 1024M
# 规定binlog的格式,binlog有三种格式statement、row、mixad,默认使用statement,建议使用row格式
binlog_format = ROW
# 在提交n次事务后,进行binlog的落盘,0为不进行强行的刷新操作,而是由文件系统控制刷新日志文件,如果是在线交易和账有关的数据建议设置成1,如果是其他数据可以保持为0即可
sync_binlog = 1
  • 重启MySQL服务使配置生效
systemctl restart mysqld
  • 登录MySQL查看配置是否生效
mysql> SHOW VARIABLES LIKE '%log_bin%';

在这里插入图片描述
log_bin为ON代表MySQL已经开启binlog日志记录
log_bin_basename配置了binlog的文件路径及文件前缀名
log_bin_index配置了binlog索引文件的路径

  • 查看日志列表
mysql> SHOW MASTER LOGS;

在这里插入图片描述

  • 根据log_bin_basename的路径查看binlog具体文件
ls -l /var/lib/mysql/mysql_bin.*

在这里插入图片描述

三、制作测试数据(可以先不执行,这里是为后续数据恢复做准备,先看数据恢复流程)

登录MySQL后创建库、创建表、在插入一些数据

  • 登录数据库
mysql -h127.0.0.1 -P3306 -uroot -p123456
  • 创建库
CREATE DATABASE binlog_test_db;
  • 切换到自己创建的数据库
USE binlog_test_db;
  • 创建表
DROP TABLE IF EXISTS `binlog_test_table`;
CREATE TABLE `binlog_test_table`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `nick_name` varchar(255) DEFAULT NULL,
  `create_time` datetime(0) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB ;
  • 插入数据
INSERT INTO `binlog_test_table` VALUES (1, 'Alia', NOW());
INSERT INTO `binlog_test_table` VALUES (2, 'Kerwin', NOW());
INSERT INTO `binlog_test_table` VALUES (3, 'Hilaria', NOW());
INSERT INTO `binlog_test_table` VALUES (4, 'Coco', NOW());
  • 查看创建的库
mysql> SHOW DATABASES;

在这里插入图片描述

  • 查看创建的表和数据
# 切换到binlog_test_db库
mysql> USE binlog_test_db;
# 查看库中所有的表
mysql> SHOW TABLES;
# 查看表中的数据
mysql> SELECT * FROM binlog_test_table;

在这里插入图片描述

四、使用binlog日志恢复数据

当数据库发生变化时,binlog会记录数据库中的所有变化,需要恢复的时候可以通过mysqlbinlog工具,根据binlog中的开始位置和结束位置或者开始时间和结束时间还原本部分操作,结束位置或者结束时间一般是数据被破坏或删除之前的位置。

4.1、前置准备

自己测试的话先要确保有一个干净的环境,避免出现一些奇怪问题导致浪费时间,这里先做一些前置准备,也就是说自己的binlog文件中最好只有当前测试的数据记录,避免出现干扰。

  • 1、登录MySQL执行下面命令刷新log日志,自此刻开始产生一个新编号的binlog日志文件

    # 注:每当mysqld服务重启时,会自动执行此命令,刷新binlog日志;在mysqldump备份数据时加 -F 选项也会刷新binlog日志
    mysql> FLUSH LOGS;
    
  • 2、查看当前的binlog文件

    ls -l /var/lib/mysql/mysql_bin.*
    

    在这里插入图片描述
    我这里在刷新binlog之前是mysql_bin.000003,刷新后新生成了一个mysql_bin.000004,后续日志都会记录在这个新的文件中。

4.2、恢复全部数据

在恢复数据前首先要制作好测试数据,恢复全部数据就是将一个完整的binlog都执行,比如我们在制作测试数据时创建库、创建表、插入数据等操作都会记录在binlog中,使用这个binlog恢复数据等于将我们上面的操作又执行了一次。

数据恢复演示流程:

  • 1、执行4.1前置准备中的操作,生成一个新的binlog文件,假设我这里生成新的文件叫做mysql_bin.000004,后续数据的操作日志都会记录在这个日志文件中。

  • 2、准备数据,直接执行本文第三点制作测试数据中的SQL即可。

  • 3、将mysql_bin.000004这个binlog日志归档,因为我们需要通过mysql_bin.000004这个日志恢复全部数据,所以要在删除数据库之前归档,如果删除数据库语句也被记录在mysql_bin.000004中,那么执行完mysql_bin.000004库又会被删除了。

    # 登录数据库执行刷新log日志,自此刻开始产生一个新编号的binlog日志文件
    mysql> FLUSH LOGS;
    

    在这里插入图片描述

  • 4、删除数据库

    mysql> DROP DATABASE binlog_test_db;
    

    在这里插入图片描述
    这里可以看到binlog_test_db库已经被删除了。

  • 5、通过mysqlbinlog执行恢复全部

    # mysqlbinlog是MySQL自带的一个工具,一般在安装MySQL时mysqlbinlog也会被放入可执行目录下,可以直接执行
    # 如果不能直接使用mysqlbinlog命令,可以通过 find / -name "mysqlbinlog" 查找一下这个工具在什么位置
    # 然后指定全路径执行即可:如 /usr/bin/mysqlbinlog --no-defaults ...
    mysqlbinlog --no-defaults /var/lib/mysql/mysql_bin.000004 | mysql -h127.0.0.1 -P3306 -uroot -p123456
    
  • 6、查看数据恢复情况

    # 查看全部库
    mysql> SHOW DATABASES;
    # 切换到binlog_test_db库
    mysql> USE binlog_test_db;
    # 查看库中所有的表
    mysql> SHOW TABLES;
    # 查看表中的数据
    mysql> SELECT * FROM binlog_test_table;
    

    在这里插入图片描述

到这里可以看到数据已经全部恢复,但是还存在几个问题:

  • 1、如果存在多个binlog文件如何恢复全部数据
    • 存在多个binlog文件依次恢复即可,必须按照日志序号来恢复,假设有三个日志文件序号是000001、000002、000003,那么第一个恢复的一定是000001,第二个恢复000002,最后恢复000003。
  • 2、如果我们在同一个日志文件中也进行了删库操作怎么恢复
    • 全部恢复原理就是将之前做过的操作全做一次,有删库操作自然也会在操作一次,这样肯定是违背我们的需求的,解决方法其实就是不去执行某个节点后的操作就行,比如删库操作是在节点5执行,那么我们只恢复到节点4即可,在后续会详细说明。

4.3、通过指定位置区间恢复

和恢复全部数据不同的是可以指定一个位置区间恢复数据,这样如果删除库操作和数据插入操作都在同一个日志文件中也可以进行数据恢复,而且很灵活。

数据恢复演示流程:

  • 1、执行4.1前置准备中的操作,生成一个新的binlog文件,假设我这里生成新的文件叫做mysql_bin.000006,后续数据的操作日志都会记录在这个日志文件中。

  • 2、准备数据,直接执行本文第三点制作测试数据中的SQL即可。

  • 3、删除数据库

    mysql> DROP DATABASE binlog_test_db;
    

    在这里插入图片描述
    这里可以看到binlog_test_db库已经被删除了。

  • 4、将mysql_bin.000006这个binlog日志归档,为了防止恢复数据后影响最新业务,需要执行flush logs,产生一个新的binlog文件,此时旧的binlog文件不会再有写入。

    # 登录数据库执行刷新log日志,自此刻开始产生一个新编号的binlog日志文件
    mysql> FLUSH LOGS;
    

    在这里插入图片描述

  • 5、通过mysqlbinlog将binlog转为sql,以方便查询具体位置

    mysqlbinlog --set-charset=utf-8 /var/lib/mysql/mysql_bin.000006>binlog_000006.sql
    
  • 6、查看生成的binlog_000006.sql,确定需要恢复的起始位置结束位置还有起始时间和结束时间

    # 打开 binlog_000006.sql 文件,搜索自己的创建库语句确认起始位置和时间,在搜索删除库语句确认结束位置和时间
    vi binlog_000006.sql
    

    确认开始位置为232,开始时间为 23年9月27日 17:17:23
    在这里插入图片描述
    确认结束位置为2220,结束时间为 23年9月27日 17:18:36
    在这里插入图片描述

  • 7、通过mysqlbinlog执行恢复操作

    # 通过位置区间恢复 
    mysqlbinlog --no-defaults /var/lib/mysql/mysql_bin.000006 --start-position=232 --stop-position=2220 | mysql -h127.0.0.1 -P3306 -uroot -p123456
    

    /var/lib/mysql/mysql_bin.000006 : 要操作binlog文件
    –start-position=232 :数据恢复的起始位置
    –stop-position=2220 :数据恢复的结束位置
    mysql -h127.0.0.1 -P3306 -uroot -p123456 : 数据恢复需要登录数据库

    在这里插入图片描述

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

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

相关文章

解决内网拉取企微会话存档代理问题的一种办法

问题:客户的服务都是内网的,不能直接访问外网;访问外网的话需要走kong网关才能出去。 会话存档官网说可以使用socket5、http方式拉取会话存档;我这边尝试了直接使用kong网关的ip和端口配置进去,是访问不了的 我后面就…

lazada、shopee卖家自养号测评的优势及环境搭建核心要点!

lazada、shopee卖家们都知道,流量对于店铺转化率具有非常重要的作用,要真正提升销售业绩和品牌知名度,仅仅依赖lazada、shopee内部的流量是不够的。这也就说明越来越多的卖家需要测评,用测评来提升产品的销量,留下好评…

MYSQL日志和事务原理

1)重做日志:在一个事务中会涉及到多个DML操作,修改的是在内存层面数据页中的数据,还没有及时的将修改之后的数据更新到磁盘中,真正的将更新后的数据写回到磁盘的时候才满足持久性,只是更新内存是不满足持久性的,如果只…

lv5 嵌入式开发-8 内存映射

目录 1 内存映射基本使用 1.1 内存映射概念 1.2 内存映射的使用 2 共享内存(古老的 System V IPC) 2.1 基本概念 2.2 共享内存使用步骤 2.3 共享内存使用 掌握:内存映射概念、内存映射使用、内存映射注意事项、了解SYSTEM V 共享内存概…

OV2640图像出现细小条纹问题

说明:条纹是随机生成的,有时候几根线,有时候10多根线 怀疑点: 1-走线,看网上说所有的时钟线和同步线不要交叉,不要太长没有验证 2-电源,1.2V和2.8的电源 刚开始以为是自己电路问题&#xff0c…

栈(Stack)和队列(Queue)

栈(Stack)和队列(Queue)都是常见的数据结构,用于存储和操作一组元素。 栈是一种后进先出(Last-In-First-Out,LIFO)的数据结构,类似于把元素堆在一起形成的一堆物体&…

PTA程序辅助实验平台——2023年软件设计综合实践_3(分支与循环)

第一题:7-1 印第安男孩 - C/C 分支与循环 朵拉编程的时候也想顺便练习英语。她编程从键盘读入一个整数n,如果n值为0或者1,向屏幕输出“0 indian boy.”或“1 indian boy.”;如果n大于1,比如9,则输出“9 in…

Ctfshow web入门 XSS篇 web316-web333 详细题解 全

CTFshow XSS web316 是反射型 XSS 法一&#xff1a; 利用现成平台 法二&#xff1a; 自己搭服务器 先在服务器上面放一个接受Cookie的文件。 文件内容&#xff1a; <?php$cookie $_GET[cookie];$time date(Y-m-d h:i:s, time());$log fopen("cookie.txt"…

SSM - Springboot - MyBatis-Plus 全栈体系(十四)

第三章 MyBatis 二、MyBatis 基本使用 1. 向 SQL 语句传参 1.1 mybatis 日志输出配置 mybatis配置文件设计标签和顶层结构如下&#xff1a; configuration&#xff08;配置&#xff09; properties&#xff08;属性&#xff09;settings&#xff08;设置&#xff09;typeAl…

7、SpringBoot_高级配置

一、配置高级 1.临时属性设置 1.1引出问题 如果目标电脑上8080端口已经使用&#xff0c;再次使用该端口会出现端口占用问题 解决方式 重新更换配置文件修改端口打包通过临时属性配置新端口更换配置文件 1.2添加临时属性配置 通过临时属性修改8080端口 java -jar 项目.jar…

zemax目镜调焦演示

目镜的焦距应当是可变的&#xff0c;就像我们使用显微镜时&#xff0c;可以通过旋转调节旋钮&#xff0c;使得图像变得清晰&#xff0c;目镜的焦距也可以调整&#xff0c;使得要被观察的像出现在合适的位置。 这样&#xff0c;不同的人都可以使用同一台仪器&#xff0c;不管近…

Spring5应用之AOP额外功能详解

作者简介&#xff1a;☕️大家好&#xff0c;我是Aomsir&#xff0c;一个爱折腾的开发者&#xff01; 个人主页&#xff1a;Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏&#xff1a;Spring5应用专栏_Aomsir的博客-CSDN博客 文章目录 前言MethodBefore…

Doris数据库FE——启动流程源码详细解析

Doris中FE主要负责接收和返回客户端请求、元数据以及集群管理、查询计划生成等工作。代码路径&#xff1a;doris/fe/fe-core/src/main/java/org/apache/doris/DorisFE.java 环境检查 在启动FE的时候&#xff0c;主要做环境检查。检查一些启动时必要的环境变量以及初始化配置…

社区团购新零售搭伙拼团小程序源码(前后端)

社区团购新零售搭伙拼团小程序源码是一款非常实用的电商小程序&#xff0c;它包含了前后端文件&#xff0c; 可以快速地进行部署和使用。该小程序是基于微信小程序开发的&#xff0c;支持社区团购、新零售、搭伙拼团等多种功能。 该小程序具有良好的用户体验&#xff0c;包括…

范数Norm-衡量向量大小的方法

性质 非负性: 范数的值总是非负的,且当且仅当向量全为零时,范数的值为零。 齐次性: 对于任意实数α,有 三角不等式: 对于任意向量x和y,有 常见范数 L1: 向量所有元素绝对值的和,权重稀疏 L2:欧几里得范数,权重平滑 无穷范数:表示向量中最大的元素 为什么使用范…

英飞凌 Tricore 架构中断系统详解

本文以TC3系列MCU为例&#xff0c;先来了解中断源是如何产生的&#xff0c;再看一下CPU是如何处理中断源的。 AURIX TC3XX的中断路由模块 Interrupt Router (IR) 在TC3中&#xff0c;中断既可以被CPU处理&#xff0c;也可以被DMA处理&#xff0c;所以手册中不再把中断称为中断…

vue3硅谷甄选02 | 封装svg组件 - axios二次封装

文章目录 vue3硅谷甄选02功能1&#xff1a;封装svg组件SVG图标配置svg封装成组件svg组件注册为全局组件自定义统一注册全局组件的插件自定义插件的原理插件的使用 app.use(plugin, [options]) 功能2&#xff1a;axios二次封装使用mock插件构造数据axios二次封装api接口统一管理…

【大数据开发技术】实验01-Hadoop安装部署

文章目录 Hadoop安装部署一、实验目标二、实验要求三、实验内容四、实验步骤附&#xff1a;系列文章 Hadoop安装部署 虚拟机数量&#xff1a;3 系统版本&#xff1a;Centos 7.5 Hadoop版本&#xff1a; Apache Hadoop 2.7.3 主节点信息&#xff1a; 操作系统&#xff1a;Cen…

Tomcat 与 JDK 对应版本关系

对应关系 Tomcat版本 jdk版本11.0.x JDK 21及以后10.1.x JDK11及以后10.0.xJDK1.8及以后9.0.x JDK1.8及以后8.5.xJDK1.7及以后8.0.x JDK1.7及以后 查看对应关系方法&#xff1a; 登陆Tomcat官网&#xff1a;Apache Tomcat - Welcome! 结果&#xff1a;

Arthas:Java调试利器使用

Arthas:Java调试利器使用 1. Arthas是什么2. Arthas可以解决什么问题Arthas启动方式1. jar启动2. 在线安装 远程连接命令使用- 退出threadclassloaderscsm watchtrace修改日志级别 1. Arthas是什么 Arthas(阿尔萨斯)是阿里开源的一个Java在线分析诊断工具. 2. Arthas可以解决…