当前位置: 首页 > news >正文

MySQL通过二进制日志恢复数据

以下是在 CentOS 7 系统、MySQL 5.7 环境中(二进制日志为 ROW 格式,字符集为 utf8mb4),完整的二进制日志恢复步骤:

一、环境准备与验证

1. 确认 MySQL 配置

登录 MySQL 终端:

mysql -u root -p

执行以下命令验证配置:

-- 确认二进制日志已启用
show variables like 'log_bin';  -- 应返回 ON-- 确认日志格式为 ROW
show variables like 'binlog_format';  -- 应返回 ROW-- 确认数据目录(后续使用)
show variables like 'datadir';  -- 通常为 /var/lib/mysql/
2. 配置文件检查(如需调整)
sudo vi /etc/my.cnf

确保包含以下配置:

[mysqld]
server-id = 1
log_bin = /var/lib/mysql/mysql-bin
binlog_format = ROW
expire_logs_days = 7

重启 MySQL 生效:

sudo systemctl restart mysqld

二、创建测试数据(utf8mb4 字符集)

在 MySQL 终端执行:

-- 创建数据库(指定 utf8mb4)
create database test_recover character set utf8mb4 collate utf8mb4_unicode_ci;use test_recover;-- 创建表(指定 utf8mb4)
create table employees (id int primary key auto_increment,name varchar(50) not null,department varchar(50),salary int
) engine=InnoDB default charset=utf8mb4 collate=utf8mb4_unicode_ci;-- 插入初始数据
insert into employees (name, department, salary) values
('张三', '技术部', 8000),
('李四', '市场部', 7500),
('王五', '技术部', 9000);-- 查看数据
select * from employees;

三、模拟数据故障

1. 记录故障前的二进制日志位置
show master status;

假设返回结果:

+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000004 |      854 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

记录关键信息

  • 日志文件:mysql-bin.000004
  • 起始位置:854(故障前的正常位置)
2. 执行错误操作(模拟故障)
-- 误更新技术部员工薪资
update employees set salary = 1000 where department = '技术部';-- 查看故障后的数据(薪资已错误修改)
select * from employees;

四、定位故障日志位置(使用 show binlog events)

在 MySQL 终端执行,查看日志事件:

-- 查看目标日志文件的事件详情
show binlog events in 'mysql-bin.000004';

返回结果示例(关键片段):

+------------------+------+-------------+-----------+-------------+---------------------------------------+
| Log_name         | Pos  | Event_type  | Server_id | End_log_pos | Info                                  |
+------------------+------+-------------+-----------+-------------+---------------------------------------+
| mysql-bin.000004 |  4    | Format_desc | 1         | 123         | Server ver: 5.7.44-log, Binlog ver: 4 |
| ...              | ...  | ...         | ...       | ...         | ...                                   |
| mysql-bin.000004 | 854  | Query       | 1         | 963         | BEGIN                                 |  -- 正常操作结束点
| mysql-bin.000004 | 963  | Table_map   | 1         | 1028        | table_id: 108 (test_recover.employees) |  -- 误操作相关事件
| mysql-bin.000004 | 1028 | Update_rows | 1         | 1230        | table_id: 108 flags: STMT_END_F       |  -- 误更新事件
| mysql-bin.000004 | 1230 | Xid         | 1         | 1261        | COMMIT /* xid=123 */                  |
+------------------+------+-------------+-----------+-------------+---------------------------------------+

确定恢复范围

  • 恢复起始位置:854(故障前记录的位置)
  • 恢复结束位置:963 - 1 = 962(误操作事件开始前的位置)

五、导出日志片段并恢复数据

1. 导出指定范围的二进制日志

在 CentOS 终端执行:

sudo mysqlbinlog \
--start-position=854 \
--stop-position=962 \
--base64-output=decode-rows -v \
--character-set-client=utf8mb4 \
/var/lib/mysql/mysql-bin.000004 > /tmp/recover.sql

参数说明:

  • --start/stop-position:指定恢复的日志范围
  • --base64-output=decode-rows -v:解析 ROW 格式日志为可读内容
  • --character-set-client=utf8mb4:确保中文正常显示
2. 执行恢复操作
# 导入恢复脚本到目标数据库
mysql -u root -p test_recover < /tmp/recover.sql

六、验证恢复结果

登录 MySQL 终端检查:

use test_recover;
select * from employees;

此时应看到技术部员工的薪资已恢复为原始值(张三 8000,王五 9000)。

关键注意事项

  1. 位置准确性show binlog eventsPos 是事件开始位置,恢复需截止到故障事件的前一个位置(Pos - 1)。
  2. 字符集一致性:全程保持 utf8mb4 字符集配置,避免中文乱码。
  3. ROW 格式适配:必须使用 --base64-output=decode-rows -v 参数才能正确解析行格式日志。
  4. 权限问题:执行 mysqlbinlog 时可能需要 sudo 权限,确保对日志文件有读取权限。

通过以上步骤,可完整实现基于二进制日志的故障恢复,适用于 MySQL 5.7 + CentOS 7 环境,且能保证 utf8mb4 字符集数据的完整性。

http://www.dtcms.com/a/431616.html

相关文章:

  • 建立网站专业公司吗wordpress 换主题问题
  • 高功耗显卡装机实战:电源 / 机箱 / 主板兼容问题全解析与解决方案
  • Java 性能监控与分析工具
  • 写作网站六大神书wordpress改小程序
  • 网站没建设可以访问吗最流行的网站开发
  • 【图像理解进阶】微调Qwen2.5-VL-32B用于遥感图像理解:从硬件到代码实践
  • 比较有名的diy制作网站wordpress category_name
  • 利用视觉对齐的文本洞察进行医学图像分割
  • 定西兰州网站建设做公司简介需要多少钱
  • 网站icp备案查不到兼职做调查哪个网站好
  • 【C++】透视C++多态:从虚函数表到底层内存布局的完全拆解
  • PSG技术分析:战术体系与关键角色
  • 在线做视频的网站重庆装修公司电话
  • 自己做的网站打不开了网站搜索排名优化怎么做
  • 开源 C# 快速开发(十四)进程--内存映射
  • ps个人网站设计江苏网页设计报价
  • 机器视觉检测中,二值化的含义以及阈值
  • 设计发明的网站域名怎么进入网址
  • 东城网站建设公司黄骅贴吧新鲜事
  • 28.CSS 3D 玻璃形态动画效果
  • 51单片机串口中断
  • 调用链监控系统 - CAT
  • 白酒公司网站的建设阜宁网站制作费用
  • 太白 网站建设高州网站建设公司
  • 怎么搭建一个博客网站wordpress信息量几百万
  • 用 【C# + Winform + MediaPipe】 实现人脸468点识别
  • C++查缺补漏《4》_时间复杂度、空间配置器和内存池、排序总结、右值引用和移动语义、函数出参和入参、类中的deafult和delete
  • wordpress 仿百度谷歌排名优化
  • 跟我学C++中级篇—non-transient异常
  • NSIS下载安装使用教程(附安装包,非常详细)