Patrick có ít nhiều đúng, nhưng đây là lý do tại sao. Cách bạn sao chép một tệp trong UNIX hoạt động như thế này:
- Cố gắng đọc một số (nhiều) byte từ
fileA
.
- Nếu chúng tôi không nhận được byte bởi vì chúng tôi ở (hoặc quá khứ) ở cuối tệp, chúng tôi đã hoàn tất; bỏ thuốc lá
- Mặt khác, ghi các byte vào
fileB
và lặp lại bước 1.
Biết điều đó và biết nó đơn giản như thế, cho phép chúng ta thấy một số trường hợp góc.
Ngay sau khi chúng tôi tìm thấy phần cuối của tệp, bản sao đã được thực hiện. Vì vậy, giả sử tập tin của chúng tôi đang phát triển trong quá trình sao chép, nhưng đang phát triển chậm hơn so với việc chúng tôi sao chép nó. Chương trình sao chép sẽ tiếp tục vượt qua kích thước tệp gốc, bởi vì tại thời điểm nó đến đó, có nhiều tệp hơn. Nhưng tại một số điểm, nó bắt kịp với phần cuối của tệp và nó biết nó ở cuối bởi vì nó không thể đọc thêm bất kỳ byte nào ngay bây giờ . Vì vậy, nó thoát ngay tại đó, ngay cả khi tập tin sắp phát triển hơn nữa.
Nếu tệp bị cắt ngắn, chương trình sao chép sẽ ghi "Whoa, tôi đã qua cuối tệp!" và bỏ cuộc.
Và nếu các phần của tệp được cập nhật ngẫu nhiên bởi, giả sử, một chương trình cơ sở dữ liệu :-), thì bản sao của bạn sẽ là một sự pha trộn của dữ liệu cũ và mới, bởi vì dữ liệu không phải là tất cả được sao chép cùng một lúc. Kết quả có thể sẽ là một bản sao bị hỏng, đó là lý do tại sao nói chung không phải là một ý tưởng tốt để tạo các bản sao của cơ sở dữ liệu trực tiếp.
(Điều đó nói rằng, tôi không quen thuộc với CouchDB và có thể thiết kế cơ sở dữ liệu để chống lại loại tham nhũng này. Nhưng tốt nhất là phải chắc chắn tuyệt đối.)