Sao lưu đóng vai trò như một mạng an toàn cho bất kỳ ứng dụng nào lưu trữ dữ liệu quan trọng. Nếu bạn đang chạy cơ sở dữ liệu PostgreSQL trên máy chủ Linux, việc tự động hóa các bản sao lưu định kỳ là điều thiết yếu cho khôi phục sau thảm họa và sự an tâm.
Trong bài viết này, chúng ta sẽ khám phá một shell script đơn giản nhưng mạnh mẽ có thể:
- Xuất dữ liệu của cơ sở dữ liệu PostgreSQL
- Nén file sao lưu
- Lưu trữ kèm theo dấu thời gian
- Chuyển file sang máy chủ từ xa
- Chỉ giữ lại 10 bản sao lưu gần nhất
Tại sao phải tự động hóa sao lưu PostgreSQL?
Việc sao lưu thủ công rất rủi ro — bạn có thể quên hoặc làm sai cách. Tự động hóa giúp đảm bảo:
- Tính nhất quán: Mỗi bản sao lưu được thực hiện theo cách giống nhau.
- Tính minh bạch: Các file sao lưu được đánh dấu thời gian, giúp theo dõi lịch sử.
- Tính bảo mật: Sao lưu ngoài máy giảm nguy cơ mất dữ liệu.
- Tính hiệu quả: Các bản sao lưu cũ được dọn dẹp tự động.
Trước khi sử dụng script, hãy đảm bảo:
- Bạn đã cài đặt và chạy cơ sở dữ liệu PostgreSQL.
- Tài khoản người dùng có quyền
sudo
. - Bạn có thể dùng
scp
để sao chép đến máy chủ từ xa qua SSH key (không cần mật khẩu). - Thư mục sao lưu
/home/ubuntu/backups/
đã tồn tại trên máy chủ từ xa.
Shell Script
Dưới đây là toàn bộ script để tự động sao lưu PostgreSQL:
#!/bin/sh # Set timestamp using system's local time
timestamp=$(date +%Y-%m-%d_%H-%M-%S)
backup_dir="/home/ubuntu/backups"
backup_file="${backup_dir}/${timestamp}.psql.gz" # Dump the PostgreSQL database
sudo su postgres -c "pg_dump -O db_name > /tmp/back.psql" # Compress the backup
gzip -f /tmp/back.psql # Ensure backup directory exists
mkdir -p "$backup_dir" # Move the compressed backup to the backup directory
mv /tmp/back.psql.gz "$backup_file" # Copy the backup file to the remote server
scp "$backup_file" ubuntu@IP:/home/ubuntu/backups/ # Retain only the 10 most recent backups
if [ -d "$backup_dir" ]; then echo "Backup folder exists." cd "$backup_dir" || { echo "Failed to cd into $backup_dir"; exit 1; } ls -t *.psql.gz | tail -n +11 | xargs -r rm -f
else echo "Backup folder does not exist."
fi
Cách sử dụng script này
- Thay
db_name
bằng tên thực tế của cơ sở dữ liệu của bạn. - Thay
IP
trong dòngscp
bằng địa chỉ IP hoặc hostname của máy chủ từ xa. - Cấp quyền thực thi cho script:
chmod +x backup.sh
- Chạy thủ công hoặc tự động hóa bằng
cron
:
crontab -e
Ví dụ: chạy sao lưu mỗi ngày lúc 2 giờ sáng:
0 2 * * * /path/to/backup.sh
Phân tích script
1. Gắn dấu thời gian vào tên file
Tạo dấu thời gian không chứa dấu hai chấm, giúp đặt tên file sao lưu duy nhất.
timestamp=$(date +%Y-%m-%d_%H-%M-%S)
2. Xuất dữ liệu và nén
Dùng pg_dump
để xuất cơ sở dữ liệu và gzip
để nén kết quả. Tùy chọn -O
bỏ qua lệnh tạo quyền sở hữu.
sudo su postgres -c "pg_dump -O db_name > /tmp/back.psql"
gzip -f /tmp/back.psql
3. Lưu trữ cục bộ và từ xa
Lưu file sao lưu trên máy cục bộ, sau đó sao chép sang máy chủ từ xa qua scp.
mv /tmp/back.psql.gz "$backup_file"
scp "$backup_file" ubuntu@IP:/home/ubuntu/backups/
4. Dọn dẹp bản sao lưu cũ
Giữ lại 10 bản sao lưu mới nhất và xóa phần còn lại để tiết kiệm dung lượng.
ls -t *.psql.gz | tail -n +11 | xargs -r rm -f
Nâng cao: Tích hợp lưu trữ đám mây (tùy chọn)
Ngoài lưu trữ cục bộ và từ xa, bạn có thể tích hợp với lưu trữ đám mây để tăng độ an toàn.
# Amazon S3 using the AWS CLI
aws s3 cp "$backup_file" s3://your-s3-bucket-name/backups/ # Google Cloud Storage
gsutil cp "$backup_file" gs://your-gcs-bucket/backups/
Sao lưu dữ liệu không phải là tùy chọn — nó là điều bắt buộc. Khi đã tự động hóa quy trình, bạn có thể yên tâm rằng dữ liệu của mình luôn an toàn.
Cảm ơn các bạn đã theo dõi!