Sao lưu và phục hồi mysql dung lượng lớn trên docker với mysqldump

mysqldump chưa phải là công cụ xịn xò nhất để sao lưu mysql, nhưng với dung lượng 46GB trên docker, tốc độ sao lưu khoảng 15 phút là khá tốt. Tuy nhiên, bạn phải cài đặt một số công cụ hỗ trợ.

Minh hoạ mối quan hệ trong Docker giữa (host) và container.

Đây là lệnh dùng để backup chạy trong docker container mysql.

mysqldump -u root -p --quick --verbose vietnamese_news_big_corpus | pigz -p 2 | pv > /var/lib/mysql/vietnamese_news_big_corpus.sql.gz

Các bước thực hiện như sau:

1) Đầu tiên mình login vào trong docker container của mysql:

sudo docker exec -it mysql bash

2) Tiếp đến mình cài pigz, và pv. Đây là các công cụ hiển thị tiến độ backup của mysqldump (pv) và nén pigz đa luồng. Chú ý mysql docker dùng yum.

3) Khi đang trong docker container của mysql, mình vào mysql

mysql -u root -p -h 127.0.0.1

Xem giá trị của innodb_buffer_pool_size

SHOW VARIABLES LIKE ‘innodb_buffer_pool_size’;

Mặc định là 128 MB.

Thiết lập giá trị tạm thời lên 2GB

SET GLOBAL innodb_buffer_pool_size = 2147483648;

và check lại với SHOW VARIABLES LIKE ‘innodb_buffer_pool_size’;

Vì mình mount dữ liệu trên mysql trên docker container và trên host thông qua thư mục /var/lib/mysql/ (của docker containter), nên khi sao lưu và tạo file vietnamese_news_big_corpus.sql.gz thì mình để vào trong thư mục trên luôn, có nghĩa trên host cũng có dữ liệu này.

Điều này cũng đồng nghĩa, khi muốn sao lưu, bạn phải đưa dữ liệu file sql vào trong thư mục /var/lib/docker/volumes/mysql_data/_data trên host (Giả sử bạn đặt tên cho volume dùng với mysql là mysql_data). Sau đó, bạn đăng nhập vào trong container, tới thư mục /var/lib/mysql/ thì mới thấy được tập tin sql muốn restore.

Giả sử, nếu bạn backup trên VPS mà mysql trên host thay vì trong docker, thì dễ hơn nhiều. Login vào VPS và chạy lệnh sau:

mysqldump -u tiengviet_corpus -p --quick --verbose tiengviet_corpus | pigz -p 2 | pv > tiengviet_corpus.sql.gz

Nhập mật khẩu của user tiengviet_corpus. Trong lệnh trên thì tiengviet_corpus là user, là tên của database hiện tại và cũng là tên của file sẽ xuất ra dạng nén sql.gz.

Kết quả sao lưu 93.2 GB tập tin mysql, nén còn 20.4 GB, thời gian 34 phút.

Một số công cụ khác chưa thử gồm https://github.com/mydumper/mydumperhttps://github.com/percona/percona-xtrabackup

Restore

Upload file sql nén lên server mới. Chuyển dữ liệu tập tin sql tới volume của docker dành cho container mysql (giả sử là /var/lib/docker/volumes/mysql_data/_data ), sau đó vào container mới thấy được dữ liệu của host tại /var/lib/mysql/.

Cài pv và gunzip.

  1. Check OS cat /etc/os-release, ví dụ mình gặp Oracle Linux thì các lệnh cài cũng khác với Ubuntu.
  2. Cài pv, gunzip tương ứng.

Chạy dòng lệnh sau:

pv your_big_corpus.sql.gz | gunzip | mysql -u username -p database_name

Nhập password của database.

Bạn cần kiểm tra xem gunzip (giải nén) và pv (Xem tiến độ) có trên server mới (trong container mysql hay không). Cách trên giúp mình không phải giản nén file gz vì ổ đĩa có thể không đủ dung lượng.

Thực ra, trên host, bạn vẫn có thể import tới mysql trên container được.

pv vietnamese_news_big_corpus.sql.gz | gunzip | docker exec -i mysql-container mysql -u root -p vietnamese_news_big_corpus

Đây là kết quả khôi phục 93 GB, khoảng hơn 1 tiếng.

Verify

Kiểm tra xem row cuối đã khớp giữa 2 database hay chưa:

SELECT * FROM vietnamese_corpus_vtsnlp ORDER BY id DESC LIMIT 1

Còn trở lại với bài viết này ở phần sau khi thử nghiệm với mydumper, link:

https://safoorsafdar.com/post/my-journey-to-export-import-large-mysql-data

Còn đây là một gist chưa thử dùng khác:

https://gist.github.com/o5/8bf57b3e5fa4649a81a4449787ba3691

Leave a Comment