คู่มือนี้จะแนะนำขั้นตอนการสร้างสคริปต์สำรองข้อมูลอัตโนมัติบน Linux (และระบบ Unix-like อื่นๆ) แบบเป็นขั้นตอน
"การเย็บผ้าตัดก่อนจะร้าว จะประหยัดการเย็บเก้าปลาย" สำนวนนี้ในโลกคอมพิวเตอร์เรียกว่า "การสำรองข้อมูล (Backup)"
เมื่อดูแลระบบ IT แบบ Production จำเป็นต้องรักษา Uptime ให้ใกล้เคียง 100% แม้จะมีหลายวิธีทำให้ระบบมั่นคง แต่ไม่มีระบบไหนทนทานต่อความล้มเหลวได้หมด ดังนั้นเราจึงต้องมี "แผน B" คือการสำรองข้อมูล
เซิร์ฟเวอร์ประกอบด้วย 3 ชั้นหลัก: ฮาร์ดแวร์, ระบบปฏิบัติการและแอปพลิเคชัน, และข้อมูล หากฮาร์ดแวร์เสีย สามารถเปลี่ยนเครื่องใหม่ได้ ติดตั้ง OS และแอปใหม่ก็ง่าย แต่ "ข้อมูลและการตั้งค่า" คือสิ่งที่เปลี่ยนใหม่ไม่ได้ จึงต้องสำรองข้อมูลเป็นประจำ และจัดเก็บให้ค้นหา/กู้คืนง่าย
สถานการณ์ตัวอย่าง
เซิร์ฟเวอร์รัน Apache, MySQL และมีข้อมูลสำคัญอยู่ที่ /home จะสำรอง:
- ฐานข้อมูล MySQL
- ไฟล์การตั้งค่า (
/etc) - Document Root ของ Apache (
/var/www/html) - ไฟล์แอปพลิเคชัน (
/home/calvin/application_files/) - Access Log ของ Apache เมื่อวานนี้
เตรียมโครงสร้างโฟลเดอร์สำรอง
สร้างโฟลเดอร์หลักที่ /opt/backup แบบ Year/Month/Day:
# mkdir -p /opt/backup/DATA/2008
# cd /opt/backup/DATA/2008
# mkdir 01 02 03 04 05 06 07 08 09 10 11 12
# cd /opt/backup/DATA/
# cp -r 2008 2009
# cd /opt/backup/
# cp -r DATA LOG
# chown -R calvin.calvin /opt/backup
หมายเหตุ: เปลี่ยน "calvin" เป็นชื่อผู้ใช้ของคุณ
สคริปต์สำรองข้อมูล (backup.sh)
#!/bin/bash
# SERVER DATA BACKUP V1.0
#########################
# BACKUP CONFIG
#########################
YEAR=`date +"%Y"`
MONTH=`date +"%m"`
DAY=`date +"%d"`
YESTERDAY=`date --date="yesterday" +%Y-%m-%d`
YESTERDAY_DATE=`date --date=yesterday +%d`
YESTERDAY_MONTH=`date --date=yesterday +%m`
YESTERDAY_YEAR=`date --date=yesterday +%Y`
TODAY=`date +%Y-%m-%d`
TODAY_DATE=`date +%d`
DATA_BACKUP_PARENT_DIR=/opt/backup/DATA/
LOG_BACKUP_PARENT_DIR=/opt/backup/LOG/
APACHE_DOCROOT=/var/www/html/
DB_IP="localhost"
DB_USER="calvin"
DB_PASS="calvin_password"
DB_NAME="clientlist"
APACHE_LOG_DIR="/var/log/httpd/"
APP_FILES="/home/calvin/application_files/"
CONFIG_DIR="/etc/"
EMAIL_ID="you@youremailid.com"
#####################################################
# DATA BACKUP
#####################################################
cd $DATA_BACKUP_PARENT_DIR/$YEAR/$MONTH
mkdir $DAY
cd $DAY
# Database backup
mysqldump -h ${DB_IP} -u ${DB_USER} -p${DB_PASS} ${DB_NAME} > ${DB_NAME}.db
tar -zcvf ${DB_NAME}.tar.gz ${DB_NAME}.db
rm -f ${DB_NAME}.db
# /etc backup
tar -zcf etc.tar.gz /etc
# Application backup
tar -zcf Apache_Doc_Root.tar.gz ${APACHE_DOCROOT}
tar -zcf App_Files.tar.gz ${APP_FILES}
#####################################################
# LOG BACKUP
#####################################################
cd $LOG_BACKUP_PARENT_DIR/$YESTERDAY_YEAR/$YESTERDAY_MONTH
mkdir $YESTERDAY_DATE
cd $YESTERDAY_DATE
# HTTPD Log Backup
for i in ${APACHE_LOG_DIR}/access_log.${YESTERDAY}*; do cp $i .; done
for i in access_log.${YESTERDAY}*; do gzip $i; done
#####################################################
# EMAIL NOTIFICATION
#####################################################
du -shc $DATA_BACKUP_PARENT_DIR/$YEAR/$MONTH/$DAY/* | mail -s "Backup for ${HOSTNAME}::DATA done :)" ${EMAIL_ID}
du -shc $LOG_BACKUP_PARENT_DIR/$YESTERDAY_YEAR/$YESTERDAY_MONTH/$YESTERDAY_DATE/* | mail -s "Backup for ${HOSTNAME}::LOG done :)" ${EMAIL_ID}
การใช้งาน
- บันทึกสคริปต์ไว้ที่
/home/calvin/scripts/backup.sh - ให้สิทธิ์รัน:
chmod +x /home/calvin/scripts/backup.sh - ทดสอบรัน:
/home/calvin/scripts/backup.sh - เพิ่มใน crontab ให้รันอัตโนมัติทุกวัน 04:00 น.:
# crontab -e 0 4 * * * /home/calvin/scripts/backup.sh > /dev/null
ตอนนี้เซิร์ฟเวอร์จะสำรองข้อมูลอัตโนมัติทุกวัน เวลา 04:00 น. ขั้นตอนต่อไปที่ดีคือการเข้ารหัสไฟล์สำรอง!