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.
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
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
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
Thông báo
Success: Exported to '2024-02-13_18:49.sql'.
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
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
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
Tiếp theo, tạo cronjob để tự động sao lưu mỗi ngày
crontab -e
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
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
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
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.
Tham khảo: thuanbui.me