热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

记一次通过物理文件恢复MariaDB数据

1、起因时间:2022.03.12 10:10。事件:网站的 mariadb 数据库 server 突然崩溃,尝试各种办法启动无果。过程:不幸的是数据库没有备份,万幸的是可以通过数据库物理文件恢复数据

1、起因

时间:2022.03.12 10:10。

事件:网站的 mariadb 数据库 server 突然崩溃,尝试各种办法启动无果。

过程:不幸的是数据库没有备份,万幸的是可以通过数据库物理文件恢复数据。

结果:恢复数据,并特此记录整个过程,以备急时之需。

2、数据库与数据文件

众所周知,数据库中的数据会以文件的形式落盘进行保存(这些文件是以某种特定格式存储的,不是text格式,试图用文本编辑器打开会看到乱码)。在数据库中,每一个 database 都是一个单独的文件夹,文件夹下存储着每一张表的相关文件(不同的存储引擎生成的表文件可能不同,这里使用 innodb 引擎)。

例如,笔者网站数据库名称叫做 ivansli,有一个用户表 - user,脱敏之后的数据文件布局大致如下:

➜ /usr/local/data tree -L 2
.
├── aria_log.00000001
├── aria_log_control
├── ib_buffer_pool
├── ibdata1
├── ib_logfile0
├── ibtmp1
├── iZuf63yp8w5ku4znrskda8Z.err
├── iZuf63yp8w5ku4znrskda8Z.pid
├── multi-master.info
├── mysql-bin.000001
├── mysql-bin.000002
├── mysql-bin.000003
├── mysql-bin.index
├── mysql-slow.log
├── performance_schema
│ └── db.opt
└── ivansli
├── db.opt
├── user.frm
├── user.MYD
└── user.MYI

这里的 /usr/local/data 数据库存储数据的目录。

ivansli文件夹下可以看到有三个不同格式,相同名称的文件,作用分别为:user.frm,存储数据表的元数据 user.MYD,存储数据表的具体数据 user.MYI,存储数据表的索引。

除了每张表的若干个文件之外,对于数据库server来说还有一个重要的 ibdata1 文件(位于数据库 server 存储数据的根目录)。

3、 ibdata 作用

ibdata (是InnoDB基础结构的系统表空间) 包含几个对InnoDB至关重要的信息:

  • 表格数据页。

  • 表索引页。

  • 数据字典。

  • MVCC控制数据。

  • 撤消空间、回滚段

  • 双重写入缓冲区(在后台写页面以避免操作系统缓存)。

  • 插入缓冲区(对二级索引的更改)。
  • 笔者这里 innodb_file_per_table=0,使用共享表空间 ibdata1,所以恢复数据时需要拷贝这个文件 关于这个文件具体可以查阅相关资料。

    对于笔者来说,虽然 数据库 server 挂了,但是这些关键性的文件还是完整的。那么,就有办法通过这些文件来恢复对应的数据。

    举个不太恰当的例子:

    这里的数据恢复有点像器官移植,器官捐献者可能已经大脑死亡。

    但是捐献者的心脏等器官还是有活力的,找到适合的目标受体,这些器官还是能够继续工作的。

    4、 恢复过程

    这里以 ivansli database 数据库的恢复为例,整个恢复过程大致如下:

  • 查看当前待恢复的数据所在的 server(这里称为 源数据库server) 类型以及版本 笔者这里使用的是 mariadb - 10.7.0。
  • 为什么要看已经 crash 掉的数据库 server 的类型、版本呢?

    主要是为数据恢复找到一个匹配的环境(类比器官移植,也是需要找到相同、相近的匹配受体,否则就会出问题)。

  • 在其他服务器搭建 与 源数据库server 相同或者相近版本的 数据库server (这里称为 目标数据库server) 搭建好之后,先把 目标数据库server 停掉,暂时不启动,为后面拷贝数据做准备。

  • 把 源数据库server 待恢复的文件夹(这里是 ivansli 文件夹)与 ibdata1 文件拷贝到 目标数据库server 数据目录下 ivansli 文件夹在 目标数据库server 数据库存储数据目录下不存在,直接拷贝。ibdata1 文件在 目标数据库server 数据库存储数据目录下有同名文件,直接覆盖。

  • 修改 目标数据库server 数据库存储数据目录下相关文件权限。
  • chmod -R 660 ivansli ibdata1
    chown -R mysql:mysql ivansli ibdata1
    chmod +x ivansli

  • 启动 目标数据库server。

  • 使用 root 账号登录 目标数据库server,查看数据恢复情况。

  • 目标数据库server上 能够看到待恢复数据,做数据备份导出保存。

  • 在 源数据库server 服务器上搭建新的 数据库server,把恢复的数据导入进来。

  • 5、 总结

    对于开发人员来说,会经常听到删库跑路、删库坐牢之类的事情发生。对于公司来说,最重要的是用户的数据信息,尤其是金融等行业,宁可服务不可用,数据安全是一定要保证的。

    这篇文章所描述的是在数据文件存在的特定情况下进行简单的数据恢复。对于数据文件被删除掉的情况,可能要进行扫描磁盘等更专业的操作了。

    总之一句话:善待每一行代码,谨慎敲打每一个命令。还有就是:做好数据备份、做好数据备份、做好数据备份。


    推荐阅读
    • PTArchiver工作原理详解与应用分析
      PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
    • 服务器部署中的安全策略实践与优化
      服务器部署中的安全策略实践与优化 ... [详细]
    • 本指南详细介绍了在Linux环境中高效连接MySQL数据库的方法。用户可以通过安装并使用`mysql`客户端工具来实现本地连接,具体命令为:`mysql -u 用户名 -p 密码 -h 主机`。例如,使用管理员账户连接本地MySQL服务器的命令为:`mysql -u root -p pass`。此外,还提供了多种配置优化建议,以确保连接过程更加稳定和高效。 ... [详细]
    • MySQL的查询执行流程涉及多个关键组件,包括连接器、查询缓存、分析器和优化器。在服务层,连接器负责建立与客户端的连接,查询缓存用于存储和检索常用查询结果,以提高性能。分析器则解析SQL语句,生成语法树,而优化器负责选择最优的查询执行计划。这一流程确保了MySQL能够高效地处理各种复杂的查询请求。 ... [详细]
    • 在Linux系统中避免安装MySQL的简易指南
      在Linux系统中避免安装MySQL的简易指南 ... [详细]
    • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
      本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
    • Unity与MySQL连接过程中出现的新挑战及解决方案探析 ... [详细]
    • 该大学网站采用PHP和MySQL技术,在校内可免费访问某些外部收费资料数据库。为了方便学生校外访问,建议通过学校账号登录实现免费访问。具体方案可包括利用学校服务器作为代理,结合身份验证机制,确保合法用户在校外也能享受免费资源。 ... [详细]
    • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
    • 如何优化MySQL数据库性能以提升查询效率和系统稳定性 ... [详细]
    • 本文详细介绍了在Linux系统上编译安装MySQL 5.5源码的步骤。首先,通过Yum安装必要的依赖软件包,如GCC、GCC-C++等,确保编译环境的完备。接着,下载并解压MySQL 5.5的源码包,配置编译选项,进行编译和安装。最后,完成安装后,进行基本的配置和启动测试,确保MySQL服务正常运行。 ... [详细]
    • Oracle字符集详解:图表解析与中文乱码解决方案
      本文详细解析了 Oracle 数据库中的字符集机制,通过图表展示了不同字符集之间的转换过程,并针对中文乱码问题提供了有效的解决方案。文章深入探讨了字符集配置、数据迁移和兼容性问题,为数据库管理员和开发人员提供了实用的参考和指导。 ... [详细]
    • 在Android应用开发中,实现与MySQL数据库的连接是一项重要的技术任务。本文详细介绍了Android连接MySQL数据库的操作流程和技术要点。首先,Android平台提供了SQLiteOpenHelper类作为数据库辅助工具,用于创建或打开数据库。开发者可以通过继承并扩展该类,实现对数据库的初始化和版本管理。此外,文章还探讨了使用第三方库如Retrofit或Volley进行网络请求,以及如何通过JSON格式交换数据,确保与MySQL服务器的高效通信。 ... [详细]
    • 提升Android开发效率:Clean Code的最佳实践与应用
      在Android开发中,提高代码质量和开发效率是至关重要的。本文介绍了如何通过Clean Code的最佳实践来优化Android应用的开发流程。以SQLite数据库操作为例,详细探讨了如何编写高效、可维护的SQL查询语句,并将其结果封装为Java对象。通过遵循这些最佳实践,开发者可以显著提升代码的可读性和可维护性,从而加快开发速度并减少错误。 ... [详细]
    • 在使用 SQL Server 时,连接故障是用户最常见的问题之一。通常,连接 SQL Server 的方法有两种:一种是通过 SQL Server 自带的客户端工具,例如 SQL Server Management Studio;另一种是通过第三方应用程序或开发工具进行连接。本文将详细分析导致连接故障的常见原因,并提供相应的解决策略,帮助用户有效排除连接问题。 ... [详细]
    author-avatar
    lrz76597
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有