Backup Tools — tar, gzip และ rsync บน Linux

Backup คือสิ่งที่ทุก System Admin รู้ว่าต้องทำ แต่มักทำช้าหรือไม่สม่ำเสมอจนกว่าจะเกิดปัญหาขึ้น Linux มีเครื่องมือ Backup ที่ทรงพลังในตัวเองโดยไม่ต้องติดตั้งเพิ่ม ได้แก่ tar สำหรับรวมและบีบอัดไฟล์, gzip/bzip2/xz สำหรับ Compression และ rsync สำหรับการ Sync ไฟล์แบบ Incremental ที่ส่งเฉพาะข้อมูลที่เปลี่ยนแปลง

บทความนี้อธิบายการใช้งาน tar, gzip, และ rsync สำหรับ Backup บน Linux ตั้งแต่การสร้าง Archive, การบีบอัดและแตกไฟล์, การ Sync ไดเรกทอรี รวมถึง Pattern การใช้งานจริงสำหรับ Backup Database, Config Files, และ Web Application

tar — สร้างและจัดการ Archive

tar (Tape Archive) เป็นเครื่องมือหลักสำหรับรวมหลายไฟล์/ไดเรกทอรีเป็น Archive ไฟล์เดียว พร้อม Option บีบอัดในตัวเอง

# Syntax พื้นฐาน: tar [options] [archive-file] [files/dirs]
# Options หลัก:
# -c  = Create archive
# -x  = Extract archive
# -t  = List archive contents
# -f  = ระบุชื่อไฟล์ archive
# -v  = Verbose (แสดงไฟล์ที่ประมวลผล)
# -z  = ใช้ gzip compression (.tar.gz)
# -j  = ใช้ bzip2 compression (.tar.bz2)
# -J  = ใช้ xz compression (.tar.xz)
# -p  = Preserve permissions
# -P  = Preserve absolute paths (ระวัง!)

# สร้าง tar.gz archive
tar -czf backup.tar.gz /path/to/directory

# สร้าง tar.bz2 archive (บีบอัดได้มากกว่า ช้ากว่า)
tar -cjf backup.tar.bz2 /path/to/directory

# สร้าง tar.xz archive (บีบอัดได้มากที่สุด ช้าที่สุด)
tar -cJf backup.tar.xz /path/to/directory

# ดู Content ใน Archive โดยไม่ Extract
tar -tzf backup.tar.gz

# Extract Archive
tar -xzf backup.tar.gz

# Extract ไปยัง Directory เฉพาะ
tar -xzf backup.tar.gz -C /path/to/destination

# Extract เฉพาะบางไฟล์
tar -xzf backup.tar.gz path/to/specific/file

tar กับ Exclude และ Include

# Backup /var/www โดยไม่รวม Log และ Cache
tar -czf web-backup.tar.gz \
  --exclude="/var/www/html/logs" \
  --exclude="/var/www/html/cache" \
  --exclude="*.log" \
  /var/www/html

# Backup เฉพาะไฟล์ที่ใหม่กว่า 7 วัน
tar -czf recent-backup.tar.gz \
  --newer-mtime="7 days ago" \
  /var/www/html

# Backup หลาย Directory พร้อมกัน
tar -czf full-backup.tar.gz \
  /etc \
  /var/www \
  /home \
  --exclude="/proc" \
  --exclude="/sys"

# เพิ่ม Timestamp ในชื่อไฟล์
DATE=$(date +%Y%m%d_%H%M%S)
tar -czf "backup_${DATE}.tar.gz" /path/to/backup

gzip, bzip2, xz — เลือก Compression ให้เหมาะสม

# เปรียบเทียบ Compression Tools:
# gzip  — เร็วที่สุด, บีบอัดพอดี — ใช้บ่อยที่สุด (.gz)
# bzip2 — ช้ากว่า gzip ~2-3x, บีบอัดดีกว่าเล็กน้อย (.bz2)
# xz    — ช้ามาก, บีบอัดได้ดีที่สุด — ใช้กับ Distribution Archive (.xz)
# zstd  — เร็วกว่า gzip, บีบอัดเกือบเท่า xz — ใช้ใน Modern Systems

# gzip: บีบอัดและแตกไฟล์
gzip large-file.log          # บีบอัด → large-file.log.gz
gzip -d large-file.log.gz    # แตกไฟล์ (ลบต้นฉบับ)
gunzip large-file.log.gz     # เหมือน gzip -d
zcat large-file.log.gz       # อ่าน gzip ไม่ต้องแตก

# gzip พร้อม Level (1=เร็ว, 9=บีบอัดมาก)
gzip -9 large-file.log       # บีบอัดสูงสุด

# bzip2
bzip2 large-file.log
bunzip2 large-file.log.bz2
bzcat large-file.log.bz2

# xz
xz large-file.log
unxz large-file.log.xz
xzcat large-file.log.xz

# zstd (ติดตั้งเพิ่มเติม)
zstd large-file.log          # → large-file.log.zst
zstd -d large-file.log.zst

rsync — Sync ไฟล์แบบ Incremental

rsync เป็นเครื่องมือ Sync ไฟล์ที่ส่งเฉพาะส่วนที่เปลี่ยนแปลง (Delta Sync) ทำให้ Backup ครั้งถัดไปเร็วกว่า tar มาก เหมาะสำหรับ Incremental Backup และ Mirror ข้อมูลระหว่าง Server

# Syntax: rsync [options] source destination

# Options หลัก:
# -a  = Archive mode (รวม -r -l -p -t -g -o -D) — ใช้เกือบทุกครั้ง
# -v  = Verbose
# -z  = บีบอัดระหว่าง Transfer
# -P  = แสดง Progress + Resume partial transfer
# --delete = ลบไฟล์ปลายทางที่ไม่มีใน Source แล้ว
# -n / --dry-run = ทดสอบโดยไม่ Copy จริง
# -e "ssh" = ใช้ SSH เป็น Transport

# Sync ภายในเครื่อง (Local)
rsync -av /source/dir/ /destination/dir/
# Note: Trailing slash หลัง source = copy เนื้อหาใน dir (ไม่รวม dir เอง)
# ไม่มี Trailing slash = copy dir ทั้ง dir

# ตัวอย่าง:
rsync -av /var/www/html/ /backup/web/     # copy เนื้อหา html/ ไป backup/web/
rsync -av /var/www/html  /backup/web/     # copy dir html ไปเป็น backup/web/html/

# Sync แบบ Mirror (ลบไฟล์ที่ไม่มีใน Source ด้วย)
rsync -av --delete /var/www/html/ /backup/web/

# ทดสอบก่อน Sync จริง
rsync -avn --delete /var/www/html/ /backup/web/

rsync ผ่าน SSH (Remote Backup)

# Backup ไปยัง Remote Server
rsync -avz -e "ssh -p 22" /var/www/html/ user@backup-server:/backup/web/

# ใช้ SSH Key แทน Password
rsync -avz -e "ssh -i ~/.ssh/backup_key" /var/www/html/ user@backup-server:/backup/web/

# Backup จาก Remote มาเก็บ Local
rsync -avz user@web-server:/var/www/html/ /local/backup/web/

# Sync พร้อม Progress และ Exclude
rsync -avzP \
  --exclude="*.log" \
  --exclude="cache/" \
  --exclude="tmp/" \
  /var/www/html/ \
  user@backup-server:/backup/web/

Backup Database ด้วย mysqldump + tar

# Backup MySQL/MariaDB Database
DATE=$(date +%Y%m%d_%H%M%S)
DB_NAME="myapp"
DB_USER="root"
BACKUP_DIR="/backup/db"

mkdir -p "$BACKUP_DIR"

# Dump และบีบอัดในคำสั่งเดียว
mysqldump -u "$DB_USER" -p"$DB_PASS" \
  --single-transaction \
  --routines \
  --triggers \
  "$DB_NAME" | gzip > "${BACKUP_DIR}/${DB_NAME}_${DATE}.sql.gz"

# Backup ทุก Database พร้อมกัน
mysqldump -u root -p"$DB_PASS" \
  --all-databases \
  --single-transaction | gzip > "${BACKUP_DIR}/all_databases_${DATE}.sql.gz"

# Restore จาก Backup
gunzip < backup.sql.gz | mysql -u root -p"$DB_PASS" "$DB_NAME"

Backup Script สำหรับ Web Application

#!/bin/bash
# /usr/local/bin/webapp-backup.sh
# Backup Web Application: Files + Database

BACKUP_BASE="/backup/webapp"
WEB_DIR="/var/www/html"
DB_NAME="myapp"
DB_USER="root"
DB_PASS="${DB_PASSWORD}"   # อ่านจาก Environment Variable
RETENTION_DAYS=7
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="${BACKUP_BASE}/${DATE}"

mkdir -p "$BACKUP_DIR"

# 1. Backup Web Files
echo "[$(date)] Backing up web files..."
tar -czf "${BACKUP_DIR}/webfiles.tar.gz" \
  --exclude="${WEB_DIR}/cache" \
  --exclude="${WEB_DIR}/logs" \
  "$WEB_DIR"

# 2. Backup Database
echo "[$(date)] Backing up database..."
mysqldump -u "$DB_USER" -p"$DB_PASS" \
  --single-transaction \
  "$DB_NAME" | gzip > "${BACKUP_DIR}/database.sql.gz"

# 3. ลบ Backup เก่ากว่า RETENTION_DAYS วัน
find "$BACKUP_BASE" -maxdepth 1 -type d -mtime +"$RETENTION_DAYS" -exec rm -rf {} \;

echo "[$(date)] Backup complete: $BACKUP_DIR"
du -sh "$BACKUP_DIR"

ตรวจสอบความสมบูรณ์ของ Backup

# ทดสอบว่า tar.gz ไม่เสียหาย
tar -tzf backup.tar.gz > /dev/null 2>&1 && echo "OK" || echo "CORRUPTED"

# ตรวจสอบขนาดไฟล์ Backup
ls -lh /backup/*.tar.gz

# MD5 Checksum เพื่อยืนยันความสมบูรณ์
md5sum backup.tar.gz > backup.tar.gz.md5
# ตรวจสอบ
md5sum -c backup.tar.gz.md5

# ทดสอบ Extract บาง File จาก Backup
tar -tzf backup.tar.gz | head -20   # ดูรายการ
tar -xzf backup.tar.gz -C /tmp/test-restore  # แตกไปยัง tmp

# ตรวจสอบว่า MySQL dump อ่านได้
zcat database.sql.gz | head -20

rsync สำหรับ Incremental Backup แบบ Snapshot

#!/bin/bash
# Incremental Backup ด้วย rsync + Hard Link (Snapshot Style)
# คล้าย Time Machine บน macOS — ประหยัด Space มาก

BACKUP_ROOT="/backup/snapshots"
SOURCE="/var/www/html"
DATE=$(date +%Y%m%d_%H%M%S)
LATEST="${BACKUP_ROOT}/latest"
DEST="${BACKUP_ROOT}/${DATE}"

mkdir -p "$DEST"

# rsync พร้อม Hard Link จาก Snapshot ล่าสุด
# --link-dest = ใช้ Hard Link กับไฟล์ที่ไม่เปลี่ยนแปลง (ไม่ใช้ Space เพิ่ม)
rsync -av --delete \
  --link-dest="$LATEST" \
  "$SOURCE/" \
  "$DEST/"

# อัพเดต symlink ชี้ไปที่ Snapshot ล่าสุด
rm -f "$LATEST"
ln -s "$DEST" "$LATEST"

echo "Snapshot created: $DEST"

# ลบ Snapshot เก่ากว่า 30 วัน
find "$BACKUP_ROOT" -maxdepth 1 -type d -mtime +30 -exec rm -rf {} \;

สรุป

tar -czf เป็น Pattern ที่ใช้บ่อยที่สุดสำหรับสร้าง Backup Archive และ --exclude ช่วยกันไฟล์ที่ไม่ต้องการออก rsync เหมาะกับ Incremental Backup เพราะส่งเฉพาะส่วนที่เปลี่ยนแปลง ทำให้ครั้งถัดไปเร็วกว่ามาก การใช้ --link-dest กับ rsync ทำ Snapshot Backup ที่ประหยัด Disk Space เพราะไฟล์ที่ไม่เปลี่ยนแปลงจะ Share กันผ่าน Hard Link สิ่งสำคัญที่สุดของ Backup คือการทดสอบ Restore สม่ำเสมอ ไม่ใช่แค่ทำ Backup แล้วเก็บทิ้งไว้

แนะนำบริการ DE

การตั้งค่า Backup Scripts และ Cron Jobs บน Server ต้องการสิทธิ์ Root และ Storage ที่เพียงพอ Cloud VPS ของ DE ให้ Root Access เต็มรูปแบบ สามารถตั้งค่า Backup ด้วย tar, rsync, หรือ Tool อื่น ๆ ได้อย่างอิสระ รองรับการ Mount Storage Volume เพิ่มเติมสำหรับเก็บ Backup โดยเฉพาะ

หากต้องการโฮสต์เว็บไซต์โดยมีระบบ Backup อัตโนมัติ Cloud Hosting ของ DE มีระบบ Backup รายวันอัตโนมัติพร้อม Restore ผ่าน Control Panel โดยไม่ต้องตั้งค่า Script เพิ่มเติม