Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách thực hiện sao lưu và khôi phục cơ sở dữ liệu MySQL hoặc MariaDB bằng công cụ dòng lệnh mysqldump.
Tệp sao lưu được tạo bởi mysqldump thực chất là một lệnh MySQL có thể được sử dụng để khôi phục cơ sở dữ liệu gốc. Mysqldump cũng hỗ trợ tạo tệp sao lưu ở định dạng CSV và XML.
Bạn cũng có thể sử dụng mysqldump để di chuyển cơ sở dữ liệu MySQL của bạn từ một máy chủ sang máy chủ khác.
Nếu bạn không sao lưu cơ sở dữ liệu của mình, rủi ro mất dữ liệu do lỗi phần mềm hoặc lỗi ổ cứng có thể là một thảm họa không thể khôi phục được. Để tiết kiệm thời gian và đảm bảo an toàn dữ liệu, tôi khuyên bạn nên thực hiện sao lưu đều đặn cho cơ sở dữ liệu của mình.
I. Cú Pháp của Mysqldump
Trước khi bắt đầu sử dụng mysqldump, hãy xem qua cú pháp cơ bản.
Cấu trúc của lệnh mysqldump như sau:
mysqldump [option] > file.sql
option – các tùy chọn của mysqldump
file.sql – tên tệp để lưu trữ sao lưu cơ sở dữ liệu
Để sử dụng mysqldump, bạn phải có quyền truy cập vào máy chủ MySQL.
II. Sao Lưu Cơ Sở Dữ Liệu Đơn Giản
Trường hợp sử dụng phổ biến nhất của mysqldump là để sao lưu một cơ sở dữ liệu.
Ví dụ: để tạo một bản sao lưu của cơ sở dữ liệu có tên là “database_name”, sử dụng quyền của người dùng “root” và lưu vào tệp “database_name.sql”, hãy chạy lệnh sau:
bash
mysqldump -u root -p database_name > database_name.sql
Bạn sẽ được yêu cầu nhập mật khẩu cho người dùng “root”. Sau khi xác minh mật khẩu thành công, quá trình sao lưu dữ liệu sẽ bắt đầu. Thời gian thực hiện phụ thuộc vào kích thước cơ sở dữ liệu và bạn cần đợi quá trình hoàn thành.
Nếu bạn đăng nhập với một người dùng khác, có quyền sao lưu mà không cần mật khẩu, bạn có thể bỏ qua các tùy chọn -u và -p:
bash
mysqldump database_name > database_name.sql
III. Sao Lưu Nhiều Cơ Sở Dữ Liệu
Để sao lưu nhiều cơ sở dữ liệu bằng một lệnh, sử dụng tùy chọn –database và theo sau là các tên cơ sở dữ liệu bạn muốn sao lưu. Mỗi tên cơ sở dữ liệu được phân tách bằng dấu cách.
bash
mysqldump -u root -p --databases database_name_a database_name_b > databases_a_b.sql
Lệnh trên sẽ tạo một tệp sao lưu chứa cả cơ sở dữ liệu A và B.
IV. Sao Lưu Tất Cả Các Cơ Sở Dữ Liệu Trong Máy Chủ
Sử dụng tùy chọn –all-databases để sao lưu toàn bộ cơ sở dữ liệu của bạn.
bash
mysqldump -u root -p --all-databases > all_databases.sql
Tương tự như ví dụ trước, lệnh này sẽ tạo ra một bản sao lưu duy nhất chứa tất cả các cơ sở dữ liệu trên máy chủ của bạn.
V. Sao Lưu Tất Cả Các Cơ Sở Dữ Liệu Vào Nhiều Tệp
Mysqldump không hỗ trợ tùy chọn sao lưu tất cả các cơ sở dữ liệu vào nhiều tệp, nhưng bạn có thể thực hiện điều này dễ dàng bằng cách sử dụng vòng lặp FOR trong bash:
bash
for DB in $(mysql -e 'show databases' -s --skip-column-names); do
mysqldump $DB > "$DB.sql";
done
Lệnh trên sẽ tạo ra các tệp sao lưu khác nhau cho mỗi cơ sở dữ liệu.
VI. Tạo Bản Sao Lưu Nén với Thời Gian
Nếu kích thước của cơ sở dữ liệu lớn, việc nén có thể là ý tưởng tốt để tạo ra một tệp sao lưu. Để thực hiện điều này, chỉ cần chuyển đầu ra thành tệp gzip:
bash
mysqldump database_name | gzip > database_name.sql.gz
VII. Tạo Bản Sao Lưu với Điều Chỉnh Thời Gian
Nếu bạn muốn giữ nhiều bản sao lưu trong cùng một thư mục, bạn có thể thêm ngày hiện tại để phân biệt giữa các tệp sao lưu:
bash
mysqldump database_name > database_name-$(date +%Y%m%d).sql
Lệnh trên sẽ tạo ra một tệp có định dạng như sau: “database_name-20180617.sql”
VIII. Khôi Phục Cơ Sở Dữ Liệu Đã Sao Lưu
Bạn có thể khôi phục cơ sở dữ liệu bằng cách sử dụng mysql. Cú pháp như sau:
bash
mysql -u root -p -e "create database database_name";
mysql -u root -p database_name < database_name.sql
Trong hầu hết các trường hợp, bạn sẽ cần phải tạo ra cơ sở dữ liệu trước, nếu chưa tồn tại.
Trong ví dụ dưới đây, lệnh đầu tiên sẽ tạo ra một cơ sở dữ liệu có tên là “database_name” và sau đó sẽ nhập tệp sao lưu “database_name.sql” vào nó:
bash
mysql -u root -p -e "create database database_name";
mysql -u root -p database_name < database_name.sql
IX. Khôi Phục Một Cơ Sở Dữ Liệu từ Tệp Sao Lưu Tất Cả Các Cơ Sở Dữ Liệu
Nếu bạn đã sao lưu tất cả cơ sở dữ liệu của mình bằng tùy chọn –all-databases và bạn muốn khôi phục một cơ sở dữ liệu duy nhất từ tệp sao lưu, bạn có thể sử dụng tùy chọn –one-database như dưới đây:
bash
mysql --one-database database_name < all_databases.sql
X. Xuất hoặc Nhập Cơ Sở Dữ Liệu bằng Một Dòng Lệnh
Thay vì tạo ra một tệp sao lưu và sau đó nhập tệp đó vào một cơ sở dữ liệu khác, bạn có thể sử dụng cách sau để làm nhanh chóng:
bash
mysqldump -u root -p database_name | mysql -h remote_host -u root -p remote_database_name
Lệnh trên sẽ chuyển đầu ra đến máy chủ MySQL client ở remote_host và nhập vào cơ sở dữ liệu có tên là remote_database_name. Trước khi chạy lệnh, đảm bảo rằng cơ sở dữ liệu đã tồn tại trên máy chủ remote.
XI. Tự Động Sao Lưu với Công Việc Cron
Tự động hóa sao lưu cơ sở dữ liệu đơn giản như một công việc định kỳ, lệnh mysqldump sẽ chạy vào thời gian bạn chỉ định.
Để cài đặt sao lưu tự động cơ sở dữ liệu bằng cronjob, làm theo các bước sau:
1. Tạo một tệp .my.cnf tại đường dẫn home:
bash
sudo nano ~/.my.cnf
2. Sao chép và dán đoạn mã sau vào đó:
bash
[client]
user = dbuser
password = dbpasswd
Hãy nhớ thay thế “dbuser” và “dbpasswd” bằng tên người dùng và mật khẩu của máy chủ MySQL.
3. Hạn chế quyền truy cập cho tệp thông tin chỉ cho người dùng bạn muốn có quyền truy cập:
bash
chmod 600 ~/.my.cnf
4. Tạo một thư mục để lưu trữ các tệp sao lưu:
bash
mkdir ~/db_backups
5. Mở tệp crontab:
bash
crontab -e
6. Thêm lệnh như ví dụ sau để cronjob chạy sao lưu cơ sở dữ liệu vào 3 giờ sáng mỗi ngày:
bash
0 3 * * * /usr/bin/mysqldump -u dbuser mydb > /home/username/db_backups/mydb-$(date +%Y%m%d).sql
Hãy đảm bảo thay thế “username” bằng tên người dùng thực tế.
7. Bạn cũng có thể tạo một tệp cronjob để xóa các bản sao lưu cũ hơn 30 ngày:
bash
find /đường/dẫn/tới/sao_lưu -type f -name "*.sql" -mtime +30 -delete
Tất nhiên, bạn cần sửa đường dẫn và tên tệp.