Неверный ключевой файл с MySQL

У меня проблема с InnoDB (таблица изначально была MyISAM, но недавно она была преобразована в InndoB); Я пытаюсь выполнить этот запрос:

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;

Я получаю эту ошибку:

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

Я не могу выполнить ремонт на задействованных столах; однако я провел ПРОВЕРКУ на обеих таблицах, и они выглядят хорошо. Я также сделал ОПТИМИЗАЦИЮ для обеих таблиц и ТАКЖЕ перестроил таблицы, выполнив следующие действия.

INSERT INTO new_table SELECT * FROM old_table;

Затем я переименовал новую таблицу в имя старой таблицы..... но у меня все еще есть такая проблема.

Чтобы попытаться выяснить, какая таблица вызывала это, я удалил код в запросе, ссылающийся на таблицу "rss_feeds".... так что теперь запрос выглядит так:

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

Это сработало.

Так что проблема в чем-то с таблицей rss_feeds.

Тогда я решил преобразовать таблицу обратно в MyISAM и запустить восстановление, а затем преобразовать обратно в InnoDB..... это работало временно, оно возвращалось в нормальное состояние.... затем оно снова ломалось..... ремонтировалось это снова, сломалось снова.... теперь ремонт, кажется, не работает вообще.

Теперь, я знаю, я знаю...... Я уже искал эту проблему в Google уже...... Я заметил, что БОЛЬШИНСТВО времени проблема заключается в том, что нам не хватает места во временном каталоге MySQL.... но я уже получил хост, чтобы изменить временный каталог на что-то с ОЧЕНЬ большим количеством места, и проблема все еще остается.

Я думаю, что хозяин виноват, и это все еще проблема с временным каталогом; Зачем? Потому что после того, как я снова начал работать, я снова начал добавлять данные в таблицу rss_posts, и, следовательно, JOIN получит LARGER, а MySQL снова не хватит места… что вы думаете?

3 ответа

Решение

Здесь происходит то, что MySQL выполняет ORDER BY, создавая временную таблицу из объединения двух таблиц. Временная таблица слишком велика для размещения в памяти, поэтому MySQL создает временный файл.

Есть несколько вещей, которые могут помешать правильной работе. Необработанное дисковое пространство одно. Ulimit это другое. Если это хостинг, у них может быть квота на использование вашего диска (в дополнение к ulimit).

Я бы предложил добавить ограничивающий пункт в ваш запрос. В настоящее время вы загружаете все как rss_posts, так и rss_feeds во временную таблицу для сортировки. Если вам нужны только самые последние 10, это намного больше данных, чем вам действительно нужно.

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;

Похоже, что дисковая квота для временных таблиц слишком мала.

Кстати: нет необходимости запускать REPAIR для таблиц InnoDB, поскольку все обслуживание выполняется самим механизмом хранения. У них также нет файла ключа, который будет поврежден.

Обратите внимание, что.MYI-файл, с которым у него проблема, предназначен для временной таблицы. Когда вы выполняете запросы, включающие объединения, MySql должен использовать временное пространство для внутреннего объединения данных. Скорее всего, вам не хватает места в каталоге tmp.

Попробуйте увеличить объем пространства, выделенного для tmpdir, или отредактируйте файл my.cnf, чтобы tmpdir указывал на место с достаточным пространством (не забудьте дать ему разрешения).

Другие вопросы по тегам