[Cloud Server] Giải pháp sao lưu dữ liệu miễn phí cho máy chủ

Lường Thế Nam 6 phút đọc

Nếu bạn cần một giải pháp khác tốt hơn là gõ từng câu lệnh thủ công thì ở bài này mình sẽ hướng dẫn các bạn tự viết một Shell script để thực hiện công việc backup để khi nào cần backup, bạn chỉ cần gõ một câu lệnh nào đó mà bạn tự đặt ra thay vì sử dụng các lệnh thủ công. Hơn nữa, cũng trong bài này mình sẽ hướng dẫn bạn cách đưa một Shell script bạn tự viết vào crontab để công việc backup diễn ra hoàn toàn tự động, như backup 1 ngày 1 lần chẳng hạn.

I. Giới thiệu về Shell Script

Shell Script là một ngôn ngữ lập trình kịch bản được thiết kế dành cho môi trường UNIX. Chẳng hạn bạn hay sử dụng các lệnh như cd, unzip,…tất cả lệnh đó đều là Shell script.

Chẳng hạn như bạn cần backup một thư mục nào đó và chuyển file backup đến một thư mục chỉ định, đồng thời xóa các file backup cũ thì nếu bạn tự gõ các lệnh đó thủ công thì bạn sẽ cần gõ khoảng 4, 5 lần. Tuy nhiên với ngôn ngữ Shell, bạn có thể lồng các tác vụ đó vào một file Shell script để khi cần làm việc kia thì bạn chỉ cần gõ một lệnh mà bạn đã đặt ra.

II. Viết Shell script để backup dữ liệu

1.Bắt đầu viết script

Đầu tiên là bạn tạo ra một file với tên backup trong thư mục /bin:

vi /bin/tpbackup

Nhập code sau và sửa theo ý của bạn:

#! /bin/sh
#
ngay=$(date +"%T %d-%m-%Y")
file_name="backup-$ngay"
echo
mysqldump --single-transaction --routines  --triggers --add-drop-table --extended-insert -u TaikhoanMysql -pMậtkhẩuSQL têndatabase | gzip -9 > thưmụclưu/db_$(date +"%T %d-%m-%Y").sql.gz
echo
echo "BACKUP CSDL VA CODE THANH CONG VAO LUC $ngay!"
echo
zip -r Đườngdẫnlưubackupcode/$file_name  cd /Thưmụccầnbackups > /dev/null
echo "Ten file CSDL backup: $file_name.sql.gz"
echo "Ten file backup code: $file_name.zip"
echo "File backup da duoc luu tai: Đường dẫn đến file backup"
echo

Ví dụ, ở đây mình sẽ lưu file Code và Database vào thư mục /home/backups nhưng khi backup thư mục home sẽ không bao gồm thư mục /backups để tốn dung lượng, mình sử dụng script như sau:

Thông tin SQL của mình là: user là ‘’root’’, pass là ‘123456’ và database mình cần backup là ‘’testdatabase’’

#! /bin/sh
#
ngay=$(date +"%T %d-%m-%Y")
file_name="backup-$ngay"
echo
mysqldump --single-transaction --routines  --triggers --add-drop-table --extended-insert -u root -p123456 testdatabase | gzip -9 > /home/backups/db_$(date +"%T %d-%m-%Y").sql.gz
echo
echo "BACKUP CSDL VA CODE THANH CONG VAO LUC $ngay!"
echo
zip -r /home/backups/$file_name  cd /home -x "*backups*" > /dev/null
echo "Ten file CSDL backup: $file_name.sql.gz"
echo "Ten file backup code: $file_name.zip"
echo "File backup da duoc luu tai: /home/backups"
echo

Các bạn lưu ý dòng lệnh sau:

cd /home -x “*backups*” : lệnh này là lệnh zip thư mục home nhưng không zip thư mục tên backups ở bên trong thư mục home

Sau đó, bạn lưu lại file và gõ thử lệnh backup để kiểm tra xem script đã hoạt động chưa. Nếu kết quả trả về như dưới đây là script đã hoạt động:

Như vậy là bạn đã có một bản sao lưu cho tất cả website trên máy chủ, khi có vấn đề phát sinh cần khôi phục, bạn chỉ cần giải nén dữ liệu source code và chép vào thư mục chính (Document Root) của website. Với cơ sở dữ liệu bạn chỉ cần giải nén tập tin *.sql.gz sau đó chạy lệnh khôi phục như sau:

#mysql -u [user-database] -p [password-user-database] [database-name] < /path/file.sql

III. Tạo Cron Job để tự backup dữ liệu

Cron Job nghĩa là khái niệm chỉ một hành động nào đó được lặp đi lặp lại theo một chu kỳ nhất định. Ở bài này mình sẽ không giải thích rõ Cron Job là gì nên mình chỉ nói về việc sử dụng Cron Job để máy chủ tự động backup theo chu kỳ nhất định.

Lưu ý: Nên sử dụng tài khoản root để tạo cron.

Để tạo Cron Job, bạn hãy gõ lệnh sau:

crontab -e

Ấn phím i để chuyển qua chế độ Insert và gõ:

0 00 * * 1,4 backup >> /home/backups/backups-report.txt
Ở đây, dòng crontab được hiểu như sau:
Hệ thống sẽ tự động chạy lệnh backup (Script mà chúng ta vừa viết) vào lúc 12h đêm thứ 2 và thứ 5 hàng tuần và xuất ra file log report được lưu tại:
>> /home/backups/backups-report.txt.

Để kiểm tra xem bạn đã thêm cronjob thành công hay chưa, hãy gõ lệnh xem nội dung của file /var/spool/cron/root:

cat /var/spool/cron/root

Nếu nó hiện ra cái cronjob mà bạn vừa thêm thì thành công.

Tips: Bạn có thể sử dụng công cụ Crontab Code Generator để hỗ trợ tạo crontab nhanh và chính xác.

IV. Dùng Cron để tự động xóa file backup cũ

VPS/SERVER của bạn ít dung lượng, bạn sợ các bản backup sẽ làm full ổ đĩa. Đừng lo, hãy thêm một crontab sau để tự động xóa các file backup cũ nhé. Ở đây mình thiết lập tự động xóa các file backup cũ hơn 7 ngày vào 15h hàng ngày, mình dùng crontab như sau:

15 * * * find /home/backups -type f -mtime +7 -exec rm -f {} ;

Hãy chỉnh sửa /home/backups thành thư mục chứa các file backup của bạn.

Chúc các bạn thành công!