❤️ AZDIGI chính thức cập nhật hệ thống blog mới hoàn chỉnh. Tuy nhiên có thể một số bài viết bị sai lệch hình ảnh, hãy ấn nút Báo cáo bài viết ở cuối bài để AZDIGI cập nhật trong thời gian nhanh nhất. Chân thành cám ơn.

Backup database là một trong những thao tác quan trọng nhất khi quản trị máy chủ Linux. Dù bạn đang chuẩn bị migrate server, cập nhật ứng dụng, hay đơn giản là muốn có bản sao phòng trường hợp sự cố, việc biết cách backup và restore database bằng dòng lệnh sẽ rất hữu ích. Trong bài này, mình sẽ hướng dẫn chi tiết cách backup và import database MySQL/MariaDB, PostgreSQL trên máy chủ Linux.

1. Backup database MySQL cơ bản

Công cụ phổ biến nhất để backup MySQL là mysqldump. Lệnh cơ bản như sau:

mysqldump -u root -p ten_database > backup.sql

Trong đó:

  • -u root: user MySQL (thay bằng user của bạn).
  • -p: hệ thống sẽ hỏi password sau khi chạy lệnh.
  • ten_database: tên database cần backup.
  • backup.sql: file đầu ra chứa toàn bộ cấu trúc và dữ liệu.

2. Backup tất cả databases

Nếu muốn backup toàn bộ databases trên server, bạn dùng flag --all-databases:

mysqldump -u root -p --all-databases > all_databases.sql

Lệnh này sẽ dump toàn bộ databases bao gồm cả các database hệ thống như mysql, information_schema. Rất hữu ích khi bạn cần migrate toàn bộ server.

3. Backup với các options nâng cao

Trong thực tế, bạn nên thêm một số options để đảm bảo backup đầy đủ và nhất quán:

mysqldump -u root -p --single-transaction --routines --triggers ten_database > backup.sql

Giải thích các options:

  • --single-transaction: Backup mà không lock bảng (chỉ áp dụng cho InnoDB). Rất quan trọng với database đang chạy production vì không làm gián đoạn dịch vụ.
  • --routines: Bao gồm stored procedures và functions trong bản backup.
  • --triggers: Bao gồm triggers (mặc định đã bật, nhưng thêm vào cho chắc).

4. Import/Restore database

Để import (restore) database từ file backup, bạn dùng lệnh mysql:

mysql -u root -p ten_database < backup.sql

Lưu ý: Database đích phải đã được tạo sẵn trước khi import. Nếu chưa có, bạn tạo bằng lệnh:

mysql -u root -p -e "CREATE DATABASE ten_database;"

Nếu bạn backup bằng --all-databases, khi restore không cần chỉ định tên database:

mysql -u root -p < all_databases.sql

5. Backup nén để tiết kiệm dung lượng

Database lớn có thể tạo ra file backup hàng GB. Để tiết kiệm dung lượng, bạn nén trực tiếp khi backup:

mysqldump -u root -p --single-transaction ten_database | gzip > backup.sql.gz

Khi cần restore từ file nén:

gunzip < backup.sql.gz | mysql -u root -p ten_database

File nén bằng gzip thường nhỏ hơn 5 đến 10 lần so với file SQL gốc, rất đáng để sử dụng.

6. MariaDB trên AlmaLinux

Trên AlmaLinux (và CentOS), MariaDB thường được cài mặc định thay vì MySQL. Tin vui là các lệnh backup/restore hoàn toàn tương thích:

  • mysqldump vẫn hoạt động bình thường trên MariaDB.
  • MariaDB cũng cung cấp lệnh mariadb-dump (alias mới), dùng lệnh nào cũng được.
  • Tương tự, mysqlmariadb đều dùng để import.
# Trên AlmaLinux với MariaDB
mariadb-dump -u root -p ten_database > backup.sql
mariadb -u root -p ten_database < backup.sql

7. Backup PostgreSQL

Nếu bạn dùng PostgreSQL thay vì MySQL, công cụ tương ứng là pg_dumppsql:

Backup:

pg_dump -U postgres ten_database > backup.sql

Restore:

psql -U postgres ten_database < backup.sql

Backup tất cả databases PostgreSQL:

pg_dumpall -U postgres > all_databases.sql

8. Tự động backup bằng Cron

Backup thủ công dễ quên. Bạn nên thiết lập cron job để tự động backup hàng đêm. Tạo một script backup:

#!/bin/bash
# /root/backup-db.sh

BACKUP_DIR="/root/db-backups" DATE=$(date +%Y-%m-%d) KEEP_DAYS=7

mkdir -p $BACKUP_DIR

# Backup tất cả databases mysqldump -u root --single-transaction --all-databases | gzip > $BACKUP_DIR/all-db-$DATE.sql.gz

# Xóa backup cũ hơn 7 ngày find $BACKUP_DIR -name "*.sql.gz" -mtime +$KEEP_DAYS -delete

echo "Backup completed: $DATE"

Cấp quyền thực thi và thêm vào crontab:

chmod +x /root/backup-db.sh
crontab -e

Thêm dòng sau để chạy lúc 2 giờ sáng mỗi ngày:

0 2 * * * /root/backup-db.sh >> /var/log/backup-db.log 2>&1

Lưu ý về mật khẩu: Để cron chạy không cần nhập password, bạn tạo file /root/.my.cnf:

[mysqldump]
user=root
password=mat_khau_cua_ban

Sau đó phân quyền chặt để chỉ root đọc được:

chmod 600 /root/.my.cnf

Tổng kết

Backup database là thao tác không thể thiếu khi quản trị server. Hãy nhớ các điểm chính: dùng mysqldump cho MySQL/MariaDB, pg_dump cho PostgreSQL, luôn thêm --single-transaction cho InnoDB, nén bằng gzip để tiết kiệm dung lượng, và thiết lập cron để tự động hóa. Đừng đợi đến khi mất dữ liệu mới bắt đầu backup!

Chúc bạn thực hiện thành công!

Chia sẻ:
Bài viết đã được kiểm duyệt bởi AZDIGI Team

Về tác giả

Quân Đỗ Trung

Quân Đỗ Trung

Mình là Quân, hiện đang công tác tại AZDIGI với vai trò SysAdmin. Mình có niềm đam mê với việc viết blog, vì thông qua việc viết lách, mình có thể trau dồi thêm nhiều kỹ năng, học hỏi được nhiều kiến thức mới. Từ đó, mình mong muốn chia sẻ lại cho mọi người những bài viết và tài liệu hữu ích, mang tính thực tiễn cao.

Hơn 10 năm phục vụ 80.000+ khách hàng

Bắt đầu dự án web của bạn với AZDIGI