Неверный ключевой файл с 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 указывал на место с достаточным пространством (не забудьте дать ему разрешения).