Trong bài viết hướng dẫn sao lưu dữ liệu bằng Borg Backup trước đây, mình đã chia sẻ cách sao lưu thư mục chứa dữ liệu của WordPress lên Heztner Storage Box. Hôm nay mình sẽ chia sẻ tiếp cách sao lưu cơ sở dữ liệu (backup database) MySQL của WordPress bằng Borg Backup.
Nếu chưa có kinh nghiệm về Borg Backup, bạn cần tham khảo lại bài viết trước để biết cách sử dụng các dòng lệnh quản lý cơ bản của Borg.
Mục Lục
I. Khởi tạo Repository cho database
Mình sẽ tiếp tục sử dụng Hetzner Storage Box để backup dabatabase.
Truy cập vào Hetzner Storage Box, tạo thư mục mới trên Storage Box dùng làm Repository cho database
ssh -p23 uxxxxx@uxxxxxx.your-storagebox.de mkdir -p ./Backup/website/thuanbui.me/databse
Code language: Nginx (nginx)
Quay lại VPS đang chạy website WordPress cần backup, khởi tạo repository bằng lệnh borg init
. Mình không sử dụng mã hóa nên phần --encryption
chọn none. Bạn nào quan tâm về mã hóa có thể tham khảo thêm ở đây: https://borgbackup.readthedocs.io/en/stable/quickstart.html#repository-encryption
borg init --encryption=none ssh://uxxxxxx@uxxxxx.your-storagebox.de:23/./Backup/website/thuanbui.me/database
Code language: Nginx (nginx)
II. Sao lưu cơ sở dữ liệu ra file sql
Để sao lưu cơ sở dữ liệu ra ổ cứng, mình sử dụng WP-CLI với lệnh wp db export
. Thư mục lưu trữ là db_backup
Di chuyển vào thư mục cài đặt WordPress và chạy lệnh sau
export NOW=$(date +%Y-%m-%d_%H:%M)
wp db export --add-drop-table --allow-root ../db_backup/${NOW}.sql
Code language: JavaScript (javascript)
Thông báo
Success: Exported to '2024-02-13_18:49.sql'.
Code language: JavaScript (javascript)
Do mình đang dùng Openlitespeed Docker để chạy WordPress nên phải điều chỉnh lại đôi chút
export NOW=$(date +%Y-%m-%d_%H:%M)
docker exec --workdir /var/www/vhosts/thuanbui.me/html litespeed wp db export --add-drop-table --allow-root ../db_backup/${NOW}.sql
Code language: JavaScript (javascript)
III. Chuyển dữ liệu lên Repository
Chuyển thư mục lưu file sql lên repository
borg create --stats --progress ssh://uxxxxxx@uxxxxxx.your-storagebox.de:23/./Backup/website/thuanbui.me/data::'{now:%Y-%m-%d_%H:%M}' /home/ols-docker-env/sites/thuanbui.me/db_backup
Code language: JavaScript (javascript)
IV. Sao lưu tự động bằng cron
Tạo file bash thuanbui_database_backup.sh
với nội dung sau
#!/usr/bin/env bash
export NOW=$(date +%Y-%m-%d_%H:%M)
# Backup database
docker exec --workdir /var/www/vhosts/thuanbui.me/html litespeed wp db export --add-drop-table --allow-root ../db_backup/${NOW}.sql
LOG='/var/log/borg/backup.log'
export BACKUP_USER='uxxxxxx'
export REPOSITORY_DIR='Backup/website/thuanbui.me/database'
export REPOSITORY="ssh://${BACKUP_USER}@${BACKUP_USER}.your-storagebox.de:23/./${REPOSITORY_DIR}"
echo "Transfer files ..."
borg create -v --stats \
$REPOSITORY::'{now:%Y-%m-%d_%H:%M}' \
/home/ols-docker-env/sites/thuanbui.me/db_backup
#Delete files older than 2 days
find /home/ols-docker-env/sites/thuanbui.me/db_backup/ -mindepth 1 -mtime +2 -delete
Code language: Bash (bash)
Dòng 18-19 được bổ sung để xóa các file sql đã tạo trước đó 2 ngày để không gây quá tải ổ cứng server vì lưu quá nhiều bản backup. Mình giữ lại bản sao lưu database của 2 ngày gần nhất trên server để tiện phục hồi database trong trường hợp bất trắc, khỏi phải kéo về từ remote repository.
Cấp quyền thực thi
chmod u+x thuanbui_dabase_backup.sh
Code language: CSS (css)
Tiếp theo, tạo cronjob để tự động sao lưu mỗi ngày
crontab -e
Code language: Nginx (nginx)
Bổ sung vào nội dung sau ở cuối file và lưu lại.
0 */4 * * * TZ=Asia/Ho_Chi_Minh /home/thuanbui_databse_backup.sh > /dev/null 2>&1
Code language: JavaScript (javascript)
Do database thay đổi liên tục nên mình sẽ cho scrip backup này chạy mỗi 4 tiếng.
Nhờ Borg áp dụng công nghệ chống trùng lập (de-duplication) nên có thể lưu trữ bản sao database cho cả năm cũng không tốn bao nhiêu dung lượng ổ cứng.
Mình có thể kiểm tra thông số của Borg Repository bằng lệnh sau
borg info ssh://u294518@u294518.your-storagebox.de:23/./Backup/website/thuanbui.me/database
Code language: Nginx (nginx)
Repository ID: 89ef9bc2137fe7a5ea191af248446b2d7bc64f6480e1cf842a3074851bc58d1d
Location: ssh://u294518@u294518.your-storagebox.de:23/./Backup/website/thuanbui.me/database
Encrypted: No
Cache: /root/.cache/borg/89ef9bc2137fe7a5ea191af248446b2d7bc64f6480e1cf842a3074851bc58d1d
Security dir: /root/.config/borg/security/89ef9bc2137fe7a5ea191af248446b2d7bc64f6480e1cf842a3074851bc58d1d
------------------------------------------------------------------------------
Original size Compressed size Deduplicated size
All archives: 208.42 GB 40.55 GB 1.08 GB
Unique chunks Total chunks
Chunk index: 1682 57618
Code language: Shell Session (shell)
Mình bắt đầu thực hiện sao lưu database từ đầu tháng 1, mỗi ngày 6 bản. Sau 1 tháng, tổng dung lượng của repository chỉ tốn 1.08 GB. Nếu sao lưu theo kiểu thông thường thì phải tốn ít nhất 40.55 GB.
Vậy là xong! Website thuanbui.me đã được borg backup ngày đêm, không lo mất dữ liệu.
Lưu ý: Nếu bạn cần hỗ trợ kỹ thuật, vui lòng gửi câu hỏi trực tiếp ở phần Thảo luận bên dưới, mình sẽ trả lời sớm. Đừng vào hỏi trong fanpage Yêu Chạy Bộ, sẽ không có phản hồi đâu!