首页 > 数据库 >MySQL使用binlog恢复数据

MySQL使用binlog恢复数据

时间:2023-07-30 18:35:20浏览次数:32  
标签:binlog Binlog 数据恢复 恢复 MySQL mysql 数据

1. 什么是Binlog

MySQL的二进制日志(Binlog)是一种事务日志,用于记录对数据库的更改操作。
Binlog主要用于MySQL复制和恢复:

  • 复制: 从库通过拉取主库的binlog实现主从数据一致
  • 恢复: 通过重放binlog恢复数据丢失或误操作情况

1.1. Binlog的工作原理

在MySQL中,每个事务都会在提交后生成相应的Binlog记录。
MySQL服务器会为每个客户端连接创建一个线程,称为Binlog Dump线程,
负责将Binlog的内容传送给从服务器,用于数据复制。
Binlog可以在服务器的文件系统中持久化存储,保证了数据的持久性。

1.2. Binlog的格式

MySQL支持多种Binlog格式,包括Statement(语句)、Row(行)和Mixed(混合)三种。不同格式在记录更改时的粒度和复制方式上有所不同:

  • Statement格式:记录SQL语句的执行内容,简单高效,但可能存在非确定性问题,如触发器的执行结果与主服务器不一致。
  • Row格式:记录每一行数据的变更,提供了更精确的复制,但产生的日志量较大。
  • Mixed格式:结合了StatementRow格式的优点,MySQL根据具体的情况来选择合适的记录方式。

1.3 开启binlog

要查看是否开启了binlog,可以通过以下方法:

  • 在MySQL中查询变量:SHOW VARIABLES LIKE 'log_bin';
  • 检查配置文件my.cnf中是否配置了log-bin参数
  • 查看数据目录是否存在日志文件,默认名称类似mysql-bin.000001

如果未开启,可以配置my.cnf来开启binlog:

  • my.cnf配置文件中[mysqld]加入以下配置,然后重启MySQL:
log-bin = /var/lib/mysql/mysql-bin
binlog_format = mixed # 指定`statement` `row` `mixed`
server-id = 1   # 在集群中的唯一ID,如果只有一台服务器,可以随便配置

2. 使用Binlog恢复数据

Binlog不仅用于数据复制,还可以用于数据恢复。当数据库发生误操作、数据损坏或数据丢失时,可以通过Binlog来还原数据。

2.1 导出Binlog文件

在需要恢复数据的MySQL服务器上,首先需要导出Binlog文件。可以使用以下命令关闭当前的Binlog文件并生成一个新的Binlog文件:

mysql> FLUSH LOGS;

2.2 使用mysqlbinlog工具

接下来,使用mysqlbinlog工具来解析Binlog文件,并将其中的SQL语句导出到一个文本文件中,可以使用以下命令:

mysqlbinlog binlog.000001 > binlog.sql

2.3 恢复数据

将导出的SQL语句文件binlog.sql导入到目标数据库中,即可还原数据:

mysql -u username -p -h hostname dbname < binlog.sql

3. 高级数据恢复技巧

除了基本的Binlog数据恢复外,还可以通过Binlog实现一些高级的数据恢复技巧:

3.1 Point-in-Time Recovery(PITR)

使用Binlog中的时间戳信息,可以实现在特定时间点之前恢复数据库数据,称为PITR恢复。通过在导出Binlog时指定时间戳参数,可以选择将数据库恢复到历史某个时间点的状态。

mysqlbinlog --start-datetime  "2023-07-30 17:00:00" mysql-bin.000001 > /home/mysql_backup/binlog_raw.sql

3.2 数据库对象过滤

在解析Binlog时,可以使用mysqlbinlog工具提供的参数来选择只恢复某些数据库、表或者特定类型的SQL语句,从而实现更加精细化的数据恢复。

mysqlbinlog --database sync_test mysql-bin.000001 > /home/mysql_backup/binlog_raw.sql

4 总结

MySQL的Binlog是数据库的重要组成部分,它记录了数据库的更改操作,并为数据复制和数据恢复提供了有力支持。
通过了解Binlog的原理和使用技巧,我们可以更好地利用这一特性,保障数据库的稳健运行,并在必要时实现高级的数据恢复。然而,进行数据恢复时,请务必谨慎操作,以免造成不可逆的损失。

参考资料

标签:binlog,Binlog,数据恢复,恢复,MySQL,mysql,数据
From: https://www.cnblogs.com/lcc9527/p/17591804.html

相关文章

  • gs_probackup 备份恢复
    一、 初始化备份目录gs_probackupinit-B /mogdata/backup二、 添加备份实例gs_probackupadd-instance--instancecluster_26000-B/mogdata/backup-D/mogdata/cluster_26000-B备份目录-D数据库存储数据目录三、 连接数据库gs_probackupset-config--instance=clust......
  • 【es】elasticsearch生产数据备份和恢复方案
    https://huaweicloud.csdn.net/637f7ae4dacf622b8df859b1.html?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Eactivity-2-119985243-blog-126509989.235%5Ev38%5Epc_relevant_sort&depth_1-utm_source=distr......
  • 通过Redis+Mysql来自定义Spring-Statemachine的持久化
    我们在使用Spring状态机的时候,往往需要对于StateMachine持久化操作,但是官方为我们提供的基于redis的持久化并不是特别好,一方面是因为只存redis容易导致数据丢失,另一方面因为状态机的特性需要对应的StateMachine的数据永久有效,导致redis中的key永不过期。我现在希望实现将StateMac......
  • MySQL Group Replication 搭建
    目录参考资料环境准备说在前面单服务器部署1windows要求与限制1.1下载并解压mysql5.7.311.2创建数据库文件保存目录data1.3添加配置文件1.4初始化数据1.5依次启动3个实例1.6调整root用户名密码1.7创建复制使用的用户凭证1.8引导组复制1.9验证报错参考资料https......
  • mysql 简单进阶 ———— 多列索引[一]
    前文整理一下mysql的一些简单进阶技巧,来源于高性能mysql,但不是根据书的序列来的。正文有一个问题,那就是我们为什么要创建多列索引呢?这是要思考的一个问题。为什么创建多列索引,而不是创建多个单列索引。需要弄明白这个问题,那么就需要知道索引是如何工作的。为什么有索引这个......
  • Mysql数据库中数据量特别大,读取特别慢,已经做了索引,怎么优化
    当MySQL数据库中的数据量特别大,读取操作变得特别慢,即使已经添加了索引,仍然需要进一步优化。下面是一些建议以及示例代码来优化这种情况:使用合适的索引:确保为频繁查询的列添加了合适的索引。可以使用EXPLAIN语句来分析查询的执行计划,检查是否正确使用了索引。示例代码:sqlCopycodeE......
  • MySQL学习-DML(Data Manipulation Language)数据--select语句02
    表连接:分为内连接和外连接,常用内连接。当需要同时显示多个表中字段时,就可以用表连接。内连接:仅选出两张表中互相匹配的记录外连接:还会选出其他不匹配的记录外连接包含左连接和右连接左连接: ......
  • 6、Mysql创建用户以及授权
    文件夹就是数据库文件就是表数据行就是行 data下的mysql这个数据库里有张User表,里面保存了用户信息 showdatabases;查看所有数据库 usemysql;使用这个use数据库(进入这个文件夹) showtables;查看这个数据库下所有的表(文件)文件最后有个user,我们登陆mysql服务器......
  • PYTHON mysql形成分割文件
    importrandom,string,re,time,sys,hashlib,pymysql,requestsf=open("aa.txt","w")connect=pymysql.connect(user='root',password='123456',db='new',host......
  • 【MySQL技术专题】「实战开发系列」一同探索一下数据库的加解密函数开发实战指南之AES
    MySQL的加解密及压缩函数许多加密和压缩函数返回结果可能包含任意字节值的字符串。如果要存储这些结果,请使用具有VARBINARY或BLOB二进制字符串数据类型的列。这避免了删除尾随空格或转换字符集可能改变数据值的潜在问题,例如使用非二进制字符串数据类型(CHAR、VARCHAR、TEXT)时可能发......