2010-10-11 37 views
6

Tôi đang gặp sự cố với bảng InnoDB (bảng đã được khởi tạo MyISAM, nhưng đã chuyển đổi nó sang InndoB một thời gian trước); Tôi cố gắng để chạy truy vấn này:Tệp khóa không chính xác với MySQL

SELECT 
    posts.id, 
    posts.post_title 
FROM 
    rss_posts AS posts 
    INNER JOIN rss_feeds AS feeds ON posts.blog_id=feeds.id 
WHERE 
    feeds.blog_language=1 
ORDER BY 
    posts.post_date_db DESC 
LIMIT 
    10; 

tôi nhận được lỗi này:

Query : SELECT posts.id,posts.post_title FROM rss_posts AS posts INNER JOIN vw_rss_feeds AS feeds ON posts.blog_id=feeds.id WHER... 
Error Code : 126 
Incorrect key file for table '/tmp/#sql_7375_0.MYI'; try to repair it 

tôi không thể chạy một sửa chữa trên các bảng có liên quan; tuy nhiên tôi đã chạy một KIỂM TRA trên cả hai bảng & chúng xuất hiện tốt. Tôi cũng đã làm một TỐI ƯU HÓA trên cả hai bảng & CŨNG xây dựng lại các bảng bằng cách làm dưới đây ..

INSERT INTO new_table SELECT * FROM old_table; 

sau đó tôi đổi tên bảng mới với tên bảng cũ ..... nhưng tôi vẫn còn có vấn đề mà .

Để thử & con số ra những gì bảng đã gây ra nó tôi loại bỏ các mã trong các truy vấn tham khảo "rss_feeds" bảng .... vì vậy bây giờ các truy vấn trông như thế này ..

SELECT 
    posts.id, 
    posts.post_title 
FROM 
    rss_posts AS posts 
ORDER BY 
    posts.post_date_db DESC 
LIMIT 
    10; 

Đó làm việc.

Vì vậy, vấn đề là một cái gì đó với bảng rss_feeds. Vì vậy, sau đó tôi figured tôi sẽ chuyển đổi các bảng trở lại để MyISAM & chạy một sửa chữa & sau đó chuyển đổi trở lại InnoDB ..... này làm việc tạm thời, nó đã trở lại bình thường .... sau đó nó đã phá vỡ một lần nữa .. Logged ... sửa chữa nó một lần nữa, phá vỡ một lần nữa .... bây giờ sửa chữa dường như không làm việc cả.

Bây giờ, tôi biết, tôi biết ...... Tôi đã tìm kiếm vấn đề này trên Google đã ...... Tôi nhận thấy rằng tính chính xác của thời gian vấn đề là có chúng tôi không đủ không gian trong MySQL tạm thời thư mục .... nhưng tôi đã có máy chủ để thay đổi thư mục tạm thời để một cái gì đó với một LOT nhiều không gian & vấn đề vẫn còn.

Tôi nghĩ HOST là đổ lỗi cho & nó VẪN là một vấn đề với thư mục tạm thời; tại sao? Bởi vì sau khi tôi nhận được nó làm việc một lần nữa tôi bắt đầu thêm dữ liệu vào bảng rss_posts một lần nữa & do đó JOIN sẽ nhận được LARGER & MySQL một lần nữa sẽ chạy ra khỏi không gian .... bạn nghĩ sao?

Trả lời

5

Điều đang xảy ra ở đây là MySQL đang thực hiện ORDER BY bằng cách xây dựng một bảng tạm thời từ sự tham gia của hai bảng. Bảng tạm thời quá lớn để vừa với bộ nhớ, do đó MySQL tạo một tệp tạm thời.

Có một vài điều có thể ngăn điều này hoạt động chính xác. Không gian đĩa thô là một. ulimit là một loại khác. Nếu điều này đang được lưu trữ, họ có thể có một hạn ngạch về việc sử dụng đĩa của bạn (ngoài ulimit).

Tôi khuyên bạn nên thêm mệnh đề giới hạn vào truy vấn của mình. Hiện tại bạn tải toàn bộ cả rss_posts và rss_feeds vào bảng tạm thời để sắp xếp. Nếu bạn chỉ muốn 10 dữ liệu mới nhất có nhiều dữ liệu hơn bạn thực sự cần.

SELECT posts.id, posts.post_title 
FROM rss_posts AS posts INNER JOIN rss_feeds AS feeds ON posts.blog_id=feeds.id 
WHERE feeds.blog_language=1 
AND posts.post_data_db > (now - interval 30 day); 
ORDER BY posts.post_date_db DESC LIMIT 10; 
+1

Cảm ơn bạn - chắc chắn có đủ dung lượng đĩa trống; về cơ bản dẫn chương trình nói này .. "The '/ var/tmp' phân vùng sử dụng không gian giống như '/', và thông tin sử dụng của nó hiện như sau; /dev/sda3 442G 130g 289G 32%/ Vì vậy, bạn không nên nhìn thấy bất kỳ vấn đề với không gian. " Mặc dù tôi tự hỏi liệu có lẽ bản thân/var/tmp/dir bị giới hạn không? Nếu điều đó thậm chí có thể. Vì vậy, truy vấn bạn có ở đó - về cơ bản chỉ nhận được 10 bài đăng cuối cùng trong 30 ngày qua? – Brett

+0

Đúng. Bạn có thể parametrize "30" để làm cho rằng một chút rộng hơn. Nhưng bất kể không gian đĩa có sẵn nếu bạn liên tục phân loại toàn bộ hai bảng cho 10 hàng, bạn sẽ chạy vào các vấn đề về tỷ lệ và hiệu suất. –

+0

Yep ... bạn làm cho một điểm tốt. Cảm ơn rất nhiều! – Brett

2

Dường như dung lượng đĩa bạn có cho bảng tạm thời quá nhỏ.

BTW: Không cần phải chạy REPAIR trên bảng InnoDB vì tất cả việc bảo trì được thực hiện bởi chính công cụ lưu trữ. Họ cũng không có tệp khóa bị hỏng.

+0

Tuyệt vời - cảm ơn thông tin hữu ích đó! :) – Brett

1

Lưu ý rằng tệp .MYI có vấn đề với bảng tạm thời. Khi bạn đang chạy truy vấn liên quan đến tham gia, MySql cần phải sử dụng không gian tạm thời để hợp nhất dữ liệu nội bộ. Bạn có nhiều khả năng hết dung lượng trong thư mục tmp của bạn.

Hãy thử tăng dung lượng được phân bổ cho tmpdir hoặc chỉnh sửa tệp my.cnf để có điểm tmpdir đến một địa điểm có đủ dung lượng (đừng quên cấp quyền).

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