CHIA SẺ:

Hôm trước mình có chia sẻ một script giúp tự động backup toàn bộ website WordPress hoạt động trên server cài đặt HocVPS Script. Tuy nhiên, hôm nay mình sẽ giới thiệu một bash script khác tốt hơn, backup toàn bộ VPS kèm theo hướng dẫn tạo cronjob tự động chạy hàng ngày luôn.

Đoạn script này tự động backup toàn bộ dữ liệu trên server, bao gồm:

  1. Toàn bộ database MySQL, mỗi database một file .SQL
  2. Toàn bộ code trong thư mục public_html của domain, có dạng /home/domain.com/public_html/
  3. Toàn bộ cấu hình Nginx trong thư mục /etc/nginx/conf.d/

Tất cả dữ liệu sẽ được nén lại thành một file .ZIP và để ở thư mục /root/backup/, đồng thời tự động xóa những file backup cũ, chỉ giữ lại những file trong vòng 14 ngày trở lại.

Như vậy, bạn hoàn toàn có thể sử dụng script này để di chuyển VPS, hoặc khôi phục bất kỳ phần dữ liệu nào đó. Script mình viết tương thích với cấu trúc thư mục do HocVPS Script quản lý, tuy nhiên bạn cũng có thể chỉnh sửa lại để phù hợp với bất kỳ loại server khác cũng được.

Hiện tại, mình đang sử dụng script này để sao lưu dữ liệu hàng ngày và upload lên Google Drive với Rclone.

Hướng dẫn tự động sao lưu toàn bộ VPS

1. Tạo bash script backup

– Tạo file backup.sh ở thư mục /root/

nano /root/backup.sh

Tham khảo thêm hướng dẫn sử dụng nano nếu chưa biết dùng.

– Copy toàn bộ nội dung script bên dưới rồi paste vào:

# HocVPS Script Plugin - Backup Server

#!/bin/bash

. /etc/hocvps/scripts.conf

SERVER_NAME=VPS

TIMESTAMP=$(date +"%Y-%m-%d_%H-%M")
BACKUP_DIR="/root/backup/$TIMESTAMP"
MYSQL_USER="root"
MYSQL=/usr/bin/mysql
MYSQL_PASSWORD=$mariadbpass
MYSQLDUMP=/usr/bin/mysqldump
SECONDS=0

mkdir -p "$BACKUP_DIR/mysql"

echo "Starting Backup Database";
databases=`$MYSQL --user=$MYSQL_USER -p$MYSQL_PASSWORD -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema|mysql)"`

for db in $databases; do
	$MYSQLDUMP --force --opt --user=$MYSQL_USER -p$MYSQL_PASSWORD --databases $db | gzip > "$BACKUP_DIR/mysql/$db.gz"
done
echo "Finished";
echo '';

echo "Starting Backup Website";
#Loop through /home directory
for D in /home/*; do
	if [ -d "${D}" ]; then #If a directory
		domain=${D##*/} # Domain name
		echo "- "$domain;
		zip -r $BACKUP_DIR/$domain.zip /home/$domain/public_html/ -q -x /home/$domain/public_html/wp-content/cache/**\* #Exclude cache
	fi
done
echo "Finished";
echo '';

echo "Starting Backup Nginx Configuration";
cp -r /etc/nginx/conf.d/ $BACKUP_DIR/nginx/
echo "Finished";
echo '';

echo "Starting Compress Files";
zip -r /root/backup/$SERVER_NAME-$TIMESTAMP.zip $BACKUP_DIR -q
rm -rf $BACKUP_DIR
size=$(ls -lah /root/backup/$SERVER_NAME-$TIMESTAMP.zip | awk '{ print $5}')
echo "Finished";
echo '';

#Remove older backups (14 days)
find /root/backup/ -mindepth 1 -mtime +14 -delete

duration=$SECONDS
echo "Total $size, $(($duration / 60)) minutes and $(($duration % 60)) seconds elapsed."

Giải thích thêm:

  • Tên file backup được tự động đặt theo ngày giờ hiện tại.
  • MYSQL_USER mặc định là root, password được lấy trong file cấu hình /etc/hocvps/scripts.conf.

– Nhấn Ctrl+O, Enter để lưu và Ctrl+X để thoát.

– Phân quyền cho script

chmod +x /root/backup.sh

– Vậy là xong rồi đó, giờ bạn có thể test lại bằng cách chạy lệnh /root/backup.sh

Xong, kiểm tra trong thư mục /root/backup/ có file backup .ZIP chưa nhé.

2. Tạo cronjob tự động backup hàng ngày

Giờ mình sẽ cho script tự động chạy lúc 2h00 sáng.

EDITOR=nano crontab -e

Dán nội dung sau vào cửa sổ Terminal

0 2 * * * /root/backup.sh > /dev/null 2>&1

Nhấn Ctrl+O, Enter để lưu và Ctrl+X để thoát

Vậy là xong, cứ 2h sáng hàng ngày script sẽ tự động chạy, backup toàn bộ dữ liệu của VPS.

Trong bài tiếp theo, mình sẽ hướng dẫn các bạn cách tự động upload file backup này lên Google Drive để tiết kiệm dung lượng cho VPS. Nhớ đón đọc nhé.

42 Comments

  1. Joshua Pham 6

    Luân ơi cho mình hỏi mình đang xài VPS của vultr và sử dụng Sentora để quản lý VPS. Không biết có dùng cách này để back up VPS được không?

    1. Luân Trần Admin

      Dùng được nhé, nhưng bạn phải tự điều chỉnh lại password root MySQL, đường dẫn chứa code, đường dẫn cấu hình Apache… chứ không dùng thẳng được.

        1. Luân Trần Admin

          Vụ này bạn tự tìm hiểu thôi, mình comment rất kỹ nội dung script backup rồi.

  2. Hanh Pham 28

    VPS mình dung lượng 20G.
    Mình dùng hết 15G rồi còn free có 5G thì ko thể backup được toàn bộ website trên VPS dùng Script này được đúng ko Luân?

    1. Luân Trần Admin

      Tùy xem thư mục dữ liệu public_html của bạn có nhiều không?
      Sử dụng lệnh du -sh /home/domain.com/public_html/

      1. Hanh Pham 28

        Của mình nặng chủ yếu là do SQL thôi Luân.
        Chứ code thì nhẹ.
        Trong quá trình chạy script nếu full bộ nhớ thì sao hả Luân?

        1. Luân Trần Admin

          SQL thì đơn giản, toàn text thôi nên sau khi nén lại dung lượng không lớn đâu.
          Full bộ nhớ thì mình không rõ, chưa gặp nữa.

  3. Thế 2

    Hi a Luân,

    Cảm ơn bài hướng dẫn của anh, trước giờ em hay dùng BackWPup rồi up lên dropbox. Giờ dùng cách này sẽ ko cần phải cài plugin sẽ nhẹ site hơn. Em mới tìm hiểu VPS, giò muốn restore lại bản backup đó thì làm như thế nào anh? nếu có bài hướng dẫn restore lại ở 1 VPS khác thì hay quá, vì đôi khi mình chuyển VPS qua nhà cung cấp khác hoặc do IP của VPS đó trước đây đc cấp cho 1 ng khác, họ trỏ domain của họ về IP đó rồi, nhưng giờ không dùng domain đó nữa, như vậy IP đó đc 2 domain trỏ về (1 của mình và 1 của ng khác) nên sẽ gây ra duplicate content, ko tốt cho SEO. Em bị 1 trường hợp như vậy và muốn move hết content từ VPS cũ qua 1 VPS mới, nhưng chưa biết restore bản backup như thế nào. Mong anh có 1 bài hướng dẫn. Cảm ơn anh.

    1. Luân Trần Admin

      Khi restore thì bạn thao tác từng cái một thôi. Có file backup database .SQL thì import vào.
      File nén website thì up lên rồi giải nén hoặc giải nén rồi up lên server.

  4. Quách Chí Cường 2

    He anh Luân,

    Anh nên để phần lưu ý khi sử dụng script này là:
    – Không nên sử dụng khi server/vps của bạn có dung lượng mã nguồn quá lớn.

    Vì cơ chế ‘zip’ backup mã nguồn directory /home , là nén full và không có cơ chế level compress để giảm dung lượng xuống.

    Về phần backup mã nguồn, nếu user ko có nhu cầu download source backup thì nên sử dụng cơ chế ‘increamental backup’, bằng cách này sẽ tiết kiệm dung lượng ổ cứng khá nhiều khi sử dụng tính năng copy hard link inode các file qua các bản backup từng ngày.

    1. Luân Trần Admin

      Okie cảm ơn em. Code này chỉ là basic thôi, để mọi người dễ làm theo nhất. Còn advanced hơn thì phải chỉnh sửa nhiều.

  5. tran hung 17

    Mình có thể tạo backup các cài đặt spinxsearch, vardish, mount, nói chung là các cài đặt mà mình đã cài khi setup 1 vps mới không?

  6. tran hung 17

    Mình cũng làm các bước theo hướng dẫn, nhưng phải cài đặt thêm dos2unix
    bằng lệnh
    sudo yum install dos2unix
    rồi chạy lệnh
    dos2unix /root/backup.sh
    Thì mới có thể chạy /root/backup.sh được

  7. Tien 2

    Chào anh, em làm như trên và đang dùng hocvps nhưng lỗi như sau: anh hướng dẫn em chỉnh lại nha anh 😀

    Cảm ơn anh

    [root@sv1 ~]# /root/backup.sh
    : command not foundne 2:
    : command not foundne 4:
    : No such file or directorytc/hocvps/scripts.conf
    : command not foundne 6:
    : command not foundne 8:
    : command not foundne 16:
    : command not foundne 18:
    Starting Backup Database
    : command not foundne 19:
    : No such file or directoryusr/bin/mysql
    : command not foundne 21:
    ‘root/backup.sh: line 22: syntax error near unexpected token `do
    ‘root/backup.sh: line 22: `for db in $databases; do

        1. tran hung 17

          Bạn phải cài đặt thêm dos2unix bằng lệnh
          sudo yum install dos2unix
          rồi chạy lệnh
          dos2unix /root/backup.sh
          Thì mới có thể chạy /root/backup.sh được

    1. Minh Trym 1

      [root@sv1 ~]# /root/backup.sh
      – câu lệnh này chạy sai ngay từ đầu nè: phải là “./ /root/backup.sh” hoặc “sh /root.backup.sh”
      nhớ bỏ dấu ngoặc kép đi.

      – : No such file or directorytc/hocvps/scripts.conf
      Cái này là thông báo lỗi không tìm đc file này, mục đích truy xuất file này là để lấy đc password root của mysql, từ đấy mới chạy được đoạn script extract và zip DB

      – : No such file or directoryusr/bin/mysql
      Cái này xem lại dịch vụ mysql đã chạy chưa ?

  8. siel le 1

    web này Anh Luân Trần quản lý luôn ah, Mình cũng tập tành sử dụng VPS rất thích cách viết bài của anh đơn giản dể hiểu.

  9. Hai Nguyen ITmta 2

    Chào Luân !
    Luân cho mình hỏi , sắp tới mình sẽ quản lý 2 con Cloud-Vps 1 con 8G và 1 con 1G. Mục đích là chia làm nhiều host chưa các website. Vậy quản lý Cloud-Vps có điều gì khác biệt không ? Bạn có bài viết hướng dẫn cụ thể cho mình xin link với. Cảm ơn bạn 1

    1. Dinh Le Giang 47

      Hocscript không có chia host được đâu. Bạn có thể tham khảo Sentora và Vesta, 2 cái này free nhưng cũng hiệu quả lắm.

      Còn có nhiều tiền thì xài Direct Admin, chia vô đối đi

  10. tu 28

    khi có file Backup rồi, mình restore như nào vậy 🙂 mình tải file Backup về và giải nén trên máy thấy có :
    – 1 folder là mysql, trong này có các file nen duôi .gz và mình thử import và database nhưng không được,
    – 1 đống file zip theo tên miền chắc là file code của web đúng không. giả sử mình muốn
    Giả sử mình mua 1 VPS mới và cài lại từ đầu (cả VPS cũ và mới đều dùng script hocvps) thì mình restore như nào

    1. Luân Trần Admin

      File trong thư mục mysql là database, mỗi database một file nén .gz
      File zip theo tên miền là code, bạn giải nén rồi up lên server hoặc up nguyên file nén rồi giải nén trên server.

  11. Nam Luu 11

    Mình đang bị báo lỗi “ERROR 1018 (HY000) at line 1: Can’t read dir of ‘.’ (errno: 24)” ở file .sh trên.

    Cho mình xin cách khắc phục với

  12. Tuan Van Duong 1

    Hi bạn, script này dùng đc trong Windows Server không vậy? Mình muốn tạo script tương tự vậy nhưng dùng với IIS, ASP.Net projects và MS Sql Server. Mình search google thì người ta kêu dùng SQL Server Agent. Thanks.

  13. Fususu 13

    Em phải cài cái dos2unix mới chạy được lệnh /root/backup.sh
    Chạy xong thành công nó báo dung lượng file backup 3.5gb
    Kiểm tra trong serverinfo thì thấy mất dung lượng tầm 3.5gb thật.
    song ra thư mục root/backup/ thì chẳng thấy file nào cả.
    chỉ có mỗi thư mục rỗng 2017-01-09_15-50/mysql
    không hiểu nó lưu file ở đâu nhỉ các bác ^^!

    —–
    /root/backup.sh
    Starting Backup Database
    Finished

    Starting Backup Website
    – mrsusu.com
    Finished

    Starting Backup Nginx Configuration
    Finished

    Starting Compress Files
    Finished

    Total 3.5G, 3 minutes and 9 seconds elapsed.

    1. Fususu 13

      À mà em muốn khi backup thì exclude một vài thư mục không cần thiết cho file backup nó nhẹ hơn thì làm thế nào ạ?

      1. Việt Phương Moderator

        Database, Nginx thì toàn file rồi. Backup website có đoạn exclude cache đó
        Bạn thêm thư mục cần bỏ nhé: zip -r $BACKUP_DIR/$domain.zip /home/$domain/public_html/ -q -x /home/$domain/public_html/wp-content/cache/**\* #Exclude cache

    2. Việt Phương Moderator

      Tất cả dữ liệu sẽ được nén lại thành một file .ZIP và để ở thư mục /root/backup/, đồng thời tự động xóa những file backup cũ, chỉ giữ lại những file trong vòng 14 ngày trở lại.

    1. Việt Phương Moderator

      Bạn sửa crontab thành 0 2 * * 1 /root/backup.sh > /dev/null 2>&1 sẽ tự động backup vào thứ 2 hàng tuần

Comment của bạn

Your email address will not be published. Required fields are marked *