为什么NTFS删除超过4G大文件或数据库文件后FILE RECORD大小表现为0

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

为什么NTFS删除超过4G大文件或数据库文件后FILE RECORD大小表现为0?


答:NTFS删除一个文件,必须要完成如下几个流程,才算完结:

1、更改文件系统$bitmap,释放空间

2、更改$mft filerecord项的属性为删除

3、更改$mft:$bitmap的位图信息为0,释放这个filerecord的占用空间

4、清除目录链表中关于本文件的item信息。

        这个流程是理想状态下的处理规则,但实际上,最头疼的是OS要考虑这个问题:如果在上述4个步骤中出现中断(如突然断电、死机等),如何让下次操作时能够继续,或者维系文件系统还是一致的(最简单的,如果文件删除了,但目录还在,那总是不合适的,全盘李检测一次又太消耗时间,而且到底谁错了,有时候也分不清),为了解决这个问题,NTFS引入了$logfile,即日志,简单说就是为正在执行的一个完整IO运作(如删除一个文件)事先记录一下状态,如果没做成功,下回直接回滚回没做成功的状态即可。

        可是问题又来了,如果某个文件太大,或者存储链表太长(即碎片太多)。记录这个文件元信息部分就会变得很大,比如一个文件大小是4G,按4K块大小算,连续的位图至少也得有1M,为了不至于在日志文件中保存太大的信息(比如一个4T的文件,先保存1g的位图,太慢且变数又增大了),NTFS对于复杂文件或大文件是采取分批次处理的:即某个文件可能是不断地被变小,变小,直至变0。

        为了维持操作的一致性。猜想,NTFS设了两种情况,如果是判断可以一次日志记录即够完成某个IO原子操作的,就不用清除filerecord的大小和位置信息(runlist)了。但如果ntfs无法一次日志完成一个IO原子操作,则需要分成多个独立的IO原子操作,每个IO原子操作记录一次日志,完成时更新成新状态——这样一来,删除一个大文件或多碎片的文件,最后一次IO原子操作后,就会清除为0大小,RUNLIST清空状态。

        这个问题中,4G其实也不是变数,猜测来源于4K块大小,和文件一次释放1M个簇范围的片区导致。数据库往往不容易恢复,大小即使小于4G,其原因是因为数据库不断增长,碎片较多,片断化导致元数据量大,位置分散,无法一次性完成释放等操作。










本文转自 张宇 51CTO博客,原文链接:http://blog.51cto.com/zhangyu/1827150,如需转载请自行联系原作者
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
2月前
|
SQL 关系型数据库 MySQL
数据库导入SQL文件:全面解析与操作指南
在数据库管理中,将SQL文件导入数据库是一个常见且重要的操作。无论是迁移数据、恢复备份,还是测试和开发环境搭建,掌握如何正确导入SQL文件都至关重要。本文将详细介绍数据库导入SQL文件的全过程,包括准备工作、操作步骤以及常见问题解决方案,旨在为数据库管理员和开发者提供全面的操作指南。一、准备工作在导
485 0
|
16天前
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。
|
20天前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
28天前
|
Oracle 关系型数据库 数据库
Oracle数据恢复—Oracle数据库文件有坏快损坏的数据恢复案例
一台Oracle数据库打开报错,报错信息: “system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。管理员联系我们数据恢复中心寻求帮助,并提供了Oracle_Home目录的所有文件。用户方要求恢复zxfg用户下的数据。 由于数据库没有备份,无法通过备份去恢复数据库。
|
2月前
|
SQL 关系型数据库 MySQL
|
2月前
|
存储 关系型数据库 MySQL
PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取(pydicom 库使用)
PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取(pydicom 库使用)
43 2
|
2月前
|
SQL 存储 关系型数据库
SQL文件导入MySQL数据库的详细指南
数据库中的数据转移是一项常规任务,无论是在数据迁移过程中,还是在数据备份、还原场景中,导入导出SQL文件显得尤为重要。特别是在使用MySQL数据库时,如何将SQL文件导入数据库是一项基本技能。本文将详细介绍如何将SQL文件导入MySQL数据库,并提供一个清晰、完整的步骤指南。这篇文章的内容字数大约在
356 1
|
2月前
|
Java 关系型数据库 数据库连接
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第3天】Spring Boot项目中数据库连接问题可能源于配置错误或依赖缺失。YAML配置文件的格式不正确,如缩进错误,会导致解析失败;而数据库驱动不匹配、连接字符串或认证信息错误同样引发连接异常。解决方法包括检查并修正YAML格式,确认配置属性无误,以及添加正确的数据库驱动依赖。利用日志记录和异常信息分析可辅助问题排查。
335 10
|
2月前
|
Java 关系型数据库 MySQL
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第4天】本文分析了Spring Boot应用在连接数据库时可能遇到的问题及其解决方案。主要从四个方面探讨:配置文件格式错误、依赖缺失或版本不兼容、数据库服务问题、配置属性未正确注入。针对这些问题,提供了详细的检查方法和调试技巧,如检查YAML格式、验证依赖版本、确认数据库服务状态及用户权限,并通过日志和断点调试定位问题。
177 6
|
2月前
|
Oracle 关系型数据库 数据库
oracle数据恢复—Oracle数据库文件损坏导致数据库打不开的数据恢复案例
打开oracle数据库时报错,报错信息:“system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。急需恢复zxfg用户下的数据。 出现上述报错的原因有:控制文件损坏、数据文件损坏、数据文件与控制文件的SCN不一致等。数据恢复工程师对数据库文件做进一步检测分析后发现sysaux01.dbf文件有坏块。修复sysaux01.dbf文件,启动数据库依然有许多查询报错。export和data pump工具无法使用,查询告警日志并分析报错,确认发生上述错误的原因就是sysaux01.dbf文件损坏。由于该文件损坏,从数据库层面无法修复数据库。由于system和用户表空间的数据文件是正常的,