Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> สมาร์ทโฟน >> Linux

สร้างระบบสำรองข้อมูลอัตโนมัติบน Linux/Unix ด้วย Shell Script

คู่มือนี้จะแนะนำขั้นตอนการสร้างสคริปต์สำรองข้อมูลอัตโนมัติบน 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}

การใช้งาน

  1. บันทึกสคริปต์ไว้ที่ /home/calvin/scripts/backup.sh
  2. ให้สิทธิ์รัน: chmod +x /home/calvin/scripts/backup.sh
  3. ทดสอบรัน: /home/calvin/scripts/backup.sh
  4. เพิ่มใน crontab ให้รันอัตโนมัติทุกวัน 04:00 น.:
    # crontab -e
    0 4 * * * /home/calvin/scripts/backup.sh > /dev/null

ตอนนี้เซิร์ฟเวอร์จะสำรองข้อมูลอัตโนมัติทุกวัน เวลา 04:00 น. ขั้นตอนต่อไปที่ดีคือการเข้ารหัสไฟล์สำรอง!