2010-10-11 22 views
6

Mam problem z InnoDB (tabela była początkowo MyISAM, ale zamieniłem ją na InndoB jakiś czas temu); Próbuję uruchomić tę kwerendę:Niepoprawny plik klucza z 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; 

otrzymuję ten błąd:

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 

Nie mogę przeprowadzić naprawę na stołach zaangażowanych; jednak uruchomiłem CHECK na obu tabelach & wydają się dobrze. Mam również odbywa się optymalizować obu tabelach & TAKŻE przebudowanych tabele wykonując poniżej ..

INSERT INTO new_table SELECT * FROM old_table; 

I potem przemianowany na nową tabelę do starej nazwy tabeli ..... ale mam ten problem nadal występuje .

Aby spróbować & dowiedzieć się, co było przyczyną jej stół usunąłem kod w zapytaniu Odwoływanie się do „rss_feeds” tabeli .... więc teraz kwerenda wygląda następująco ..

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

który pracował.

Problem jest więc związany z tabelą rss_feeds.

Więc pomyślałem, że zamieniłbym stół z powrotem na MyISAM &, wykonałbym naprawę &, a następnie przerzucił z powrotem na InnoDB ..... działało tymczasowo, wróciło do normy ... potem znowu się zepsuło ... ... naprawił to ponownie, zepsuł się ponownie ... teraz naprawa w ogóle nie działa.

Teraz wiem, wiem ...... Szukałem już tego problemu w Google ...... Zauważyłem, że WIĘKSZOŚĆ czasu, w którym występuje problem, za mało miejsca w Katalog tymczasowy MySQL .... ale już mam gospodarza, aby zmienić katalog temp na coś z dużo więcej przestrzeni & problem pozostaje.

Myślę, że GOSPODARZ jest winien & it NADAL jest problemem z katalogiem tymczasowym; czemu? Ponieważ po tym, jak znów go uruchomiłem, zacząłem dodawać dane do tabeli rss_posts ponownie &, więc JOIN otrzyma WIĘKSZE & MySQL znów będzie brakować miejsca .... co o tym myślisz?

Odpowiedz

5

Co tu się dzieje, to MySQL wykonuje ORDER BY, budując tabelę tymczasową z połączenia dwóch tabel. Tabela tymczasowa jest zbyt duża, aby zmieścić się w pamięci, aby MySQL tworzył plik tymczasowy.

Jest kilka rzeczy, które uniemożliwiłyby poprawną pracę. Surowa przestrzeń dyskowa jest jedna. ulimit to kolejny. Jeśli jest hostowana, może mieć przydział na dysku (oprócz ulimit).

Sugerowałbym dodanie do zapytania klauzuli ograniczającej. Aktualnie ładuje się całe obu rss_posts i rss_feeds do tabeli tymczasowej do sortowania. Jeśli chcesz tylko najnowsze 10, to o wiele więcej danych, niż naprawdę potrzebujesz.

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

Dziękuję - na pewno jest wystarczająco dużo miejsca na dysku; Zasadniczo stwierdzono, że gospodarz .. „W"/var/tmp przegroda wykorzystuje ten sam obszar jak '/', a jego użycie jest informacja komunikatu, jak następuje; /dev/sda3 130G 289g 442 g 32%/ Więc nie powinno być żadnych problemów z przestrzenią. " Chociaż zastanawiam się, czy może/var/tmp/dir nie jest ograniczony? Jeśli to nawet możliwe. Zapytanie, które tam masz - to w zasadzie tylko 10 ostatnich postów z ostatnich 30 dni? – Brett

+0

Prawidłowo. Możesz parametryzować "30", aby było nieco szersze. Jednak niezależnie od dostępnego miejsca na dysku, jeśli stale sortujesz całą tabelę na 10 wierszy, możesz napotkać problemy z skalowaniem i wydajnością. –

+0

Tak ... masz rację. Dziękuję bardzo! – Brett

2

Wygląda na to, że limit dysku dla tabel tymczasowych jest zbyt mały.

BTW: Nie ma potrzeby uruchamiania NAPRAWY na tablicach InnoDB, ponieważ wszystkie czynności konserwacyjne wykonuje sam silnik pamięci masowej. Nie mają również pliku klucza do uszkodzenia.

+0

Świetnie - dziękuję za użyteczne informacje! :) – Brett

1

Zauważ, że plik .MYI ma problem z tabelą tymczasową. Podczas uruchamiania kwerend obejmujących sprzężenia, MySql musi używać przestrzeni tymczasowej do scalania danych wewnętrznie. Najprawdopodobniej zabraknie miejsca w katalogu tmp.

Spróbuj zwiększyć ilość miejsca przydzielonego do tmpdir lub edytuj plik my.cnf, aby punkt tmpdir wskazywał miejsce z wystarczającą ilością miejsca (nie zapomnij dać mu uprawnień).

Powiązane problemy