将文件 fileA.big (900mb) 从位置 B 复制到位置 C,如果在该 cp 操作期间,例如在该过程进行 35% 时,fileA.big 附加了新信息并从 900MB 增长到 930MB,会产生什么效果?
最终副本(即位于 C 位置的 fileA.big)的结果是什么?
如果复制到了70%左右,原文件更新了但这次截断到了400MB(即复制进度超出了截断点),最终复制的结果是什么?
指 ext3/ext4 文件系统上的 Linux 操作系统。没有卷影魔法等。只是普通的老cp。复制实时 CouchDB 文件进行备份激发了好奇心,但对一般场景而不是特定用例更感兴趣。
答案1
帕特里克的说法或多或少是正确的,但原因如下。在 UNIX 下复制文件的方式如下:
- 尝试从 读取一些(更多)字节
fileA
。 - 如果我们因为到达(或超过)文件末尾而无法获取字节,那么我们就完成了;辞职。
- 否则,将字节写入
fileB
并循环回到步骤 1。
知道了这一点,并且知道事情就这么简单,让我们看看一些极端情况。
一旦我们找到文件末尾,复制就完成了。假设我们的文件在复制过程中不断增长,但增长速度比复制时要慢。复制程序将继续超过原始文件大小,因为当它到达那里时,文件还有更多内容。但在某些时候,它赶上了文件的末尾,并且它知道它已经到了末尾,因为它无法读取更多字节现在。因此,即使文件即将进一步增长,它也会立即退出。
如果文件被截断,复制程序会说“哇,我已经超出了文件末尾!”然后退出。
如果文件的各个部分被数据库程序随机更新:-),那么您的副本将是旧数据和新数据的混合,因为数据并不是同时复制的。结果可能是一个损坏的副本,这就是为什么制作实时数据库的副本通常不是一个好主意。
(也就是说,我对 CouchDB 不熟悉,并且可以设计一个数据库来抵抗这种损坏。但最好绝对确定。)
答案2
如果fileA.big
在复制过程中增长,则副本将包含附加的数据。
如果文件被截断的时间短于副本当前所在的位置,则副本将在其所在位置中止,并且目标文件将包含截至其中止时所复制的内容。