LINUX

Sao lưu cơ sở dữ liệu (backup database) của WordPress bằng Borg Backup

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.

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 [email protected] mkdir -p ./Backup/website/romhub.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://[email protected]:23/./Backup/website/romhub.me/database

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-03-6_18:49.sql'.

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/romhub.me/html litespeed wp db export  --add-drop-table --allow-root ../db_backup/${NOW}.sql

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://[email protected]:23/./Backup/website/romhub.me/data::'{now:%Y-%m-%d_%H:%M}' /home/ols-docker-env/sites/romhub.me/db_backup

Sao lưu tự động bằng cron

Tạo file bash romhub_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/romhub.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/romhub.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/romhub.me/db_backup

#Delete files older than  2 days
find /home/ols-docker-env/sites/romhub.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 romhub_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/romhub_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://[email protected]:23/./Backup/website/romhub.me/database
Repository ID: 89ef9bc2137fe7a5ea191af248446b2d7bc64f6480e1cf842a3074851bc58d1d
Location: ssh://[email protected]: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 romhub.me đã được borg backup ngày đêm, không lo mất dữ liệu.

Chia sẻ: thuanbui

Có thể bạn chưa biết

Nhận thông báo qua email
Nhận thông báo cho
guest

0 Bình luận
Phản hồi nội tuyến
Xem tất cả bình luận