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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
云数据库 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
目录
打赏
0
0
0
0
25
分享
相关文章
如何实现MySQL百万级数据的查询?
本文探讨了在MySQL中对百万级数据进行排序分页查询的优化策略。面对五百万条数据,传统的浅分页和深分页查询效率较低,尤其深分页因偏移量大导致性能显著下降。通过为排序字段添加索引、使用联合索引、手动回表等方法,有效提升了查询速度。最终建议根据业务需求选择合适方案:浅分页可加单列索引,深分页推荐联合索引或子查询优化,同时结合前端传递最后一条数据ID的方式实现高效翻页。
数据库数据删除策略:硬删除vs软删除的最佳实践指南
在项目开发中,“删除”操作常见但方式多样,主要分为硬删除与软删除。硬删除直接从数据库移除数据,操作简单、高效,但不可恢复;适用于临时或敏感数据。软删除通过标记字段保留数据,支持恢复和审计,但增加查询复杂度与数据量;适合需追踪历史或可恢复的场景。两者各有优劣,实际开发中常结合使用以满足不同需求。
227 4
MySQL 5.6/5.7 DDL 失败残留文件清理指南
通过本文的指南,您可以更安全地处理 MySQL 5.6 和 5.7 版本中 DDL 失败后的残留文件,有效避免数据丢失和数据库不一致的问题。
数据存储使用文件还是数据库,哪个更合适?
数据库和文件系统各有优劣:数据库读写性能较低、结构 rigid,但具备计算能力和数据一致性保障;文件系统灵活易管理、读写高效,但缺乏计算能力且无法保证一致性。针对仅需高效存储与灵活管理的场景,文件系统更优,但其计算短板可通过开源工具 SPL(Structured Process Language)弥补。SPL 提供独立计算语法及高性能文件格式(如集文件、组表),支持复杂计算与多源混合查询,甚至可替代数据仓库。此外,SPL 易集成、支持热切换,大幅提升开发运维效率,是后数据库时代文件存储的理想补充方案。
在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾
以上就是在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾的步骤。这个过程就像是一场接力赛,数据从MySQL数据库中接力棒一样传递到备份文件,再从备份文件传递到其他服务器,最后再传递回MySQL数据库。这样,即使在灾难发生时,我们也可以快速恢复数据,保证业务的正常运行。
198 28
|
2月前
|
mysql数据引擎有哪些
MySQL 提供了多种存储引擎,每种引擎都有其独特的特点和适用场景。以下是一些常见的 MySQL 存储引擎及其特点:
92 0
MySQL8使用物理文件恢复MyISAM表测试
MySQL8使用物理文件恢复MyISAM表测试
65 0
【YashanDB知识库】字符集latin1的MySQL中文数据如何迁移到YashanDB
本文探讨了在使用YMP 23.2.1.3迁移MySQL Server字符集为latin1的中文数据至YashanDB时出现乱码的问题。问题根源在于MySQL latin1字符集存放的是实际utf8编码的数据,而YMP尚未支持此类场景。文章提供了两种解决方法:一是通过DBeaver直接迁移表数据;二是将MySQL表数据转换为Insert语句后手动插入YashanDB。同时指出,这两种方法适合单张表迁移,多表迁移可能存在兼容性问题,建议对问题表单独处理。
【YashanDB知识库】字符集latin1的MySQL中文数据如何迁移到YashanDB
Redis和Mysql如何保证数据⼀致?
1. 先更新Mysql,再更新Redis,如果更新Redis失败,可能仍然不⼀致 2. 先删除Redis缓存数据,再更新Mysql,再次查询的时候在将数据添加到缓存中 这种⽅案能解决1 ⽅案的问题,但是在⾼并发下性能较低,⽽且仍然会出现数据不⼀致的问题,⽐如线程1删除了 Redis缓存数据,正在更新Mysql,此时另外⼀个查询再查询,那么就会把Mysql中⽼数据⼜查到 Redis中 1. 使用MQ异步同步, 保证数据的最终一致性 我们项目中会根据业务情况 , 使用不同的方案来解决Redis和Mysql的一致性问题 : 1. 对于一些一致性要求不高的场景 , 不做处理例如 : 用户行为数据 ,

热门文章

最新文章

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问