Giới thiệu
Trong bài viết này, chúng ta sẽ tìm hiểu cách sao lưu nhiều cơ sở dữ liệu MySQL hoặc MariaDB trên cùng một máy bằng cách sử dụng tập lệnh bash tùy chỉnh và thiết lập công việc định kỳ.
(Các) Sao lưu cơ sở dữ liệu
Chúng tôi sẽ cho rằng chúng tôi có ba cơ sở dữ liệu MySQL trên phiên bản Vultr của chúng tôi có tên là db-vultr-site , db-vultr-blog , db-vultr-app (Đừng lo lắng về việc tạo các cơ sở dữ liệu này, bạn sẽ có thể thay thế tên của chúng đối với bạn, chúng được sử dụng trong tập lệnh ở Bước 2 bên dưới) .
-
Đăng nhập vào cơ sở dữ liệu MySQL hoặc MariaDB của bạn và chạy bên dưới truy vấn để tạo người dùng cơ sở dữ liệu db_user_backups
để xử lý các bản sao lưu
GRANT LOCK TABLES, SELECT, SHOW VIEW, REPLICATION CLIENT ON *.* TO 'db_user_backups'@'%' IDENTIFIED BY '{COMPLEX-PASSWORD}';
Đồng thời chạy bên dưới để đảm bảo MySQL được cấu hình để khôi phục đúng quy trình đã lưu
SET GLOBAL log_bin_trust_function_creators = 1;
-
Thiết lập cấu trúc thư mục cần thiết và các tập tin cần thiết
# create backup directory with environment and log file
sudo mkdir /backups && cd /backups
sudo touch .env db-backup.sh db-backup.log
sudo chmod -R 775 /backups
sudo chmod -R g+s /backups
sudo chmod +x db-backup.sh
# add mysql backup user credentials into environment file
echo "export MYSQL_USER=db_user_backups" > /backups/.env
echo "export MYSQL_PASS={COMPLEX-PASSWORD}" >> /backups/.env
-
Mở db-backup.sh nano /backups/db-backup.sh
và dán mã bên dưới vào trong đó, sau đó lưu tệp (Ctrl + X -> Y -> nhấn Enter) .
DB_NAMES=( 'db-vultr-site' 'db-vultr-blog' 'db-vultr-app' ) #replace with your own database name(s)
BKUP_NAMES=()
BKUP_DIR="/backups"
# get total number of directories
total_dbs=${#DB_NAMES[@]}
# create backup file names
for (( i=0; i<${total_dbs}; i++ )); do
BKUP_NAMES[$i]="`date +%Y%m%d%H%M`-backup-$${DB_NAMES[$i]}.sql.gz"
done
# get backup users credentials
source $BKUP_DIR/.env
# create backups
for (( i=0; i<${total_dbs}; i++ )); do
# NOTE: --routines flag makes sure stored procedures are also backed up
mysqldump --routines -u ${MYSQL_USER} -p${MYSQL_PASS} | gzip > ${BKUP_DIR}/${BKUP_NAMES[$i]}
done
Đoạn mã trên đang lặp qua một mảng với (các) tên của cơ sở dữ liệu mà bạn muốn sao lưu và thực hiện.
Cài đặt cronjob
Thiết lập một cronjob để chạy mỗi nửa đêm chạy tập lệnh sao lưu và lưu kết quả / đầu ra vào nhật ký dự phòng.
-
Mở crontab
crontab -e
-
Thêm mục dưới đây vào crontab
0 0 * * * /usr/bin/env bash /backups/db-backup.sh &>> /backups/db-backup.log
Lưu ý: Trong khi kiểm tra, bạn có thể đặt cronjob để chạy cứ sau 1 phút thay vì như bên dưới
* * * * * /usr/bin/env bash /backups/db-backup.sh &>> /backups/db-backup.log
-OR- cứ sau 5 phút (thay thế 5 bằng số phút bạn muốn)
*/5 * * * * /usr/bin/env bash /backups/db-backup.sh &>> /backups/db-backup.log
Cái gì tiếp theo
Bạn có thể sẽ không muốn (các) bản sao lưu của mình trên cùng một (các) máy chủ đang chạy (các) cơ sở dữ liệu của bạn, mà thay vào đó trên một máy chủ ở một vị trí địa lý khác. Có một số cách để làm điều này, từ sử dụng SFTP, đến sử dụng các công cụ tùy chỉnh được cung cấp bởi vô số nhà cung cấp lưu trữ đám mây có sẵn ngoài đó. Một lựa chọn tốt khác là Rupync như được giải thích ở đây - vultr.com/docs/setup-file-mirroring-USE-rsync-in-debian-ubfox
Viết bởi Lami Adabonyan