Chuyên mục
Linux Tip - Trick Wordpress

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.

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/databseCode 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/databaseCode 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}.sqlCode 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}.sqlCode 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_backupCode 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.shCode language: CSS (css)

Tiếp theo, tạo cronjob để tự động sao lưu mỗi ngày

crontab -eCode 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>&1Code 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/databaseCode 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                57618Code 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.

Nếu bài viết của mình mang đến thông tin, kiến thức hữu ích cho bạn, đừng ngại mời mình ly bia để có thêm động lực chia sẻ nhiều hơn nữa. Cám ơn bạn!

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 mò vào hỏi trong fanpage Yêu Chạy Bộ, sẽ không có phản hồi đâu!

Bởi Thuận Bùi

Runner at Yêu Chạy Bộ. Blogger at Ba Lô & Dép Lào. Web Developer at TB's Blog.
Follow me: Facebook / Instagram

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *