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 :
- Tạo bảng mới, trống với schema đã thay đổi
- 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
- Thực hiện sao chép dữ liệu bảng cũ vào bảng mới theo từng phần
- 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ị:
- Bảng dữ liệu lớn sử dụng RDS AWS
- Máy chủ EC2 cài đặt 'pt-online-schema-change'
- 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
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
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
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]
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
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]
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)