Hướng dẫn backup website trên linux toàn tập

Công việc backup dữ liệu website là điều hết sức quan trọng cần được thực hiện định kỳ. Trên WordPress hosting chúng ta có thể dùng cpanel hoặc plugin backup tự động được, còn trên server linux hoặc VPS thì làm thế nào? website cần backup những gì, ở đâu ?

Hướng dẫn cách backup website trên máy chủ linux

Đó là những câu hỏi của hầu hết các bạn học quản trị máy chủ thắc mắc, thực chất sao lưu dữ liệu trên server có khi dễ hơn nhiều so với dùng plugin nó chỉ có vài ba câu lệnh thôi chạy vèo cái là xong, it plugin web cũng tối ưu hơn tải nhẹ hơn nhiều, trước khi đi vào tìm hiểu bạn xem trước các thông tin sẽ dùng cho bài viết.

Cấu trúc folder

  • Đường dẫn nguồn chữa code web /var/www/thuysys.com/public_html
  • Đường dẫn đích chứa code web đã backup /var/www/thuysys.com/backup/source
  • Đường dẫn đích chưa database đã backup /var/www/thuysys.com/backup/db

Thông tin Database

  • UserDB: thuysysuser
  • NameDB: thuysysdb
  • PassworDB: 123456

I. Cách backup website thủ công.

Chúng ta cùng đi vào chi tiết với việc tạo sao lưu dữ liệu cách thủ công trước, cứ làm từ đơn giản trước.

1. Hướng dẫn backup source code

Đầu tiên bạn cần phải xác định source code web được để ở đâu. Bạn sẽ tìm được đường dẫn đến source code trong file cấu hình virtualhost trên webserver. Bạn xem lại bài hướng dẫn cài LEMPLAMP trên CentOS, Ubuntu của mình để rõ hơn.

Mình thường đặt trong /var/www/thuysys.com/public_html.

Khi xác định xong vị trí source bạn chạy câu lệnh này cho mình:

tar -czf /var/www/thuysys.com/backup/source/source-`date +%Y%m%d`.tar.gz /var/www/thuysys.com/public_html

Trong đó:

  • tar -czf: dùng tar nén dữ liệu và lưu thành file tar.gz để tối ưu không gian lưu trữ.
  • /var/www/thuysys.com/backup/source/: đường dẫn đích để lưu file.
  • source-`date +%Y%m%d`.tar.gz: tên file backup bắt đầu bằng chữ source- tiếp theo là ngày tháng tạo file, bạn chú ý cặp dấu ` không phải dấu ngặc đơn đâu nhé. File tạo ra sẽ có dạng giống thế này source-20160430.tar.gz
  • /var/www/thuysys.com/public_html: cuối cùng là đường dẫn nguồn.

2. Hướng dẫn backup database.

Cũng chạy cho mình lệnh:

mysqldump -u thuysysuser -p123456 thuysysdb | gzip > /var/www/thuysys.com/backup/db/db-`date +%Y%m%d`.sql.gz

Diễn giải như sau:

  • mysqldump: đây là công cụ backup database được dùng phổ biến trên linux.
  • -u thuysysuser -p123456: tài khoản quản trị db
  • thuysysdb: tên database sẽ được backup.
  • | : nghĩa là lấy kết quả của lệnh đằng trước sử dụng cho lệnh sau.
  • gzip > : nén dữ liệu và lưu thành file với đuôi mở rộng sql.gz, thông thường tỉ lệ nén sẽ bằng 1/5 dữ liệu nguyên bản.
  • /var/www/thuysys.com/backup/db/: đường dẫn đích lưu file backup của database.
  • db-`date +%Y%m%d`.sql.gz: tên file backup được đặt tên bắt đầu bằng chữ db- sau đó là thời gian tạo file, tên file được tạo ra sẽ giống như này db-20160430.sql

Trong trường hợp các bạn muốn backup nhiều database thì dùng lệnh.

mysqldump -u thuysysuser -p123456 --databases db1 db2 > /var/www/thuysys.com/backup/db/db1-db2-'date +%Y%m%d'.sql

Trong đó --databases db1 db2 dùng để khai báo sẽ sao lưu 2 database là db1 và db2

Nếu muốn backup toàn bộ database hiện có bạn chỉ cần thay --databases db1 db2 thành --all-databases. Chú ý user bạn sử dụng phải có full quyền trên toàn hệ quản trị cơ sở dữ liệu, trường hợp này thường dùng tài khoản root.

Đến đây bạn đã biết cách tự sao lưu dữ liệu website thủ công làm như thế nào rồi. Dùng dữ liệu này bạn có thể cài XAMPP hay AppServ tạo webserver trên localhost để dựng lại trang web của mình phục vụ công việc test.

Dẫu sao thì cách làm này coi vẻ cũng không được chuyên nghiệp, thời gian đâu mà login vào server rồi chạy lệnh mãi được, bạn cần phải tự động hoá công việc.

II. Hướng dẫn backup dữ liệu tự động.

Muốn theo dõi tiếp bài này bạn cần tìm hiểu về cách sử dụng crontab trên linux một chút để viết lệnh.

1. Tìm hiểu về crontab

Crontab là gì ? hướng dẫn sử dụng crontab bạn search google nhé một rổ tài liệu. Crontab (Cron Job) là như nhau mình không nói lại nữa. Bạn chỉ cần biết nó là tiện ích dùng để đặt lich (schedule) thực hiện công việc nào đó một cách định kỳ hoàn toàn tự động trên máy chủ Linux.

Lệnh crontab thường dùng

  • crontab -e: dùng tạo hoặc và chỉnh sửa file crontab
  • crontab -l: hiển thị file crontab đang chạy
  • crontab -r: xóa file crontab

Cấu trúc chung của crontab

1 2 3 4 5 6
* * * * * command

Mỗi dấu * sẽ có các giá trị khác nhau.

  • 1: số phút 0 – 59.
  • 2: số giờ 0 – 23.
  • 3: ngày trong tháng 1 – 31.
  • 4: số tháng 1 – 12.
  • 5: ngày trong tuần 0 – 6, 0 = chủ nhật, còn lại là các ngày từ thứ 2 – thứ 7.
  • 6: câu lệnh sẽ được thực hiện hoặc chạy một shell script nào đó.

Một số  ký tự đặc biệt được dùng trong crontab.

Dấu phảy “,” dùng xác định nhiều giá trị riêng lẻ, ví dụ 15,45 * * * * lenh_a nghĩa là vào vào phút 15 và 45 của mỗi giờ sẽ thực hiện lenh_a

Dấu gạch ngang “-“ thể hiện một dải giá trị, ví dụ: * 1-3 * * * lenh_a nghĩa là sẽ thực hiện lenh_a 3 lần vào các thời điểm 1h, 2h rồi 3h.

Dấu slash gạch chéo “/” là bước nhẩy thời gian, ví dụ * * */2 * * lenh_a nghĩa là cứ sau 2 ngày sẽ thực hiện lenh_a một lần.

Ngoài ra chúng ta có thể thay thế 5 dấu sao bằng các ký tự đặc biệt

  • @reboot: chạy một lần khi khởi động
  • @yearly: chạy một lần trong năm tương ứng 0 0 1 1 *
  • @annually: giống @yearly
  • @monthly: chạy một lần trong tháng, tương ứng 0 0 1 * *
  • @weekly: chạy một lần trong tuần, tương ứng 0 0 * * 0
  • @daily: chạy một lần trong ngày, tương ứng 0 0 * * *
  • @midnight: giống daily
  • @hourly: chạy một lần trong giờ tương ứng 0 * * * *

Trên đây là kiên thức cơ bản về crontab để vận dụng trong bài viết, bạn nên đọc thêm các tài liệu hướng dẫn học linux online, ở trên mạng có rất nhiều ví dụ hay về crontab để tham khảo.

Cài Crontab trên Linux

Thường thì cron được cài đặt sẵn trên VPS rồi, nếu chưa có chạy mấy lệnh dưới cho mình.

CentOS/RHEL: yum install cronie

Ubuntu/Debian: apt-get install cron

2. Cách backup dữ liệu tự động

Để tiện theo dõi mình giả định một kịch bản sao lưu dữ liệu trên máy chủ linux như sau.

Backup toàn bộ source code, database vào lúc 3h sáng hàng ngày và đến cuối tuần sẽ xóa những bản backup cũ và chỉ giữ lại 3 bản backup mới nhất.

 

Cách làm như sau, chạy lệnh tạo crontab:

crontab -e

Tạo crontab sao lưu source code tự động.

Mặc định linux sẽ dùng VI text editor để tạo crontab bạn nhập nội dung bên dưới vào cho mình.

0 3 * * * tar -czf /var/www/www.thuysys.com/backup/source-`date +\%Y\%m\%d-\%H\%M\%S`.tar.gz /var/www/www.thuysys.com/public_html

Bạn cần chú ý cú pháp lệnh, không thể bê nguyên command gõ trên terminal vào đc, bạn thêm dấu backslash \ vào trước . Nếu muốn thêm thông tin giờ, phút, giây cú pháp sẽ như này source-`date +\%Y\%m\%d-\%H\%M\%S`.tar.gz. Sau đó ấn :wq để lưu và thoát khỏi chế độ cài đặt crontab.

Tạo crontab sao lưu database tự động.

Cũng tương tự như khi sao lưu source code bạn thêm dòng lệnh sau:

0 3 * * * mysqldump -u thuysysdb -p123456 thuysysdb | gzip > /var/www/www.thuysys.com/backup/db/db-`date +\%Y\%m\%d`.sql.gz

Xong rồi đó, bạn đã tạo xong schedule backup dữ liệu website, vào 3h sáng hàng ngày trang web của bạn sẽ tự động được sao lưu. Để biết crontab hoạt động không bạn vào folder xem file có được tạo ra hay không hoặc kiểm tra log hoạt động của crontab, chạy lệnh.

Với CentOS:

tail -f /var/log/cron

Với Ubuntu:

tail -f /var/log/syslog

Theo lịch backup bên trên cứ sau 1 ngày bạn sẽ có 2 bản backup của DB và Source Code, với những website lớn lại sử dụng VPS thì ổ cứng SSD của bạn sẽ nhanh chóng bị sử dụng hết, bạn phải xóa bớt các bản sao lưu cũ đi. Với kịch bản đưa ra, toàn bộ bản backup lưu trong 1 tuần sẽ bị xóa sạch chỉ giữ lại 3 bản mới nhất(tương ứng với 3 ngày cuối tuần), để làm được việc đó bạn phải thêm 2 dòng lệnh nữa vào crontab.

Tự động xóa file cũ trên linux bằng crontab

Source code

@weekly cd /var/www/www.thuysys.com/backup/source && rm -rf `ls -1t | tail -n +3`

Database.

@weekly cd /var/www/www.thuysys.com/backup/db && rm -rf `ls -1t | tail -n +3`

Hai lệnh trên là tương tự nhau chỉ khác nhau đường dẫn đến folder cần xóa, mình sẽ diễn giải câu lệnh đầu tiên để các bạn hiểu được cú pháp.

  • @weekly: là ký tự đặc biệt như đã nói ở trên thay cho 0 0 * * 0, như vậy là cứ vào 0 phút 0 giờ ngày chủ nhật hàng tuần crontab sẽ thực hiện lệnh xóa file được chỉ định.
  • cd /var/www/www.thuysys.com/backup/source &&: đầu tiên sẽ thực hiện lệnh chuyển đến thư mục chứa source code, dấu && thông báo sẽ chạy thêm một lệnh nữa.
  • rm -rf: xóa toàn bộ file được lọc ra từ câu lệnh phía sau nó.
  • `ls -1t | tail -n +3`: lọc và sắp xếp các file trong thư mục theo quy tắc mới nhất xếp trên cùng sau đó sẽ giữ lại 3 file mới nhất và chỉ show những file cũ để lệnh rm -rf xóa đi.

Bạn nào viết được bash shell có thể gom tất cả các lệnh trên vào một file duy nhất để cho gọn crontab mà quản lý cũng tiện hơn.

Bài viết dài nhưng kết lại chỉ có 4 câu lệnh thôi, bây giờ bạn có thể quên đi mớ plugin nặng nề trên website được rồi.

Như vậy là đủ cả backup thủ công và tự động, còn chờ gì nữa mà không backup trang wordpress của bạn ngay bây giờ. Các câu lệnh trong bài có thể chưa được tối ưu các bạn tìm hiểu thêm và bổ sung giúp mình ở ô comment bên dưới nhé.

Đây là backup trên local, muốn restore website trên VPS từ bản backup này thì làm thế nào? Hay muốn chuyển dữ liệu backup sang máy chủ lưu trữ khác ở bên ngoài qua giao thức SSH thì sao ? Cả cách dùng Rsync đồng dữ liệu backup giữa các máy chủ với nhau nữa, các bạn đón đọc ở bài tới nhé.

Tài liệu tham khảo thêm:

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

7 Comments

  1. Minhduc Nguyen August 12, 2016 Reply
    • admin August 12, 2016 Reply
    • Minhduc Nguyen August 12, 2016 Reply
      • admin August 12, 2016 Reply
        • admin August 12, 2016 Reply
  2. Anh Tuyến June 22, 2016 Reply
    • admin June 22, 2016 Reply

Leave a Reply