Script backup mongoDB and source web trên Server
Hôm nay mình xin giới thiệu một cách để thực hiện chạy tự động backup dữ liệu(MongoDB và source Web)
Hoàn cảnh như sau: có 2 server
A: 192.168.0.1 chứa source web, kết nối database với server B. Đây là server sẽ chạy crontab.
B: 192.168.0.2 là server MongoDB
Lưu ý: việc chứng thực để 2 server có thể kết nối với nhau các bạn tự thực hiện nhá.
Thực hiện:
1. Khai báo các thông số ban đầu:
# Tên Database DB_NAME="backup_production" # Thư mục source web WEB_DIR="/var/www/html/production/web" # IP của server B server database HOST="192.168.0.2" # Lấy thời gian TIMESTAMP=`date +%Y%m%d` # Kiểu backup ở đây là backup hàng ngày TYPE="daily" # Thời gian bắt đầu script chạy TIME_START=`date +"%T"` echo "START: "$TIME_START # Thư mục chứa file sau khi backup BACKUP_DIR="/var/www/html/backup" # Thư mục chứa file backup của Source WEB BACKUP_WEB_DIR="$BACKUP_DIR/WEB" # Thư mục chứa file backup của DB BACKUP_DB_DIR="$BACKUP_DIR/DB" # Thư mục chứa file tmp BACKUP_TMP_DIR="$BACKUP_DIR/TMP" # Tên file sau khi backup của Source WEB BACKUP_WEB_NAME="web_backup_"$TIMESTAMP"_"$TYPE".tar" # Tên file sau khi backup của DB BACKUP_DB_NAME="DB_backup_"$TIMESTAMP"_"$TYPE".tar" # Tên file log cho Source WEB WEB_LOG_NAME=$BACKUP_WEB_DIR"/web_output.log" # Tên file log cho DB DB_LOG_NAME=$BACKUP_DB_DIR"/db_output.log"
Đoạn trên mình đều có ghi chú thích hết rồi, về tên file backup mình cho định dạng là .tar, nghĩa là mình sẽ nén các file lại thành định dạng .tar nên server phải cài đặt tar nhá.
2. Tạo các thư mục:
mkdir -p $BACKUP_DIR mkdir -p $BACKUP_WEB_DIR mkdir -p $BACKUP_DB_DIR mkdir -p $BACKUP_TMP_DIR
3. Phân quyền các thư mục: mình phân quyền cho 777 luôn vì sau khi bakup xong mình sẽ xoá hết không để lại.
chmod -R 777 $BACKUP_DIR chmod -R 777 $BACKUP_WEB_DIR chmod -R 777 $BACKUP_DB_DIR chmod -R 777 $BACKUP_TMP_DIR
4. Backup Source WEB
4-1. Xoá file cũ: có thể bỏ qua bước này nếu không muốn xoá đi file backup cũ.
find $BACKUP_WEB_DIR -type f -name "*_"$TYPE"*" -delete >> $WEB_LOG_NAME 2>&1
Tìm trong thư mục (/var/www/html/backup/WEB/) có tên gần giống(type = daily) sẽ xoá và ghi vào log(web_output.log)
4-2. Nén source
cd $WEB_DIR && tar -cf "$BACKUP_TMP_DIR/$BACKUP_WEB_NAME" ./ --exclude="./application/logs" >> $WEB_LOG_NAME 2>&1 && cd $BACKUP_DIR
Di chuyển vào thư mục source web(/var/www/html/production/web) và tiến hành nén các thư mục và tập tin, với đường dẫn và tên file đã khai báo. Ở đây có đoạn –exclude=”./application/logs” nghĩa là bỏ ra thư mục application/logs không nén nó. Ghi vào file log(web_output.log), sau cùng là di chuyển ra lại thư mục backup.
Sau bước này thì sẽ xuất hiện một file có đuôi .tar ở thư mục /var/www/html/backup/TMP/web_backup_****.tar
5. Backup DB
5-1. Xoá file DB cũ: có thể bỏ qua nếu không muốn xoá
find $BACKUP_DB_DIR -type f -name "*_"$TYPE"*" -delete >> $DB_LOG_NAME 2>&1
5-2. Dump database ra thư mục
mongodump --host $HOST -d $DB_NAME -o "$BACKUP_TMP_DIR/$TYPE" >> $DB_LOG_NAME 2>&1
Đây là cú pháp để export database trong mongoDB các bạn tự tìm hiểu nha, đương nhiên phải phân quyền để có thể thực thi được trên các database này. Sau lệnh này sẽ có thư mục chứ toàn bộ dữ liệu của database trong (/var/www/html/backup/TMP/daily/)
5-3. Nén thư mục vừa tạo ra ở 5-1
tar -cvf "$BACKUP_TMP_DIR/$BACKUP_DB_NAME" -C "$BACKUP_TMP_DIR/$TYPE" . >> $DB_LOG_NAME 2>&1
Nén các file và thư mục trong bước 5-1 thành file DB_backup_***.tar trong thư mục (/var/www/html/backup/TMP/DB_backup_***.tar)
6. Copy file backup hoặc move cũng được.
cp "$BACKUP_TMP_DIR/$BACKUP_WEB_NAME" "$BACKUP_WEB_DIR/$BACKUP_WEB_NAME" >> $WEB_LOG_NAME 2>&1 cp "$BACKUP_TMP_DIR/$BACKUP_DB_NAME" "$BACKUP_DB_DIR/$BACKUP_DB_NAME" >> $DB_LOG_NAME 2>&1
7. Xoá thư mục tmp đi (/var/www/html/backup/TMP)
rm -rf $BACKUP_TMP_DIR
Vậy là xong. Tổng hợp lại như sau:
# 1. Define # Tên Database DB_NAME="backup_production" # Thư mục source web WEB_DIR="/var/www/html/production/web" # IP của server B HOST="192.168.0.2" # Lấy thời gian TIMESTAMP=`date +%Y%m%d` # Kiểu backup ở đây là backup hàng ngày TYPE="daily" # Thời gian bắt đầu script chạy TIME_START=`date +"%T"` echo "START: "$TIME_START # Thư mục chứa file sau khi backup BACKUP_DIR="/var/www/html/backup" # Thư mục chứa file backup của Source WEB BACKUP_WEB_DIR="$BACKUP_DIR/WEB" # Thư mục chứa file backup của DB BACKUP_DB_DIR="$BACKUP_DIR/DB" # Thư mục chứa file tmp BACKUP_TMP_DIR="$BACKUP_DIR/TMP" # Tên file sau khi backup của Source WEB BACKUP_WEB_NAME="web_backup_"$TIMESTAMP"_"$TYPE".tar" # Tên file sau khi backup của DB BACKUP_DB_NAME="DB_backup_"$TIMESTAMP"_"$TYPE".tar" # Tên file log cho Source WEB WEB_LOG_NAME=$BACKUP_WEB_DIR"/web_output.log" # Tên file log cho DB DB_LOG_NAME=$BACKUP_DB_DIR"/db_output.log" # 2.Create directory mkdir -p $BACKUP_DIR mkdir -p $BACKUP_WEB_DIR mkdir -p $BACKUP_DB_DIR mkdir -p $BACKUP_TMP_DIR # 3.Chmod directory for write chmod -R 777 $BACKUP_DIR chmod -R 777 $BACKUP_WEB_DIR chmod -R 777 $BACKUP_DB_DIR chmod -R 777 $BACKUP_TMP_DIR # Ghi log echo $TIMESTAMP"-DAILY:" >> $WEB_LOG_NAME 2>&1 echo $TIMESTAMP"-DAILY:" >> $DB_LOG_NAME 2>&1 # 4.Backup source # 4.1.Remove old source find $BACKUP_WEB_DIR -type f -name "*_"$TYPE"*" -delete >> $WEB_LOG_NAME 2>&1 # 4.2.Tar new source cd $WEB_DIR && tar -cf "$BACKUP_TMP_DIR/$BACKUP_WEB_NAME" ./ --exclude="./application/logs" >> $WEB_LOG_NAME 2>&1 && cd $BACKUP_DIR # 5.Backup DB # 5.1.Remove old db find $BACKUP_DB_DIR -type f -name "*_"$TYPE"*" -delete >> $DB_LOG_NAME 2>&1 # 5.2.Dump database mongodump --host $HOST -d $DB_NAME -o "$BACKUP_TMP_DIR/$TYPE" >> $DB_LOG_NAME 2>&1 # 5.3.Tar new db tar -cvf "$BACKUP_TMP_DIR/$BACKUP_DB_NAME" -C "$BACKUP_TMP_DIR/$TYPE" . >> $DB_LOG_NAME 2>&1 # 6.Copy Backup file cp "$BACKUP_TMP_DIR/$BACKUP_WEB_NAME" "$BACKUP_WEB_DIR/$BACKUP_WEB_NAME" >> $WEB_LOG_NAME 2>&1 cp "$BACKUP_TMP_DIR/$BACKUP_DB_NAME" "$BACKUP_DB_DIR/$BACKUP_DB_NAME" >> $DB_LOG_NAME 2>&1 # 7.Delete TMP directory rm -rf $BACKUP_TMP_DIR TIME_END=`date +"%T"`
Việc tiếp theo thì tạo script với nội dung vừa làm xong rồi cho nó chạy crontab thôi, cái này thì mình cho nó chạy 1 ngày 1 lần vào buổi tối chẳng hạn.
0 2 * * * sh /root/shell/backup_daily.sh
Phần này xin hết ở đây, mong là có thể giúp được ai cần sử dụng.
[thongbao]
- Nếu có thắc mắc gì các bạn để lại comment bên dưới mình sẽ trả lời sớm nhất có thể.
- Cảm ơn các bạn đã đọc.
[/thongbao]