Cách nhanh nhất để thay đổi kiểu dữ liệu khóa được lập chỉ mục bảng 600 GB từ INT sang BIGINT


12

Tôi cần thay đổi kiểu dữ liệu từ INT thành BIGINT trong bảng MySQL 600GB. Cột có một chỉ mục duy nhất. Tôi có thể tốt với INT không dấu, nhưng tôi cho rằng việc thay đổi điều đó hoặc BIGINT sẽ khá đau đớn. Công cụ của bảng là InnoDB. Điều gì sẽ dễ dàng hơn:

  1. BẢNG BẢNG
  2. Sao chép cấu trúc và INSERT INTO (SELECT *)
  3. Bảng đổ và thay đổi định nghĩa bảng tệp kết xuất
  4. Còn gì nữa không?

CẬP NHẬT: Theo yêu cầu, MySQL ver 5.5.15, không có khóa ngoại và tạo bảng:

 CREATE TABLE `tbl` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `user_id` int(11) NOT NULL,
    `created_at` datetime NOT NULL,
    `tid` bigint(20) NOT NULL,
    `t` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
    `f` tinyint(1) NOT NULL,
    `i_id` bigint(20) NOT NULL,
    `ir_id` int(11) NOT NULL,
    `r_c` int(11) NOT NULL,
    `r` tinyint(1) NOT NULL,
    `e` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
    `t` varchar(5) NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `user` (`user_id`,`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=1657146169 DEFAULT CHARSET=utf8

Xác định nỗi đau, mất thời gian ngắn nhất ....? Kết quả nhanh nhất?

@AlecTeal Hãy dành thời gian ngắn nhất
Noam

Mặc dù nó không trả lời câu hỏi và câu hỏi này đã được thảo luận một cách chắc chắn trước khi cái bàn trở nên lớn, tôi cũng sẽ tìm cách giảm kích thước của bảng này.

1
Phiên bản nào của MySQL? Nó quan trọng như một số phiên bản có ALTER TABLE ONLINE. Bạn có khóa ngoại tham chiếu cột này không? Nó sẽ giúp nếu bạn hiển thị SHOW CREATE TABLE tablename;đầu ra.
ypercubeᵀᴹ

2
Nếu tên trường ngắn giúp giảm kích thước bảng, nó sẽ là 600 MB .
Jon của tất cả các giao dịch

Câu trả lời:


2

Giả sử bảng của bạn không có bất kỳ kích hoạt nào trên đó, bạn nên cân nhắc sử dụng pt-online-schema-changevì nó sẽ cho phép bạn THAY ĐỔI bảng mà không khóa nó.

Nó vẫn sẽ mất một khoảng thời gian hợp lý cho kích thước của bảng.

Ngoài ra, với phương pháp này hoặc với ALTER TABLEbạn, bạn cần đảm bảo rằng bạn có thêm 600 GB dung lượng đĩa để hỗ trợ hai bản sao của bảng trong khi nó đang được xây dựng lại.


Có bất kỳ ước tính thời gian? (Tôi biết nó phụ thuộc vào nhiều yếu tố, nhưng nếu bạn phải đoán, phạm vi sẽ là gì)
Noam

@Noam bạn không cần phải sao chép bảng. Nếu bạn sử dụng bảng Alter, CASST CASE là nó sao chép, nếu bạn đang sử dụng một công cụ trưởng thành, nó sẽ chỉ ghi chú rằng mọi thứ trước đó (một số vị trí trong tệp hoặc một số bản ghi) đều sử dụng int, bất cứ điều gì bài đăng đều sử dụng bigint, cho đến khi bạn tối ưu hóa.

@AlecTeal Bạn có tài liệu tham khảo chính thức nào không?
Noam

@N foam xem câu trả lời của tôi.

1
@Noam Tôi ước tính ALTER TABLEcó thể mất 24 - 96 giờ để chạy. Bạn có thể có được ước tính tốt hơn bằng cách chạy ALTER TABLE trong môi trường thử nghiệm.
Ike Walker

2

Sử dụng bộ công cụ percona pt-online-schema-changesẽ là lựa chọn của tôi trong sản xuất mà không ảnh hưởng đến việc sử dụng. Điều này sẽ thêm một số kích hoạt để có được đồng bằng của bạn và một bảng tạm thời sẽ đổi tên sau khi điều này được thực hiện.

thí dụ:

pt-online-schema-change --alter "CHANGE `id` `id` BIGINT  NOT NULL; " D=DB,t=TABLE

pt là con đường để đi. @Noam FYI: INT-> BIGINT di chuyển trên bảng ~ 270GB với rất nhiều hàng trên ví dụ EC2 với hoạt động ghi khá nặng trên bảng này mất 64 giờ bằng cách sử dụng thay đổi lược đồ trực tuyến.
Jakub Głazik
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.