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é.

50 Comments

  1. Joshua Pham 6 comment

    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 31 comment

    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 31 comment

        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 comment

    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 comment

    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 comment

    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 comment

    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 comment

    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 comment

          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 comment

      [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 comment

    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 comment

    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 48 comment

      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 comment

    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 comment

    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 comment

    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 comment

    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 comment

      À 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

  14. Vannguyen 24 comment

    Mình tìm đọc nhiều bài về vấn đề này hôm nay và nghiên cứu bài của bạn thì thấy để back up dữ liệu web sau khi cài những thứ kia, hàng ngày vẫn phải đăng nhập vào ssh để back up thủ công hả bạn, nếu mình ko làm bước tự động phía dưới

    Vậy còn cái mục sao lưu trong admin wp thì khi nào cần xài nó, tại sao lại ko xài vậy

    1. Việt Phương Moderator

      _Nếu bạn không làm tự động cronjob thì bạn làm thủ công hàng ngày nhé, lênh /root/backup.sh
      _Backup cả thư mục web, bao gồm cả wp-admin rồi mà bạn. Trong bài viết có đề cập sao lưu gì trong admin wp đâu?

  15. Vannguyen 24 comment

    Tại mình ngại đăng nhập ssh vì lâu và tốn thời gian. Trong khi ở chỗ dashroad của wp có mục xuất nhập dữ liệu, nếu chỉ sao lưu bằng mục đó có ổn không?

    Câu hỏi nữa, tại sao ko lưu bản back up vào máy tính vậy, mình muốn lưu vào máy tính, tuần chỉ sao 1 lần hoặc khi đăng bài mới. Vậy thì xem bài nào.

    Những gì bạn hướng dẫn ở trên là làm trên ssh phải ko hay trên ftp bạn ko nói rõ

    1. Việt Phương Moderator

      _Bạn không đăng nhập thì bạn thiết lập tự động như hướng dẫn thôi, chứ không có cách nào vừa không cài tự động lại tự động backup hàng ngày cả.
      Ngoài ra, bản thân WP cũng có các plugin hỗ trợ như Duplicator. Tuy vậy, việc backup thường xuyên bằng plugin gây tốn tài nguyên hơn việc backup ngay trên server. Cũng như script hoạt động để cho mọi website, không riêng gì mã nguồn WP.
      _Các dòng lệnh chạy ở SSH nhé bạn. FTP không chạy được dòng lệnh mà dùng quản lý file thôi. Bạn có thể dùng sFTP hoặc FTP để down về hoặc tải lên Drive như hướng dẫn https://hocvps.com/rclone/

      1. Vannguyen 24 comment

        Phiền bạn cho mình hỏi thêm câu dài dòng nữa, mình mua thêm 1 VPS Vultr theo hướng dẫn của web bạn rồi chạy hocvps, trên vultr có mục bỏ thêm 1$ thì nó back up tự động cho (nếu xài cái này thì không cần làm các bước như của bạn trong bài này phải không)

        Và các file back up tự động của vultr nó lưu ở đâu, mình cứ để ở đó hay phải copy đưa về máy tính? Có khi nào vps nó bay hết sạch mà không thể vào lấy được các file back up đó không? Theo mình hiểu thì khi backup có 2 phần, 1 là nó sao code (giao diện và mọi thứ khung cố định) + bài viết, ảnh, comment (phần động). Cái backup tự động của vultr nó sao cả hai cái hay chỉ cái phần data động thôi vậy bạn?

        1. Việt Phương Moderator

          Backup của Vultr là backup cả VPS bạn nhé. Còn các script backup website, database thôi. Giống như bạn lưu cả Windows hay chỉ lưu phần mềm trong Windows vậy.
          Còn website gồm 2 phần, data và database thôi. Data như ảnh, plugin các thứ thì nằm hết trong thư mục web rồi. Các mục, nội dung, cmt thì trong database rồi

          1. Vannguyen 24 comment

            Vậy 1 cái VPS của mình để back up tự động 1$/tháng thì vào đâu để lưu cái file đó lại hả bạn?

            Còn 1 cái VPS khác thì mình muốn tự back up. Từ trưa đến giờ đăng nhập vào ssh không nổi nên mình không muốn back up tí nào, xài Puty không được, sang Bit cũng ko xong. Nó cứ báo lỗi không truy cập được mà ko rõ vì sao

          2. Việt Phương Moderator

            _Lưu ngay trên hệ thống của Vultr bạn nhé. Nó như bản ghost thôi. Và hình như cũng k có down về mà lưu trên đó, restore lại cũng trên hệ thống Vultr
            _Vấn đề dưới là do connect của bạn và VPS chứ đâu liên quan backup nhỉ? Bạn kết nối trên web console của Vultr bình thường chứ (tránh trg hợp VPS đã bị tắt). Ngoài ra, bạn kiểm tra port SSH, user, mật khẩu

Comment của bạn

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