1. Giới thiệu cách thức tự động sao lưu website trên máy chủ
Nếu bạn tiến hành cài đặt một webserver thì sẽ có rất nhiều lựa chọn để sao lưu (backup) dữ liệu của website trên máy chủ, đặc biệt trong trường hợp cài đặt một số công cụ quản lý hosting chuyên nghiệp như cPanel, Kloxo... thì đều có công cụ có sẵn với nhiều tính năng để sao lưu dữ liệu như theo ngày, tháng, năm.... Tuy nhiên trong trường hợp cài đặt một webserver để vận hành một hoặc một vài website thì không cần thiết phải cài đặt công cụ quản lý hosting để tiết kiệm tài nguyên cho máy chủ.
Bạn có thể tham khảo gói dịch vụ sao lưu dữ liệu chuyên nghiệp tại VinaHost (http://vinahost.vn/sao-luu-du-lieu.html) hoặc tham khảo hướng dẫn sau để tự cấu hình một phiên bản sao lưu của website trên máy chủ của mình hoặc trên một máy chủ độc lập khác.
2. Xác định dữ liệu cần sao lưu
- Tùy thuộc vào quá trình cài đặt thì file cấu hình của webserver để định nghĩa các hosting nằm ở vị trí khác nhau, đối với 2 chương trình webserver phổ biến nhất trên môi trường Linux là Apache và Nginx thì được lưu ở /etc/http/conf/http.conf và /etc/nginx/conf.d/demo.vinahost.vn.conf (đường dẫn và tên file có thể không chính xác, tùy thuộc vào tình huống và cách thức cài đặt) và phần cấu hình website có cấu trúc như sau:
- Nếu bạn sử dụng Apache làm webserver thì phần cấu hình mặc định của một hosting (VirtualHost) như sau:
<VirtualHost *:80>
ServerAdmin webmaster@demo.vinahost.vn
DocumentRoot /var/www/demo/
ServerName demo.vinahost.vn
ErrorLog logs/demo.vinahost.vn-error_log
CustomLog logs/demo.vinahost.vn-access_log common
</VirtualHost>
- Như vậy thư mục chứa mã nguồn của website demo.vinahost.vn là /var/www/demo/
- Nếu bạn sử dụng Nginx làm webserver thì phần cấu hình mặc định của một hosting (Server Blocks) như sau:
server {
server_name www.demo.vinahost.vn;
access_log logs/demo.vinahost.vn.access.log main;
root /var/www/demo;
}
- Như vậy thư mục chứa mã nguồn của website demo.vinahost.vn là /var/www/demo/
- Đối với database, phổ biến nhất và dễ sử dụng nhất hiện nay là Mysql (www.mysql.com), mặc định toàn bộ database của mysql được lưu trữ ở thư mục /var/lib/mysql hoặc được export ra từ câu lệnh mysqldump
3. Câu lệnh sao lưu dữ liệu
- Để tạo ra bản sao của mã nguồn ta có thể sử dụng lệnh copy hoặc rsync trong môi trường Linux.
ví dụ: ta sẽ lưu trữ một bản sao lưu của mã nguồn website demo.vinahost.vn trong thư mục /backup/manguon thì câu lệnh tương ứng như sau: cp -ar /var/www/demo /backup/manguon/
- Để tạo ra bản sao của database ta có thể sử dụng lệnh mysqldump hoặc mysqlhotcopy (chỉ dùng cho database MyISAM)
- Tùy thuộc vào định dạng của database là InnoDB hay MyISAM mà chúng ta có cách thức lưu trữ khác nhau:
InnoDB: database được lưu trữ ở file có đuôi .ibd tương ứng và ta có thể sử dụng mysqldump theo cú pháp sau: mysqldump -u [uname] -p[pass] [dbname] > backupfile.sql
ví dụ như sau: /usr/bin/mysqldump -u demo_user -pdemo123 demo_db > /backup/database/demo_db.sql
Trong đó:
demo_user: tên user mysql
demo123: mật khẩu của user demo_user, lưu ý viết liền với tùy chọn -p
demo_db: tên database cần sao lưu
/backup/database/demo_db.sql: là file database demo_db được export ra thành demo_db.sql và lưu trữ tại thư mục /backup/database
MyISAM: database được lưu trữ ở thư mục có tên tương ứng với tên database, ví dụ database của website demo.vinahost.vn đang sủ dụng là demo_db thì thư mục lưu trữ tương ứng là /var/lib/mysql/demo_db và ta sử dụng mysqlhotcopy để tạo bản sau lưu của thư mục gốc này với cú pháp sau:
mysqlhotcopy -u [uname] -p[pass] db_name [new_db_name | directory].
ví dụ như sau: /usr/bin/mysqlhotcopy -u demo_user -pdemo123 demo_db /backup/database
Trong đó:
demo_user: tên user mysql
demo123: mật khẩu của user demo_user, lưu ý viết liền với tùy chọn -p
demo_db: tên database cần sao lưu
/backup/database : là thư mục lưu trữ thư mục database gốc của demo_db, sau khi hoàn tất toàn bộ thư mục gốc của database demo_db sẽ được sao lưu một bản ở thưc mục này.
4. Chạy sao lưu định kỳ
- Để chạy sao lưu dữ liệu định kỳ ta có thể sử dụng crontab trong môi trường Linux, trước hết ta cần tạo một script đơn giản để chạy định kỳ ví dụ như sau:
#!/bin/bash
#xóa dữ liệu backup cũ
rm -rf /backup/*
#sao lưu mã nguồn website
cp -ar /var/www/demo /backup/manguon/
#sao lưu database website, ví dụ trường hợp này database sử dụng MyISAM
/usr/bin/mysqlhotcopy -u demo_user -pdemo123 demo_db /backup/database
#in ra màn hình hoặc lưu trữ vào file log kết quả
echo "Backup complete" > /var/log/backup/$today.log
- Bạn có thể viết thêm cấu hình vào script tùy theo nhu cầu sử dụng mà bạn mong muốn.
- Cài đặt crontab để chạy script này định kỳ vào lúc 0h 0p hàng ngày bằng câu lệnh: crontab -e sau đó chèn nội dung sau
0 0 * * * /root/backup.sh > /dev/null 2>&1
5. Sao lưu ra một máy chủ khác
Trong ví dụ trên mô tả cơ bản các bước cấu hình sao lưu mã nguồn một website trên chính máy chủ webserver, tuy nhiên nếu bạn muốn sao lưu ra một máy chủ khác để đảm bảo an toàn hơn tránh trường hợp máy chủ webserver bị lỗi và toàn bộ dữ liệu trên ổ cứng bị mất thì ta có thể dùng câu lệnh rsync.
ví dụ: rsync -ar /backup root@10.0.0.2:/backup
trong đó:
/backup là thư mục chứa toàn bộ dữ liệu mã nguồn và database của website cần sao lưu
root là tài khoản dùng cho phiên kết nối này
10.0.0.2:/backup là IP của máy chủ chứa dữ liệu sao lưu và thư mục cần lưu dữ liệu là /backup trên máy chủ này.
Sau đó ta có thể tạo một cronjob để chạy lệnh này hàng ngày vào lúc 0h 0 phút ví dụ:
0 0 * * * rsync -ar /backup root@10.0.0.2:/backup > /dev/null 2>&1
6. Phục hồi dữ liệu
- Đối với mã nguồn bạn chỉ cần copy ngược lại từ thư mục /backup/manguon về thư mục chứa website /var/www/demo và kiểm tra lại owner của các file/folder này.
- Đối với database dạng MyISAM bạn cần copy toàn bộ nội dung, files trong thư mục /backup/database/demo_db về thư mục chứa database tương ứng /var/lib/mysql/demo_db và phân lại chủ sở hữu là mysql.mysql bằng câu lệnh sau: chown -R mysql.mysql /var/lib/mysql/demo_db
- Đối với database dạng InnoDB bạn cần sử dụng câu lệnh: mysqldump demo_db < /backup/database/demo_db.sql để phục hồi lại database demo_db từ phiên bản sao lưu.