Tôi có một quá trình di chuyển trong Rails thực hiện như sau:
lớp AddMissingIndexes < ActiveRecord::Migration[5.1]
định nghĩa thay đổi
# Ứng dụng
add_index :ứng dụng, :evid, độ dài: { evid: 255 }
kết thúc
kết thúc
Điều này dường như là của tôimôi trường thử nghiệm
Chạy trơn tru
Tuy nhiên, khi tôi ở trongmôi trường sản xuấtTôi gặp lỗi này khi chạy di chuyển trong:
Mysql2::Error: Khóa được chỉ định quá dài; độ dài khóa tối đa là 767 byte: CREATE INDEX `index_applications_on_evid` ON `applications` (`evid`(255))
Tôi đang cố gắng sử dụng câu hỏi này Để giải quyết vấn đề này, câu trả lời thứ hai trong
lớp AddMissingIndexes < ActiveRecord::Migration[5.1]
định nghĩa thay đổi
# Ứng dụng
add_index "ứng dụng", ["evid"], :name => :evid, :length => { :evid => 255 }
kết thúc
kết thúc
Tuy nhiên, trước khi thực hiện thêm bất kỳ thay đổi nào đối với lược đồ, tôi muốn đảm bảo rằng lược đồ đó hoạt động bình thường. Vì vậy, tôi cần có khả năng tái tạo lỗi này trong môi trường thử nghiệm của mình.
Môi trường thử nghiệm:
+--------------------------+-------------------+
| Tên_biến | Giá_trị |
+--------------------------+-------------------+
| phiên bản innodb | 5.5.62 |
| phiên bản giao thức | 10 |
| chuyển đổi loại nô lệ | |
| phiên bản | 5.5.62-0+deb8u1 |
| phiên bản_bình luận | (Debian) |
| máy_biên_bản_phiên_bản | x86_64 |
| phiên bản_biên_biên_os | debian-linux-gnu |
+--------------------------+-------------------+
môi trường sản xuất
+--------------------------+----------------------+
| Tên_biến | Giá_trị |
+--------------------------+----------------------+
| phiên bản innodb | 5.6.40 |
| phiên bản giao thức | 10 |
| chuyển đổi loại nô lệ | |
| phiên bản | 5.6.40-log |
| version_comment | Phân phối nguồn |
| máy_biên_bản_phiên_bản | x86_64 |
| phiên bản_biên_biên_os | Linux |
+--------------------------+----------------------+
sử dụng HIỂN THỊ CÁC BIẾN TOÀN CẦU NHƯ 'innodb_%';
Tôi đã có thể xem cơ sở dữ liệu môi trường thử nghiệm của mình và đây là điều tôi phát hiện ra rằng môi trường cơ sở dữ liệu cục bộ của mình có các biến sau như hiển thị bên dưới:
môi trường thử nghiệm
innodb_file_format=Cá nhồng;
innodb_large_prefix=1;
innodb_file_per_table=1;
innodb_file_format_max=Cá nhồng;
innodb_strict_mode=1;
character_set_server='utf8mb4';
môi trường sản xuất
innodb_file_format=Linh dương;
innodb_large_prefix=TẮT;
innodb_file_per_table=BẬT;
innodb_file_format_max=Linh dương;
innodb_strict_mode=TẮT;
character_set_server='utf8mb4';
Tôi đã thử tái tạo môi trường sản xuất của mình, đặt biến thành 1 mỗi lần. Nhưng vô ích.
Chạy trong môi trường thử nghiệm và sản xuất của bạn HIỂN THỊ TẠO BẢNG ứng dụng\G
. Tôi dự đoán sự khác biệt sẽ là:
Bài kiểm tra:
TẠO BẢNG `applications` (
...
`evid` varchar(255) MẶC ĐỊNH NULL
) ENGINE=InnoDB MẶC ĐỊNH CHARSET=utf8
Sản xuất:
TẠO BẢNG `applications` (
...
`evid` varchar(255) MẶC ĐỊNH NULL
) ENGINE=InnoDB MẶC ĐỊNH CHARSET=utf8mb4
Theo trạng thái lỗi, chỉ mục phải có khả năng chứa 767 byte. Bộ ký tự utf8 tính mỗi ký tự là 3 byte để đạt đến giới hạn này, vì vậy 3*255 = 765, phù hợp với yêu cầu.
Và utf8mb4 đếm 4 byte cho mỗi ký tự. 4*255 = 1020, quá dài.
Khi bạn sử dụng utf8mb4, bạn có thể lập chỉ mục VARCHAR(191) để duy trì trong phạm vi 767 byte.
Ngoài ra, bạn có thể sử dụng định dạng hàng InnoDB mới hơn để hỗ trợ kích thước chỉ mục tối đa là 3072 byte. Nhìn thấy mysql thay đổi innodb_large_prefix
Nếu bạn muốn tránh những điều bất ngờ này, điều quan trọng là phải chạy cùng một phiên bản MySQL trong quá trình thử nghiệm và sản xuất, đồng thời đảm bảo bạn giữ các tùy chọn cấu hình MySQL càng giống nhau càng tốt và đảm bảo các định nghĩa bảng giống nhau.
Cập nhật lại câu hỏi của bạn bằng cách sử dụng các biến cấu hình innodb.
Tôi thấy rằng việc thiết lập môi trường sản xuất của bạn có nghĩa là nó không thể xác định các bảng bằng định dạng tệp Barracuda, nghĩa là không có định dạng hàng NĂNG ĐỘNG, nghĩa là không có tiền tố innodb_large
。
Bạn sẽ cần phải khớp các cài đặt với môi trường thử nghiệm của mình và sau đó bạn có thể cần phải xây dựng lại bảng của mình để nó thực sự ở định dạng Barracuda với định dạng hàng động.
Tôi cũng (một lần nữa) khuyên bạn nên nâng cấp máy chủ thử nghiệm của mình lên cùng phiên bản MySQL mà bạn đang chạy trong môi trường sản xuất của mình.
Đồng thời so sánh các cài đặt cấu hình khác để xem liệu có sự khác biệt nào khác không (ngoài những cài đặt phù hợp với sản xuất khác nhau, chẳng hạn như innodb_buffer_pool_size).
Bạn cũng nên đảm bảo rằng bạn đang sử dụng cùng một phiên bản với các phần khác của ngăn xếp công nghệ, chẳng hạn như phiên bản Linux, phiên bản Ruby, v.v. Nếu bạn ngạc nhiên về sự không tương thích của phiên bản, thì đó chính là nguyên nhân gây ra sự mất ổn định của dự án và sự chậm trễ trong lịch trình nếu bạn không khớp môi trường phát triển và thử nghiệm với môi trường sản xuất của mình.
Về mysql - Rails5: Tại sao quá trình di chuyển phá vỡ môi trường sản xuất của tôi mà không phải môi trường thử nghiệm của tôi?, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/54891913/
Tôi là một lập trình viên xuất sắc, rất giỏi!