6

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

関係するテーブルの修復を実行できません。ただし、両方のテーブルでCHECKを実行したところ、正常に表示されます。また、両方のテーブルでOPTIMIZEを実行し、以下を実行してテーブルを再構築しました。

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が大きくなり、MySQLのスペースが再び不足するためです。...どう思いますか?

4

3 に答える 3

5

ここで何が起こっているかというと、MySQL は 2 つのテーブルの結合から一時テーブルを作成して ORDER BY を実行しています。一時テーブルが大きすぎてメモリに収まらないため、MySQL は一時ファイルを作成します。

これが正しく機能するのを妨げるいくつかのことがあります。Raw ディスク容量は 1 です。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;
于 2010-10-11T17:09:58.240 に答える
2

一時テーブル用のディスク クォータが小さすぎるようです。

ところで: すべてのメンテナンスはストレージ エンジン自体によって行われるため、InnoDB テーブルで REPAIR を実行する必要はありません。また、破損するキー ファイルもありません。

于 2010-10-11T17:04:23.037 に答える
1

問題のある .MYI ファイルは一時テーブル用であることに注意してください。結合を含むクエリを実行している場合、MySql は一時スペースを使用してデータを内部的にマージする必要があります。tmp ディレクトリのスペースが不足している可能性があります。

tmpdir に割り当てられるスペースの量を増やすか、my.cnf ファイルを編集して、tmpdir が十分なスペースのある場所を指すようにしてください (許可を与えることを忘れないでください)。

于 2012-10-11T19:23:59.493 に答える