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

为什么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,其原因是因为数据库不断增长,碎片较多,片断化导致元数据量大,位置分散,无法一次性完成释放等操作。

-------北亚数据恢复中心 张宇

时间: 2024-10-28 10:54:05

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

案例:Oracle数据库文件删除 extundelete工具挖掘恢复删除的数据库文件

Oracle数据库文件被删除,通过extundelete恢复Linux被删除数据文件 今天群中有个朋友的客户闲着没事rm掉了数据文件,然后讨论到使用extundelete进行了恢复,抢救了部分未被覆盖的数据文件.该软件官方地址:http://extundelete.sourceforge.net/ 1.安装extundelete工具 [[email protected] tmp]# bunzip2 extundelete-0.2.0.tar.bz2 [[email protected] tmp]

怎么处理U盘无法拷贝超过4G大文件的情况?

制作好雨后清风U盘启动盘后,有朋友在将雨后清风系统镜像文件拷贝传输至U盘时,会发现U盘提示文件过大,无法进行传输,但是U盘的剩余存储空间明显还足够,这是怎么回事呢?其实这是U盘文件系统格式的原因,如果你的U盘文件系统格式不是NTFS的话,即使剩余空间足够,也无法传输4G以上大小的单个文件.下面雨后清风就来告诉你相应的解决方法. U盘无法存储传输4G以上大文件的解决方法 1.插入U盘,打开我的电脑,右键点击U盘,单击选择"属性".在U盘属性的面板中切换到"硬件"选项卡

SqlServer将没有log文件的数据库文件附加到服务器中

今天搞了一件很让我不爽的事情,一不小心把一个40多G的数据库日志文件删除,而且在删除之前我又搞了个日志进去,死活附加不了到服务器上去一直提示多个日志不能自动创建,白白浪费了我一个晚上的时间,后来不断的Google,终于在一个老外的博客里发现了几个语句,直接搞定,感谢他顺便记录在案. USE [master] GO -- Method 1: I use this method EXEC sp_attach_single_file_db @dbname='TestDb', @physname=N'C

MySQL ibdata1占用空间大 释放MySQL ibdata1文件的空间

MySQL ibdata1占用空间大  释放MySQL ibdata1文件的空间 背景:最近公司一台服务器报警,磁盘空间报警超阀值.  原来mysql数据库数据目录特别大,前一篇文章中介绍的是变更mysql数据文件的目录,此文主要介绍如何把mysql占用的空间释放出来. 说明: mysql有多种存储引擎,比如MyISAM.InnoDB很常用. 如果用的InnoDB, 且使用mysql默认的配置文件,MySQL的数据都会存放在ibdata1文件中,经过一段时间此文件会变的非常大,占用大量磁盘空间.

server version for the right syntax to use near 'USING BTREE 数据库文件版本不合导致的错误

MySQL 返回:#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'USING BTREE,  KEY `lang` (`language_id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8' at line 5 解决办法是打开要导入

管理SQL2005数据库文件

第二章 管理数据库文件   数据库中的事务 一组数据库操作操作SQL语句作为整体执行,要么完全地执行,要么完全地不执行 对数据库中的数据操作的过程增删改 修改数据过程: 1)将数据调入内存中修改,同时写事务日志 2)默认每隔1分钟数据库就有1个检查点,就把内存里的数据写入硬盘 3)出现故障后(故障点),数据库重启就会检查数据库事务日志,检查最近一次检查点和故障点 之间哪些事务(数据修改)完成了,哪些事务(数据修改)没完成.完成的事务进行前滚,没 完成的事务取消,进行回滚. 前滚:(在检查点和故障

数据库数据文件和控制文件恢复

数据库数据文件和控制文件恢复一次数据库数据文件和控制文件丢失或未创建恢复数据库启动方法该文档适用数据恢复:数据库安装的时候丢失控制文件和数据文件或者数据库故障的数据.控制文件丢失或者数据库的本来数据.控制文件丢失有备份文件,用备份文件恢复本文的环境变量ORACLE_BASE=/oo/oracleORACLE_HOME=/oo/oracle/11g 1.数据库启动报错数据库启动时报错: 报错1: SQL> startup ORA-01261: Parameter db_recovery_file_

谁说NTFS不支持UEFI启动的?启动U盘放不了超过4G的文件怎么办?Server2016 Win10 U盘UEFI启动制作方法

大家都知道,我们平时做启动盘,用得最多的就是UltraISO(软碟通)这个工具了.用它我们可以很简单快速的把一个空白的普通U盘制作成一个PE启动U盘或系统U盘,然后用它来安装系统非常的方便,受到了广大用户的喜爱. Fat32不支持4G以上文件 但是用它制作的启动盘都是Fat32格式的,而我们都知道Fat32格式是不支持4G以上的文件的,现在我们使用的64位win10系统就超过了4G,还有合集版等系统也是超过4G的.如果我们要使用安装这些系统怎么办呢? 今天,我们教大家另外一种制作方法,只需换一个

关于一次oracle sqlplus可登陆,但监听起不来的解决。由于listener.log文件超过4G

1.在oracle服务器上cmd 执行 lsnrctl 执行start 过了好久,提示监听程序已经启动. 再执行status 过来好久,才提示命令执行成功. 最好找到原因是因为C:\Oracle\diag\tnslsnr\hwh-PC\listener\trace 目录下的listener.log文件超过4G 导致的. 果断把监听日志停止掉 lsnrctl set log_status off;