2011-12-12 28 views
9

Tôi đang làm việc trên công cụ lưu trữ riêng của mình cho MySQL. Cho đến nay, công cụ lưu trữ này hoạt động đáng tin cậy và chính xác - nhưng chỉ dành cho các bảng nhỏ (~ 100 MB) ... Đối với các bảng lớn, tôi nhận được lỗi phân đoạn, khi tôi cố gắng thực hiện truy vấn theo thứ tự, sẽ dẫn đến một segfault:Công cụ lưu trữ của riêng tôi bị treo do một bộ sắp xếp quá nhỏ

select * from item order by i_author; 

Vì vậy, tôi biên soạn MySQL trong chế độ gỡ lỗi, và nhìn thấy, mà hiện nay là một thất bại khẳng định trong merge_buffers chức năng trong filesort.cc:

/* The following will fire if there is not enough space in sort_buffer */ 
DBUG_ASSERT(maxcount!=0); 

Trung thực tôi không có ý tưởng những gì tôi có thể thay đổi trong công cụ lưu trữ của tôi để làm cho lỗi này biến mất. Nó đầu tiên trông giống như tôi phải thay đổi paramater cấu hình sort_buffer_size - nhưng thậm chí thiết lập điều này cao hơn kích thước của bảng không thay đổi bất cứ điều gì với lỗi này.

Có ai biết cách viết công cụ lưu trữ MySQL có ý tưởng nào để giải quyết vấn đề này không?

Trả lời

4

Có một báo cáo tương tự issue được báo cáo với công cụ lưu trữ falcon. Nhận xét trong lỗi là,

Dường như sự cố xảy ra trong tệp khi bạn có hàng ước tính bị sai nghiêm trọng.

Rất có thể có lỗi trong công cụ lưu trữ của bạn ở đâu đó, nhưng đó là một điều khó khăn để gỡ lỗi thông qua ngăn xếp tràn.

+0

Ah cảm ơn rất nhiều, gợi ý này thực sự giải quyết được vấn đề. Theo tài liệu, đưa ra một ước tính chính xác cho kích thước bảng là không bắt buộc - rõ ràng là tài liệu là sai. Điều tôi đã làm bây giờ là ghi điểm cao của B + -Tree từ chỉ mục khóa nhị phân của tôi và tính giới hạn trên cho kích thước từ đó (vì chỉ cần ước tính, cho giá trị chính xác sẽ quá đắt). Bây giờ tất cả các thử nghiệm của tôi chạy trên các bảng lớn. Cảm ơn rất nhiều về mẹo đó! –

Các vấn đề liên quan