Tạo hot backups databases MySQL bằng Percona XtraBackup CentOS 7

Một thách thức rất phổ biến khi làm việc với hệ thống cơ sở dữ liệu đang hoạt động là thực hiện sao lưu nóng (hot backups) - nghĩa là tạo bản sao lưu mà không dừng dịch vụ cơ sở dữ liệu hoặc biến nó thành chỉ đọc. 

Đơn giản là sao chép các tệp dữ liệu của cơ sở dữ liệu đang hoạt động thường dẫn đến một bản sao lưu không nhất quán nội bộ. Tức là nó sẽ không sử dụng được hoặc sẽ thiếu giao dịch đã xảy ra trong quá trình sao chép. Ngược lại, việc dừng cơ sở dữ liệu để sao lưu theo lịch trình sẽ làm cho các phần phụ thuộc vào cơ sở dữ liệu của ứng dụng trở nên không khả dụng. 

Percona XtraBackup là một tiện ích mã nguồn mở có thể sử dụng để vượt qua vấn đề này và tạo ra bản sao lưu đầy đủ hoặc tăng tiến và nhất quán cơ sở dữ liệu MySQL, MariaDB và Percona Server khi đang chạy, còn được gọi là hot backups.

Khác với các sao lưu logic do các tiện ích như mysqldump sản xuất, XtraBackup tạo sao lưu vật lý của các tệp dữ liệu - nó tạo bản sao của các tệp dữ liệu. Sau đó, nó áp dụng nhật ký giao dịch (còn được gọi là nhật ký redo) vào các bản sao lưu vật lý để chèn đầy đủ các giao dịch đang hoạt động mà không hoàn thành trong quá trình tạo bản sao lưu. Kết quả là sao lưu nhất quán của cơ sở dữ liệu đang chạy. 

Kết quả bản sao lưu cơ sở dữ liệu sau đó có thể được sao lưu lên một vị trí từ xa bằng cách sử dụng rsync, một hệ thống sao lưu như Bacula hoặc sao lưu của DigitalOcean.

Hướng dẫn này sẽ chỉ cho bạn cách thực hiện một hot backups đầy đủ của cơ sở dữ liệu MySQL hoặc MariaDB bằng cách sử dụng Percona XtraBackup trên CentOS Quá trình khôi phục cơ sở dữ liệu từ bản sao lưu cũng được nói đến chi tiết.

Yêu cầu trước khi tạo hot backups databases MySQL bằng Percona XtraBackup

Để tuân thủ hướng dẫn này, bạn phải có những điều sau đây:

  • Quyền superuser trên hệ thống CentOS 7
  • Một cơ sở dữ liệu MySQL hoặc MariaDB đang chạy
  • Truy cập vào người dùng quản trị (root) của cơ sở dữ liệu

Ngoài ra, để thực hiện một bản hot backups cơ sở dữ liệu, hệ thống cơ sở dữ liệu của bạn phải sử dụng động cơ lưu trữ InnoDB. Điều này là vì XtraBackup dựa vào nhật ký giao dịch mà InnoDB duy trì. Nếu cơ sở dữ liệu của bạn đang sử dụng động cơ lưu trữ MyISAM, bạn vẫn có thể sử dụng XtraBackup nhưng cơ sở dữ liệu sẽ bị khóa trong một khoảng thời gian ngắn vào cuối quá trình sao lưu.

Kiểm tra động cơ lưu trữ (Storage Engine)

Nếu bạn không chắc chắn về động cơ lưu trữ nào được sử dụng trong cơ sở dữ liệu, bạn có thể tìm hiểu thông tin đó thông qua một số phương pháp. Một trong những cách đó là sử dụng giao diện điều khiển MySQL để chọn cơ sở dữ liệu cần kiểm tra, sau đó xuất thông tin trạng thái của từng bảng.

Trước tiên, nhập vào giao diện điều khiển MySQL bằng cách thực hiện lệnh sau:

$ mysql -u root -p

Sau khi nhập mật khẩu root của MySQL, tại dấu nhắc MySQL, bạn hãy chọn cơ sở dữ liệu mà bạn muốn kiểm tra. Hãy đảm bảo thay thế tên cơ sở dữ liệu vào đây:

mysql> USE database_name;

Tiếp theo, hãy in trạng thái của các bảng trong cơ sở dữ liệu đó bằng cách sử dụng lệnh sau:

mysql> SHOW TABLE STATUS\G;

“Engine” phải được chỉ định cho mỗi hàng trong cơ sở dữ liệu:

Example Output:
...
***************************  row ***************************
           Name: wp_users
         Engine: InnoDB
...

Khi bạn đã hoàn tất, hãy rời khỏi bảng điều khiển:

mysql> exit

Cách tạo hot backups databases MySQL bằng Percona XtraBackup CentOS 7

Cài đặt Percona XtraBackup

Vì chúng ta tạo hot backups bằng Percona XtraBackup nên việc đầu tiên là phải cài đặt Percona XtraBackup. Cách dễ nhất để cài đặt Percona XtraBackup là sử dụng yum, vì kho lưu trữ của Percona cung cấp gói RPM.

$ sudo yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm

Sau đó, bạn có thể chạy lệnh này để cài đặt XtraBackup:

$ sudo yum install percona-xtrabackup

Chấp nhận bất kỳ xác nhận nào để hoàn tất việc cài đặt.

XtraBackup chủ yếu bao gồm chương trình XtraBackup và kịch bản Perl innobackupex mà chúng ta sẽ sử dụng để tạo các bản sao lưu của cơ sở dữ liệu.

Các chuẩn bị đầu tiên 

Trước khi sử dụng XtraBackup lần đầu tiên, chúng ta cần chuẩn bị hệ thống và người dùng MySQL mà XtraBackup sẽ sử dụng. Phần này sẽ hướng dẫn chuẩn bị ban đầu.

  • Người dùng hệ thống

Trừ khi bạn dự định sử dụng người dùng root của hệ thống thì phải thực hiện một số chuẩn bị cơ bản để đảm bảo XtraBackup có thể chạy đúng cách. Chúng ta sẽ giả định bạn đã đăng nhập với người dùng sẽ chạy XtraBackup và người dùng này có đặc quyền siêu người dùng (superuser).

Thêm người dùng hệ thống của bạn vào nhóm "mysql" (thay thế bằng tên người dùng thực tế của bạn):

$ sudo gpasswd -a username mysql

Hãy tạo một thư mục sẽ được sử dụng để lưu trữ các bản sao lưu mà XtraBackup tạo ra:

$ sudo mkdir -p /data/backups
$ sudo chown -R username: /data

Lệnh chown đảm bảo rằng người dùng có thể ghi dữ liệu vào thư mục sao lưu.

  • Người dùng MySQL

XtraBackup yêu cầu một người dùng MySQL mà nó sẽ sử dụng khi tạo bản sao lưu. Bây giờ hãy tạo một người dùng như sau:

Mở bảng điều khiển MySQL bằng lệnh sau:

$ mysql -u root -p

Nhập mật khẩu gốc của MySQL.

Tại dấu nhắc MySQL, hãy tạo một người dùng MySQL mới và gán mật khẩu cho nó. Ví dụ, ta sẽ gọi người dùng này là "bkpuser" và mật khẩu là "bkppassword". Hãy thay đổi cả hai thông tin này thành một mật khẩu an toàn hơn:

mysql> CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY 'bkppassword';

Tiếp theo, cấp quyền reload, lock và replication cho người dùng MySQL mới này ở tất cả các cơ sở dữ liệu:

mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost';
mysql> FLUSH PRIVILEGES;

Đây là những đặc quyền tối thiểu cần thiết mà XtraBackup yêu cầu để tạo các bản sao lưu đầy đủ của các cơ sở dữ liệu.

Sau khi hoàn tất, thoát khỏi bảng điều khiển MySQL bằng lệnh sau:

mysql> exit

Bây giờ chúng ta đã sẵn sàng để tạo một hot backups đầy đủ của các cơ sở dữ liệu.

Thực hiện sao lưu đầy đủ nhanh chóng (hot backups)

Phần này sẽ hướng dẫn các bước cần thiết để tạo một bản sao lưu đầy đủ nhanh chóng (hot backups) của cơ sở dữ liệu MySQL bằng XtraBackup. Sau khi đảm bảo quyền truy cập tệp tin của cơ sở dữ liệu được thiết lập chính xác, chúng ta sẽ sử dụng XtraBackup để tạo bản sao lưu, sau đó chuẩn bị cho nó.

  • Cập nhật quyền Datadir

Trên CentOS 7, các tệp dữ liệu của MySQL được lưu trữ trong thư mục /var/lib/mysql mà thỉnh thoảng được gọi là "datadir". Theo mặc định, quyền truy cập vào datadir được giới hạn cho người dùng "mysql". 

XtraBackup yêu cầu truy cập vào thư mục này để tạo bản sao lưu. Vì vậy hãy thực hiện một số lệnh sau để đảm bảo rằng người dùng hệ thống mà chúng ta đã thiết lập trước đó: là thành viên của nhóm "mysql", có các quyền truy cập cần thiết.

$ sudo chown -R mysql: /var/lib/mysql
$ sudo find /var/lib/mysql -type d -exec chmod 775 "{}" \;

Các lệnh này đảm bảo rằng tất cả các thư mục trong datadir đều có thể truy cập được bởi nhóm "mysql" và nên được thực hiện trước mỗi lần sao lưu.

If you added your user to the mysql group in the same session, you will need to login again for the group membership changes to take effect.
  • Tạo bản backup

Bây giờ chúng ta đã sẵn sàng để tạo bản sao dự phòng. Khi cơ sở dữ liệu MySQL đang chạy, hãy sử dụng tiện ích innobackupex để thực hiện việc đó. Chạy lệnh bên dưới sau khi cập nhật tên người dùng và mật khẩu để phù hợp với đăng nhập người dùng MySQL của bạn:

$ innobackupex --user=bkpuser  --password=bkppassword --no-timestamp /data/backups/new_backup

Điều này sẽ tạo ra một bản sao dự phòng của cơ sở dữ liệu tại vị trí được chỉ định, /data/backups/new_backup:

innobackupex output
innobackupex: Backup created in directory '/data/backups/new_backup'
150420 13:50:10  innobackupex: Connection to database server closed
150420 13:50:10  innobackupex: completed OK!

Hoặc bạn có thể bỏ qua tùy chọn --no-timestamp để XtraBackup tạo một thư mục sao lưu dựa trên thời gian hiện tại, như sau:

$ innobackupex --user=bkpuser  --password=bkppassword /data/backups

Điều này sẽ tạo ra một bản sao dự phòng của cơ sở dữ liệu trong một thư mục con được tạo tự động, như sau:

innobackupex output — no timestamp
innobackupex: Backup created in directory '/data/backups/2015-04-20_13-50-07'
150420 13:50:10  innobackupex: Connection to database server closed
150420 13:50:10  innobackupex: completed OK!

Bất kể bạn chọn phương pháp nào, nó đều sẽ hiển thị thông báo "innobackupex: completed OK!" ở dòng cuối cùng của đầu ra. Một bản sao dự phòng thành công sẽ dẫn đến việc sao chép thư mục datadir của cơ sở dữ liệu, nhưng trước khi có thể sử dụng, nó phải được chuẩn bị một số thứ.

Chuẩn bị sao lưu

Bước cuối cùng trong việc tạo hot backups bằng XtraBackup là chuẩn bị nó. Điều này bao gồm "phát lại" nhật ký giao dịch để áp dụng bất kỳ giao dịch chưa hoàn thành nào vào sao lưu. Chuẩn bị bản sao lưu sẽ làm cho dữ liệu của nó nhất quán và có thể sử dụng để khôi phục.

Theo ví dụ của chúng ta, chúng ta sẽ chuẩn bị bản sao lưu đã được tạo ra trong đường dẫn /data/backups/new_backup. Thay thế điều này bằng đường dẫn tới bản sao lưu thực tế của bạn:

$ innobackupex --apply-log /data/backups/new_backup

Một lần nữa, bạn sẽ thấy dòng "innobackupex: completed OK!" là dòng cuối cùng của đầu ra.

Bản sao lưu cơ sở dữ liệu của bạn đã được tạo và đã sẵn sàng để khôi phục cơ sở dữ liệu. Nếu bạn có hệ thống sao lưu tập tin như Bacula, bản sao lưu cơ sở dữ liệu này nên được bao gồm vào phần lựa chọn sao lưu của bạn.

Phần tiếp theo sẽ giới thiệu cách khôi phục cơ sở dữ liệu từ bản sao lưu mà chúng ta vừa tạo.

Thực hiện khôi phục sao lưu

Để khôi phục cơ sở dữ liệu bằng XtraBackup, trước tiên phải dừng dịch vụ MySQL và đảm bảo rằng thư mục datadir của nó trống.

Dừng dịch vụ MySQL bằng lệnh sau:

$ sudo systemctl stop mariadb

Tiếp theo, hãy di chuyển hoặc xóa nội dung của thư mục datadir (/var/lib/mysql). Trong ví dụ của chúng ta, chúng ta sẽ đơn giản chỉ di chuyển nó đến một vị trí tạm thời:

$ mkdir /tmp/mysql
$ mv /var/lib/mysql/* /tmp/mysql/

Bây giờ, chúng ta có thể khôi phục cơ sở dữ liệu từ bản sao lưu, "new_backup":

$ innobackupex --copy-back /data/backups/new_backup

Nếu quá trình khôi phục thành công, dòng cuối cùng của đầu ra sẽ hiển thị "innobackupex: completed OK!".

Các tệp đã được khôi phục trong datadir có thể thuộc về người dùng mà bạn đã chạy quá trình khôi phục. Hãy thay đổi quyền sở hữu trở lại cho người dùng "mysql" để MySQL có thể đọc và ghi các tệp:

$ sudo chown -R mysql: /var/lib/mysql

Bây giờ chúng ta đã sẵn sàng để khởi động MySQL:

$ sudo systemctl start mariadb

Cơ sở dữ liệu MySQL của bạn đã được khôi phục thành công và đang hoạt động. Bây giờ khi bạn đã có thể tạo hot backups của cơ sở dữ liệu MySQL bằng Percona XtraBackup. 

Tuy nhiên có một số điều mà bạn nên xem xét thiết lập. Đầu tiên, nên tự động hóa quá trình này để bạn có thể tạo bản sao lưu theo lịch trình. Thứ hai, bạn nên tạo bản backup từ xa của các bản sao lưu này, phòng trường hợp máy chủ cơ sở dữ liệu gặp sự cố bằng cách sử dụng rsync, một hệ thống sao lưu tập tin qua mạng như Bacula hoặc các bản sao lưu của DigitalOcean. Sau cùng, bạn nên xem xét xoay vòng các bản sao lưu (xóa bản sao lưu cũ theo lịch trình) và tạo bản sao lưu mới (sử dụng XtraBackup) để tiết kiệm không gian đĩa.

Mọi người cũng tìm kiếm: xtrabackup, percona xtrabackup, xtrabackup mariadb, xtrabackup mysql, mysql xtrabackup

Mọi người cùng tìm kiếm: percona xtrabackup, xtrabackup, xtrabackup mysql, innobackupex, extrabackup, percona-xtrabackup, bacula backup

Các gói dịch vụ Cloud VPS của KDATA mang đến cho bạn nhiều lựa chọn về hiệu suất cũng như khả năng lưu trữ, mọi nhu cầu về doanh nghiệp đều được đáp ứng. KDATA đảm bảo khả năng uptime lên đến 99,99%, toàn quyền quản trị và free backup hằng ngày. Tham khảo ngay các gói dịch vụ Cloud VPS:

https://kdata.vn/cloud-vps

👉 Liên hệ ngay KDATA hỗ trợ tận tình, support tối đa, giúp bạn trải nghiệm dịch vụ giá hời chất lượng tốt nhất