DEV Community

Tai Ha for AWS Community ASEAN

Posted on

Cách thay đổi bảng MySQL lớn bằng Percona Toolkit trên EC2 và AWS Aurora !!

Gần đây, tôi đã phải thêm một cột mới vào một bảng khá lớn (khoảng 100 triệu dòng) trong cụm MySQL chạy trên AWS Aurora.

Tôi đã thử với câu lệnh bên dưới

ALTER [table] ADD column [column] AFTER [column]

Tuy nhiên nó sẽ ảnh hưởng đến hệ thống database và hệ thống xử lý logic, hoặc thậm chí sai lệch về mặt dữ liệu và có thể sẽ phải dừng hệ thống !!

Tôi có giải pháp :

  1. Tạo bảng mới, trống với schema đã thay đổi
  2. Tạo trigger chèn, xóa và cập nhật trên bảng cũ để đảm bảo tất cả các thay đổi được tự động sao chép vào bảng mới
  3. Thực hiện sao chép dữ liệu bảng cũ vào bảng mới theo từng phần
  4. Khi đồng bộ, thay thế bảng mới bằng bảng cũ bằng cách đổi tên cả hai lần lượt.

Ý tưởng khá là ổn, tôi định thực hiện thủ công tuy nhiên tôi đã được một vài người bạn giới thiệu công cụ giúp tôi làm việc đó.

Tôi cần chuẩn bị:

  1. Bảng dữ liệu lớn sử dụng RDS AWS
  2. Máy chủ EC2 cài đặt 'pt-online-schema-change'
  3. Sửa đổi 1 chút cấu hình trên RDS

Thực hiện
Bước 1 : Chỉnh sửa parameter group trên AWs RDS
binlog_checksum = CRC3
log_bin_trust_function_creators = true

Image description

Bước 2. Kết nối EC2
ssh -i /path/to/my/private/key.pem username@ec2.ip.address

hoặc tôi sử dụng AWS Console

Bước 3. Kết nối từ EC2 với RDS
https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.MySQL.html

sudo dnf install mariadb105
mysql -h demo-large-db.xxxxxx.ap-northeast-1.rds.amazonaws.com -P 3306 -u admin -p

Image description
Bước 4. Cài đặt Percona Toolkit.

yum install perl-core
yum install "perl(ExtUtils::MakeMaker)"
yum install "perl(Time::HiRes)"
yum install "perl(DBD::mysql)"
yum install "perl(Term::ReadKey)"
yum install "perl(IO::Socket::SSL)"
yum install "perl(Digest::MD5)"
rpm -Uvh https://downloads.percona.com/downloads/percona-toolkit/3.6.0/binary/redhat/8/x86_64/percona-toolkit-3.6.0-1.el8.x86_64.rpm

Bước 5. Thực hiện việc thay đổi bảng
Quá trình này có thể mất vài giờ, vì vậy hãy tạo phiên screen
screen -S schema_change
Kiểm tra Database trước khi thay đổi

Image description

Bắt đầu thay đổi bảng với 'pt-online-schema-change'
pt-online-schema-change --execute --recursion-method none --progress percentage,1 --alter "ADD COLUMN [columnt] INT DEFAULT NULL" h=[db_host],D=[database],t=[table],u=[user],p=[password]

Image description

Image description

Một vài lời về các tham số đã sử dụng:
--execute để biết giải thích chính xác, hãy đọc tại đây: https://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html
--recursion-method none ngăn chặn việc thực hiện kiểm tra đối với bản sao nội bộ của Aurora, nếu không bị vô hiệu hóa, điều này sẽ gây ra lỗi kết nối

Cannot connect to [database]
No slaves found. See --recursion-method if host [host] has slaves.
--alter câu lệnh sẽ được chạy trên bảng mới
--progress percentage,1 hiển thị tiến độ phần trăm của quá trình

Việc thay đổi đã bắt đầu. Tại thời điểm này, bạn sẽ thấy bảng mới trong cơ sở dữ liệu được gọi là _[tablename]_new. Khi dữ liệu đang được di chuyển, chúng ta có thể thoát khỏi quá trình screen bằng tổ hợp phím CTRL + A + D.

Khi quá trình đã hoàn tất, hãy quay lại phiên screen của chúng ta.
screen -r schema_change

Image description

Tại thời điểm này, bạn sẽ thấy báo cáo tương tự:

Copied rows OK.
Analyzing new table...
Swapping tables...
Swapped original and new tables OK.
Dropping old table...
Dropped old table [old_table] OK.
Dropping triggers...
Dropped triggers OK.
Successfully altered [table]
Enter fullscreen mode Exit fullscreen mode

Xong! mọi thứ đã sẵn sàng và bảng của bạn đã được cập nhật.

Percona đã làm một công việc tuyệt vời. Nhờ công cụ thông minh này, tôi đã có thể hoàn thành cập nhật schema quan trọng mà không ảnh hưởng đến môi trường sản xuất.

Để biết thêm thông tin về Percona Toolkit, hãy truy cập percona.com

Top comments (0)