mysql数据库误删数据文件怎么处理?

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: MySQL数据库运行的时候误删了数据文件时的处理办法

1 linux操作系统删除文件的原理

     在使用rm删除文件时,Linux操作系统并不对这个文件的inode和数据块做清除操作,而是从父目录的块里删除这个文件的名字,这个文件的名字是指向文件的inode的。

     如果一个文件有硬链接,执行rm命令,就是删除一个硬链接,文件本身还在。当文件打开时,打开文件的进程会维护一个文件描述符表,包含此文件的文件描述符,这个文件描述符通过系统级的打开文件表,指向系统级的inode表里的inode条目,这个inode就是打开文件的inode的内存拷贝。通过文件描述符,同样可以操作文件,利用这个特性,在打开文件被误删除时,可以利用进程的文件描述符找到被误删除的文件,拷贝文件至原目录就可以恢复了。下面的图片来自网络,可以看的更明白点:

2 MySQL数据库运行时被误删数据文件的处理

2.1 处理思路

      明白了linux操作系统下删除文件的原理,对MySQL正在运行时数据文件被误删除应该怎样处理也就有了大概的思路。

      在这个时候,要注意的是不能关闭数据库,如果数据库关闭了,文件描述符也就没了,对文件的引用没了,这时要恢复文件就得想其它的办法了。数据库不能关闭,连接数据库的应用则必须要关闭,否则,我们拷贝的数据文件可能不是最新的,也可能会有不一致的数据。

     关闭应用后,就可以利用文件描述符来拷贝恢复被误删的文件了。

2.2 故障模拟

       为了使故障模拟简单直观一点,使用独立的表空间创建一张表,表的名字是t,表的数据文件是t.ibd,在数据库运行时,将此文件删除。

 rm t.ibd

2.3  处理步骤

查找mysqld进程的进程号

       要想找到被删除文件的文件描述符,首先要找到打开文件的进程,myql数据库时单进程多线程模型,打开文件的进程即是MySQL数据库的后台进程mysqld

ps -ef|grep mysqld

   这里查到的mysqld的进程id是563,进入进程目录,进程目录fd目录下是进程打开的文件

cd /proc/563

 ls

 cd fd

进入目录显示进程打开的文件

ls -l

   lr-x------ 1 root root 64 Jul 23 09:33 0 -> /dev/null

   l-wx------ 1 root root 64 Jul 23 09:33 1 -> /usr/local/mysql-5.7.34/data/DESKTOP-FVJ8TG1.err

   lrwx------ 1 root root 64 Jul 23 09:33 10 -> /usr/local/mysql-5.7.34/data/ibtmp1

   lrwx------ 1 root root 64 Jul 23 09:33 11 -> '/tmp/ibdI0AsK (deleted)'

   lrwx------ 1 root root 64 Jul 23 09:33 12 -> /usr/local/mysql-5.7.34/data/mysql/servers.ibd

   lrwx------ 1 root root 64 Jul 23 09:33 27 -> /usr/local/mysql-5.7.34/data/test/t1.ibd

   lrwx------ 1 root root 64 Jul 23 09:33 28 -> '/usr/local/mysql-5.7.34/data/test/t.ibd (deleted)'

最后一行是被删除的t.ibd文件,它的文件句柄是28,通过文件句柄可以拷贝文件,将

拷回原目录

 cp 28 /usr/local/mysql-5.7.34/data/test/t.ibd

登录数据库检查数据

   mysql> use test;

       Database changed

   mysql> select count(*) from t;

       +----------+

       | count(*) |

       +----------+

       |     1000 |

       +----------+

       1 row in set (0.00 sec)

2.4 后续处理


数据库重启后报下面错误

  mysql> select count(*) from t;

   ERROR 1812 (HY000): Tablespace is missing for table `test`.`t`.

表空间找不到了,这时候表的定义在数据库还在,表的数据文件也在,只要重新导入表空间就可以了。导入表空间前先检查一下文件的属主和权限,由于是用root用户做的拷贝,文件的属主也是root,需要改为mysql,进入操作系统更改文件属主为MySQL用户

chown mysql:mysql t.ibd

 重新导入表空间

  alter table t import tablespace;

检查数据

 mysql> select count(*) from t;

  +----------+

  | count(*) |

  +----------+

  |     1000 |

  +----------+

  1 row in set (0.00 sec)

可以查询到数据了。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
数据采集 数据库 Python
有哪些方法可以验证用户输入数据的格式是否符合数据库的要求?
有哪些方法可以验证用户输入数据的格式是否符合数据库的要求?
164 75
|
1月前
|
Java 关系型数据库 MySQL
SpringBoot 通过集成 Flink CDC 来实时追踪 MySql 数据变动
通过详细的步骤和示例代码,您可以在 SpringBoot 项目中成功集成 Flink CDC,并实时追踪 MySQL 数据库的变动。
214 43
|
1月前
|
存储 SQL 关系型数据库
MySQL底层概述—4.InnoDB数据文件
本文介绍了InnoDB表空间文件结构及其组成部分,包括表空间、段、区、页和行。表空间是最高逻辑层,包含多个段;段由若干个区组成,每个区包含64个连续的页,页用于存储多条行记录。文章还详细解析了Page结构,分为通用部分(文件头与文件尾)、数据记录部分和页目录部分。此外,文中探讨了行记录格式,包括四种行格式(Redundant、Compact、Dynamic和Compressed),重点介绍了Compact行记录格式及其溢出机制。最后,文章解释了不同行格式的特点及应用场景,帮助理解InnoDB存储引擎的工作原理。
MySQL底层概述—4.InnoDB数据文件
|
1月前
|
SQL 监控 关系型数据库
MySQL补充性文件
通过以上内容,您可以全面了解和掌握 MySQL 补充性文件的配置、查看及其作用,从而提升数据库管理的效率和质量。
74 36
|
12天前
|
SQL 关系型数据库 MySQL
基于SQL Server / MySQL进行百万条数据过滤优化方案
对百万级别数据进行高效过滤查询,需要综合使用索引、查询优化、表分区、统计信息和视图等技术手段。通过合理的数据库设计和查询优化,可以显著提升查询性能,确保系统的高效稳定运行。
32 9
|
18天前
|
监控 关系型数据库 MySQL
MySQL和SQLSugar百万条数据查询分页优化
在面对百万条数据的查询时,优化MySQL和SQLSugar的分页性能是非常重要的。通过合理使用索引、调整查询语句、使用缓存以及采用高效的分页策略,可以显著提高查询效率。本文介绍的技巧和方法,可以为开发人员在数据处理和查询优化中提供有效的指导,提升系统的性能和用户体验。掌握这些技巧后,您可以在处理海量数据时更加游刃有余。
66 9
|
14天前
|
SQL 数据建模 BI
【YashanDB 知识库】用 yasldr 配置 Bulkload 模式作单线程迁移 300G 的业务数据到分布式数据库,迁移任务频繁出错
问题描述 详细版本:YashanDB Server Enterprise Edition Release 23.2.4.100 x86_64 6db1237 影响范围: 离线数据迁移场景,影响业务数据入库。 外场将部分 NewCIS 的报表业务放到分布式数据库,验证 SQL 性能水平。 操作系统环境配置: 125G 内存 32C CPU 2T 的 HDD 磁盘 问题出现的步骤/操作: 1、部署崖山分布式数据库 1mm 1cn 3dn 单线启动 yasldr 数据迁移任务,设置 32 线程的 bulk load 模式 2、观察 yasldr.log 是否出现如下错
|
19天前
|
JSON Java 关系型数据库
Hutool创建数据源工厂动态查询不同数据库不同数据表的数据
Hutool创建数据源工厂动态查询不同数据库不同数据表的数据
33 2
|
19天前
|
存储 关系型数据库 MySQL
MySQL进阶突击系列(09)数据磁盘存储模型 | 一行数据怎么存?
文中详细介绍了MySQL数据库中一行数据在磁盘上的存储机制,包括表空间、段、区、页和行的具体结构,以及如何设计和优化行数据存储以提高性能。
|
26天前
|
存储 NoSQL MongoDB
数据库数据恢复—MongoDB数据库迁移过程中丢失文件的数据恢复案例
某单位一台MongoDB数据库由于业务需求进行了数据迁移,数据库迁移后提示:“Windows无法启动MongoDB服务(位于 本地计算机 上)错误1067:进程意外终止。”