30

クエリを作成しましたが、これはローカルサーバーで正しく実行され、データが少なくなります。

しかし、これを本番サーバーで実行すると、エラーが発生します-(これには約6GBのデータがあります)

Incorrect key file for table '/tmp/#sql_3c51_0.MYI'; try to repair it

これが私の質問です

SELECT   
    `j25_virtuemart_products`.`virtuemart_product_id`,
    `product_name`, 
    `product_unit`,
    `product_s_desc`,
    `file_url_thumb`,
    `virtuemart_custom_id`, 
    `custom_value`   
    FROM 
    `j25_virtuemart_product_customfields`,
    `j25_virtuemart_products`,
    `j25_virtuemart_products_en_gb`,
    `j25_virtuemart_product_medias`,
    `j25_virtuemart_medias`     
    WHERE
    (
    `j25_virtuemart_products`.`virtuemart_product_id`=`j25_virtuemart_products_en_gb`.`virtuemart_product_id`
    AND 
    `j25_virtuemart_products`.`virtuemart_product_id`=`j25_virtuemart_product_customfields`.`virtuemart_product_id`)

AND

    `j25_virtuemart_products`.`virtuemart_product_id`=`j25_virtuemart_product_medias`.`virtuemart_product_id`
    AND 
    `j25_virtuemart_product_medias`.`virtuemart_media_id`=`j25_virtuemart_medias`.`virtuemart_media_id`

    GROUP BY `j25_virtuemart_products`.`virtuemart_product_id`

    LIMIT 0, 1000;

誰もがそのエラーから回復する方法を知っています-このクエリを最適化するか、他の方法で感謝します

4

8 に答える 8

58

この問題は、/tmpフォルダーのディスク容量が不足していることが原因で発生します。/ tmpボリュームは、一時テーブルの作成を必要とするクエリで使用されます。クエリがInnoDBのテーブルのみを使用している場合でも、これらの一時テーブルはMyISAM形式です。

ここにいくつかの解決策があります:

  • 一時テーブルを作成しないようにクエリを最適化します(クエリを書き直したり、複数のクエリに分割したり、適切なインデックスを追加したり、pt-query-digestを使用して実行プランを分析したりしますEXPLAIN <query>)。一時テーブルに関するこのPerconaの記事を参照してください。
  • MySQLを最適化して、一時テーブル(sort_buffer_size、join_buffer_size)を作成しないようにします。参照:https ://dba.stackexchange.com/questions/53201/mysql-creates-temporary-tables-on-disk-how-do-i-stop-it
  • テーブルを小さくします。可能であれば、不要な行を削除してください
  • クエリで必要な列のみを使用する代わりにを使用して、より小さな一時テーブルを生成しSELECT table1.col1, table2,col1 ...ますselect *
  • スペースを取らないデータ型を使用する
  • /tmpフォルダーが存在するボリュームにディスクスペースを追加します
  • TMPDIRmysqldを起動する前に環境変数を設定して、mysqlによって一時フォルダーのユーザーを変更します。TMPDIRより多くの空き領域があるディスクボリューム上のフォルダをポイントします。mysqldサービスのコマンドラインまたはコマンドラインでtmpdirオプションを使用することもできます。参照:B.5.3.5MySQLが一時ファイルを保存する場所/etc/my.cnf--tmpdir
于 2013-10-23T20:44:39.973 に答える
9

これらの手順を実行します

mysqlサービスを停止します

.myiファイルの名前をx.oldに変更します

mysqlを起動します

クエリ内のすべてのテーブルを修復します。MySQLはキーファイルを再構築します

于 2012-08-04T04:05:50.450 に答える
7

上記の回答は非常に多く、質問の所有者は@Hawiliによって提案された解決策をすでに取得しており、この問題が発生してから長い時間が経過しています。しかし、これは一般的な問題であるため、さまざまな理由で誰かがこの問題を再び受けた場合に、ここから解決策を得ることができるように、私の経験を共有したいと思いました。

ケース1:

最も一般的な理由は、クエリが/tmpパーティションのサイズより大きいデータをフェッチしていることです。クエリ中にこの問題が発生した場合は、/tmpフォルダーのサイズを確認してください。一時テーブルは自動的に作成および削除されます。このクエリ中に使用可能なスペースが0になる場合は、クエリを最適化するか、/tmpのパーティションサイズを増やす必要があることを意味します。

注:個別のクエリではない場合もあります。重いクエリの組み合わせが同じサーバーで同時にこれを実行すると、この問題が発生する可能性があります。通常、個別のクエリはエラーなしで実行されます。

ケース2:

修復が必要なmyisamテーブルが破損している場合、ディレクトリパスはエラーメッセージの/tmpとは異なります。

ケース3:(まれなケース)

誤ったテーブル結合が原因で、このエラーが発生する場合があります。これは実際には構文エラーですが、mysqlは代わりにこのエラーをスローできます。詳細は以下のリンクで確認できます-

テーブル'/tmp/#sql_18b4_0.MYI'のキーファイルが正しくありません。それを修理してみてください

于 2015-07-08T11:31:00.933 に答える
3

を実行して、tmpディレクトリの場所を確認しますdf -h。一時ファイルを拡張するのに十分なスペースがあることを確認してください。数ギガになる可能性があります。

編集:十分な空き領域がある場合は、インデックスを作成している、またはWHERE句に含めているすべての列がインデックスに登録されていることを確認します。

于 2012-08-04T04:00:00.357 に答える
0

データベースサーバーに十分なディスク容量があることを確認してください。ディスクがいっぱいの場合、このエラーが表示されます。さて、どのフォルダを見る必要があるかは、設定​​によって異なります。

于 2015-01-09T11:12:05.460 に答える
0

次のコマンドを使用しましたが、エラーはなくなりました。

mysqlcheck --all-databases -r #repair

私はcpanelフォーラムからこのソリューションを入手しました

于 2016-10-23T14:15:33.387 に答える
0

私にも同じ問題

実行df -hして、パーティション/tmpに十分なスペースがあるかどうかを確認します

私の場合、/tmpはオーバーフローファイルシステムでした。

overflow 1,0M 24K 1000K 3% /tmp

どうしたの:

ここで問題が発生し、パーティション/がいっぱいになった後、Debianディストリビューション/tmpがRAMメモリに新しいパーティションを作成して一時的に使用しました。この/tmp1MBのパーティションは、システムで使用するには十分な大きさではありません。

解決策:次のコマンドを実行して、この一時的に作成されたパーティションを削除します/tmp

sudo umount -l /tmp

于 2018-01-15T18:43:58.960 に答える
-2

ターミナルでこのコマンドラインを使用してMySQLサービスを再起動します/etc/init.d/mysqld restart

于 2016-04-11T09:50:25.870 に答える