Khi cần di chuyển thư mục chứa nhiều tệp (ví dụ: dữ liệu database) giữa các vị trí trên cùng máy chủ Linux, muốn đảm bảo toàn vẹn dữ liệu và giữ nguyên quyền sở hữu/permission/timestamp, có một thủ thuật "one-liner" cực kỳ hiệu quả dùng tar pipe.
Ví dụ thực tế
Di chuyển nội dung /var/lib/mysql → /opt/mysql:
# cd /var/lib/mysql
# tar cf - * | ( cd /opt/mysql; tar xfp - )
Giải thích cơ chế
cd /var/lib/mysql: Vào thư mục nguồn.tar cf - *: Tạo archive tar từ tất cả nội dung thư mục hiện tại (*), ghi ra stdout (-). Không ghi ra đĩa trung gian.|: Pipe (ống dẫn) stdout của lệnh trước thành stdin của lệnh sau.( cd /opt/mysql; tar xfp - ): Subshell – đổi thư mục đến đích, sau đó giải nén từ stdin (-).tar xfp:x(extract),f -(file từ stdin),p(preserve permissions – giữ quyền, owner, timestamp).
Ưu điểm so với cp -a hoặc rsync
- Atomic hơn cp: Đọc và ghi đồng thời qua pipe, giảm rủi ro hỏng dữ liệu nếu ổ cứng lỗi giữa chừng.
- Giữ toàn bộ metadata:
pflag bảo toàn permission, owner, group, mtime, symlink. - Không cần dung lượng đĩa tạm: Không tạo file nén trung gian.
- Hiệu quả trên cùng filesystem: Nhanh hơn rsync cho copy cục bộ lượng lớn tệp nhỏ.
Biến thể hữu ích
Thêm nén (gzip) – cho truyền qua mạng hoặc tiết kiệm I/O
# cd /source
# tar czf - * | ( cd /dest; tar xzf - )
Dùng rsync (linh hoạt hơn, có progress, resume)
# rsync -avh --progress /var/lib/mysql/ /opt/mysql/
-a(archive) =-rlptgoD(recursive, links, perms, times, group, owner, devices).-hhuman-readable,--progresshiển thị tiến độ.- Hỗ trợ resume nếu bị ngắt, copy qua SSH:
rsync -avz /src/ user@remote:/dest/.
Dùng cp -a (đơn giản, hiệu quả trên Linux hiện đại)
# cp -a /var/lib/mysql/. /opt/mysql/
Dấu chấm . sau thư mục nguồn đảm bảo copy nội dung chứ không copy chính thư mục mysql vào /opt/mysql/mysql.
Lưu ý quan trọng
- Chạy với quyền root (sudo) để bảo toàn owner/group của tệp hệ thống (như MySQL data).
- Đảm bảo thư mục đích đã tồn tại (
mkdir -p /opt/mysql). - Nếu thư mục nguồn đang được ghi bởi dịch vụ (MySQL đang chạy), hãy dừng dịch vụ trước hoặc dùng snapshot (LVM/ZFS/btrfs) để đảm bảo tính nhất quán.