MySQL 数据页损坏处理思路
文章目录
- 前言
- 1. 备份恢复
- 2. 强制 InnoDB 恢复
- 2.1 损坏数据页
- 2.2 观察错误日志
- 2.3 设置参数
- 2.4 定位表信息
- 2.5 分析处理
- 2.6 恢复数据
- 总结
前言
研发自己搭建了一套 MySQL 没有设置双一参数,机房异常断电,导致数据页出现损坏,本篇文章介绍此类问题处理思路。
1. 备份恢复
如果该集群有完整的备份和 Binlog 备份,那么可以直接选择通过备份恢复数据。
2. 强制 InnoDB 恢复
MySQL 提供 innodb_force_recovery 参数,可在紧急情况使用,因为当数据页发生损坏时,数据库通常无法启动或频繁重启,可以设置 innodb_force_recovery 参数,表示即使发现了损坏页也可以继续让服务运行,这样我们就可以读取数据表,并且对当前损坏的数据表进行分析和备份。
innodb_force_recovery 参数一共有 7 种状态,除了默认的 0 以外,还可以为 1-6 的取值,分别代表不同的强制恢复措施。
通常 innodb_force_recovery 参数设置为 1,只要能正常读取数据表即可。但如果参数设置为 1 之后还无法读取数据表,我们可以将参数逐一增加,比如 2、3 等。一般来说不需要将参数设置到 4 或以上,因为这有可能对数据文件造成永久破坏。
另外当 innodb_force_recovery 设置为大于 0 时,相当于对 InnoDB 进行了写保护,会阻止 INSERT、UPDATE、DELETE 操作。只能进行 SELECT 操作。
15.21.3 Forcing InnoDB Recovery
接下来我们模拟一次数据页面损坏。
2.1 损坏数据页
直接使用 vi 打开一张测试表的 mgr_test.ibd 的数据文件,然后随机删除一段。
mgr_test 为测试表,有 10 行记录。
2.2 观察错误日志
此时如果有查询访问 mgr_test 表,数据库会直接报错,并重启。
[ERROR] [MY-011906] [InnoDB] Database page corruption on disk or a failed file read of page [page id: space=19, page number=4]. You may have to recover from a backup.
2.3 设置参数
将 innodb_force_recovery 调整为 1 然后重启数据库。
2.4 定位表信息
我们做实验的时候,是故意损坏一张表,所以是知道哪张表坏了,如果是真实发生的案例,往往是不知道是哪张表的数据页损坏的,需要定位分析。
[ERROR] [MY-011906] [InnoDB] Database page corruption on disk or a failed file read of page [page id: space=19, page number=4]. You may have to recover from a backup.
根据错误日志中的信息:[page id: space=19, page number=4] 发现是 space=19 page number=4 的数据页损坏。
select * from information_schema.INNODB_TABLES where SPACE = 19;
+----------+---------------+------+--------+-------+------------+---------------+------------+--------------+--------------------+
| TABLE_ID | NAME | FLAG | N_COLS | SPACE | ROW_FORMAT | ZIP_PAGE_SIZE | SPACE_TYPE | INSTANT_COLS | TOTAL_ROW_VERSIONS |
+----------+---------------+------+--------+-------+------------+---------------+------------+--------------+--------------------+
| 1081 | test/mgr_test | 33 | 6 | 19 | Dynamic | 0 | Single | 0 | 0 |
+----------+---------------+------+--------+-------+------------+---------------+------------+--------------+--------------------+
由此,可以看出是 test 库下的 mgr_test 表的数据页发生损坏。
select b.INDEX_ID, a.NAME as TableName, a.SPACE as Space, b.NAME as IndexName
from information_schema.INNODB_TABLES a, information_schema.INNODB_INDEXES b
where a.SPACE = b.SPACE and a.SPACE = 19;
+----------+---------------+-------+-----------+
| INDEX_ID | TableName | Space | IndexName |
+----------+---------------+-------+-----------+
| 180 | test/mgr_test | 19 | PRIMARY |
+----------+---------------+-------+-----------+
根据上面的查询结果,确定损坏的页是属于主键还是辅助索引,如果属于主键索引,因为在 MySQL 中索引即数据,则可能会导致数据丢失,如果是二级索引,删除索引重建即可。
我们当前测试,损坏的就是 PRIMARY 主键索引,所以如果没有备份数据很可能会丢失。
2.5 分析处理
通过上一步骤的分析,已经定位到是 test/mgr_test 的主键索引发生数据页面的损坏,且没有备份,现在能做的就是尽可能的恢复部分数据。数据页损坏的表是不支持 WHERE、ORDER BY 等条件过滤的,只支持 LIMIT。
select * from mgr_test limit 10;
ERROR 2013 (HY000): Lost connection to MySQL server during query
因为读取的数据中,包含损坏的页面,所以会直接报错,可以采用二分查找判断数据页损坏的位置。
select * from mgr_test limit 4;
经过测试,我们发现数据页发生损坏的是第 5 行记录,那么前 4 行记录还是可以保留下来的。
2.6 恢复数据
经过分析,只有前 4 行记录可以正常读取出来,那么此时需要将这部分数据备份出来。
mysqldump -uroot -p --add-locks=0 --no-create-info --single-transaction --set-gtid-purged=OFF test mgr_test --where="true limit 4" > ./resover.sql
记录表结构,删除改表,重新启动数据库后重建该表。
drop table mgr_test;
数据页损坏的表,已经被删除掉了,能恢复的数据也已备份出来了,现在需要设置 innodb_force_recovery 为 0 重启数据库。
创建 mgr_test 表,然后 source 备份文件写入该表,数据恢复完成,虽然丢失了一部分。
总结
本篇文章介绍了人工恢复 ibd 文件中的数据,虽然没有全部找回,但是相比于束手无措来说,已经是不幸中的万幸,至少我们还可以把正确的数据页中的记录成功备份出来,尽可能恢复原有的数据表。需要注意的是,生产环境不能有任何侥幸心理,一定要有完善的备份恢复机制。
相关文章:
MySQL 数据页损坏处理思路
文章目录 前言1. 备份恢复2. 强制 InnoDB 恢复2.1 损坏数据页2.2 观察错误日志2.3 设置参数2.4 定位表信息2.5 分析处理2.6 恢复数据 总结 前言 研发自己搭建了一套 MySQL 没有设置双一参数,机房异常断电,导致数据页出现损坏,本篇文章介绍此…...
面试 Vue 框架八股文十问十答第二期
面试 Vue 框架八股文十问十答第二期 作者:程序员小白条,个人博客 相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新! ⭐点赞⭐收藏⭐不迷路!⭐ 1)常见的事件修饰符及其作…...
【Python学习】2024PyCharm插件推荐
目录 【Python学习】2024PyCharm插件推荐 1. Key Promoter X2.Rainbow CSV3.Markdown4.Rainbow Brackets5.Indent Rainbow6.Regex Tester7.Regex Tester8.Background Image Plus9.Material Theme UI10. Chinese 汉化插件参考 文章所属专区 Python学习 1. Key Promoter X 方便…...
剑指offer题解合集——Week2day6
文章目录 剑指offerWeek2周六:表示数值的字符串AC代码思路: 周六:调整数组顺序使奇数位于偶数前面AC代码思路: 剑指offerWeek2 周六:表示数值的字符串 题目链接:表示数值的字符串 请实现一个函数用来判…...
算法训练第五十二天|300. 最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组
300. 最长递增子序列: 题目链接 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组…...
HTTP基础知识总结
目录 一、什么是HTTP? 二、与HTTP有关的协议 三、HTTP请求特征 四、HTTP组成格式 五、HTTP标头 1.通用标头 2.实体标头 3.请求标头 4.响应标头 六、HTTP状态码分类 我们在日常测试过程中,也可以通过浏览器F12简单定位是前端问题还是后端问题&a…...
创意与技术的结晶:AI魔法绘图与中文描述的完美结合
在人类文明的长河中,创意与技术一直是推动发展的重要动力。随着科技的日新月异,人工智能(AI)在创意领域的应用逐渐崭露头角,而AI魔法绘图与中文描述的结合,更是将这一趋势推向了新的高度。AI魔法绘图是一种…...
Python:int(value, base=10)
int(value, base2) 是 Python 中的一个内置函数,用于将一个字符串或数字以指定的进制转换为整数。 函数的参数含义如下: value:要进行转换的值,可以是一个字符串或数字。base:进制数,默认为 10࿰…...
Vue之调用store的action(包含getter调用)
文章目录 Vue之调用store的action(包含getter调用)调用store的action方法一:Promise 链式调用方法二:async/await方法三:Promise.all()同时执行 调用store的getter方法一:this.$store.getters调用方法二:mapGetters调用…...
蟹目标检测数据集VOC格式400张
蟹,一种独特的海洋生物,以其强壮的身体和独特的生活习性而闻名。 蟹的身体宽厚,有一对锐利的大钳子,这使得它们在寻找食物和保护自己时非常有力。蟹的外观颜色多样,有绿色、蓝色、棕色和红色等,这使得它们在…...
PyTorch中常用的工具(4)Visdom
文章目录 前言3.2 Visdom 前言 在训练神经网络的过程中需要用到很多的工具,最重要的是数据处理、可视化和GPU加速。本章主要介绍PyTorch在这些方面常用的工具模块,合理使用这些工具可以极大地提高编程效率。 由于内容较多,本文分成了五篇文…...
Linux(ubuntu)下git / github/gitee使用
先附上git命令 linuxchenxiao:~$ cd Templates/ 先进入一个目录,也可mkdir新建一个目录:用于接下来初始化为git可以管理的仓库 这个目录就是所说的工作目录,指当前正在进行开发的项目的本地目录。 linuxchenxiao:~/Templates$ git init 已…...
回归预测 | MATLAB实OOA-LSTM基于鱼鹰优化算法优化长短期记忆网络的多输入单输出数据回归预测模型 (多指标,多图)
回归预测 | MATLAB实OOA-LSTM基于鱼鹰优化算法优化长短期记忆网络的多输入单输出数据回归预测模型 (多指标,多图) 目录 回归预测 | MATLAB实OOA-LSTM基于鱼鹰优化算法优化长短期记忆网络的多输入单输出数据回归预测模型 (多指标&a…...
2023年工作初体验
23年终于正式入职,参与了正式上线的电商平台、crm平台等项目的研发,公司规模较小,气氛融洽,没有任何勾心斗角、末位淘汰,几乎没什么压力。虽然是我的第一家公司,但实际是个适合养老的公司(笑 总…...
PostgreSQL 作为向量数据库:入门和扩展
PostgreSQL 拥有丰富的扩展和解决方案生态系统,使我们能够将该数据库用于通用人工智能应用程序。本指南将引导您完成使用 PostgreSQL 作为向量数据库构建生成式 AI 应用程序所需的步骤。 我们将从pgvector 扩展开始,它使 Postgres 具有特定于向量数据库…...
亚信安慧AntDB数据库:企业核心业务系统数据库升级改造的可靠之选
在近期召开的“2023年国有企业应用场景发布会”上,亚信安慧公司的核心数据库产品AntDB闪耀登场,技术总监北陌先生针对企业核心业务系统数据库升级改造的关键议题发表了深度分享。他从研发、工程实施和运维管理三个维度细致剖析了当前企业在进行数据库升级…...
CommonJS 和 ES6 Module:一场模块规范的对决(上)
🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…...
python快速实现简易电子音乐盒(电子钢琴)
首先第一步附上完整源码(基于pygame库) import pygame# 初始化pygame pygame.init()# 设置窗口大小 window_size (800, 600) screen pygame.display.set_mode(window_size)# 加载音频文件 C4 pygame.mixer.Sound("test1/C4.wav") D4 pyga…...
详解bookkeeper AutoRecovery机制
引言小故事 张三在一家小型互联网公司上班,由于公司实行的996,因此经常有同事“不辞而别”,为了工作的正常推进,团队内达成了某种默契,这种默契就是通过某个规则来选出一个同事,这个同事除了工作之余还有额…...
使用 Ubuntu 20.04 进行初始服务器设置
前些天发现了一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站。 使用 Ubuntu 20.04 进行初始服务器设置 介绍 首次创建新的 Ubuntu 20.04 服务器时,应该执行一些重…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
游戏开发中常见的战斗数值英文缩写对照表
游戏开发中常见的战斗数值英文缩写对照表 基础属性(Basic Attributes) 缩写英文全称中文释义常见使用场景HPHit Points / Health Points生命值角色生存状态MPMana Points / Magic Points魔法值技能释放资源SPStamina Points体力值动作消耗资源APAction…...
在Zenodo下载文件 用到googlecolab googledrive
方法:Figshare/Zenodo上的数据/文件下载不下来?尝试利用Google Colab :https://zhuanlan.zhihu.com/p/1898503078782674027 参考: 通过Colab&谷歌云下载Figshare数据,超级实用!!࿰…...
VSCode 使用CMake 构建 Qt 5 窗口程序
首先,目录结构如下图: 运行效果: cmake -B build cmake --build build 运行: windeployqt.exe F:\testQt5\build\Debug\app.exe main.cpp #include "mainwindow.h"#include <QAppli...
