SchrödingersMySQLテーブル:存在しますが、存在しません


118

私はすべての最も奇妙なエラーを抱えています。

テーブルを作成または変更するときに、「テーブルが既に存在する」というエラーが発生することがあります。ただし、DROP TABLEは「#1051-不明なテーブル」を返します。だから私は作成できない、ドロップできないテーブルを手に入れました。

データベースを削除しようとすると、mysqldがクラッシュします。場合によっては、別の名前で別のデータベースを作成することが役立つこともありますが、そうでない場合もあります。

私は〜50テーブルのDBを使用しています。すべてInnoDBです。この問題は、異なるテーブルで発生します。

Windows、Fedora、Ubuntu、MySQL 5.1および5.5でこれを体験しました。PDO、PHPMyAdmin、またはコマンドラインを使用する場合の同じ動作。MySQL Workbenchを使用してスキーマを管理しています。関連するエラー(エンドラインなど)がいくつかありましたが、どれも私には関係がありませんでした。

いいえ、それはビューではなく、テーブルです。すべての名前は小文字です。

私はグーグルできるすべてを試しました-テーブルをフラッシュし、dbからdbに.frmファイルを移動し、mysqlログを読み取りましたが、何もかも全部再インストールするしかありませんでした。

「テーブルの表示」は何も明らかにしません、「説明」テーブルは「テーブルが存在しない」と言いますが、.frmファイルはありませんが、「テーブルの作成」はエラーで終了します(「テーブルが存在しない場合はテーブルの作成」も行います)。データベースを削除するとmysqlがクラッシュする

関連するが役に立たない質問:

編集:

mysql> use askyou;
Database changed

mysql> show tables;
Empty set (0.00 sec)

mysql> create table users_has_friends (id int primary key);
ERROR 1050 (42S01): Table '`askyou`.`users_has_friends`' already exists

mysql> drop table users_has_friends;
ERROR 1051 (42S02): Unknown table 'users_has_friends'

そして、すべて同じです。テーブルは存在しませんが、作成することはできません。

mysql> drop database askyou;
ERROR 2013 (HY000): Lost connection to MySQL server during query

名前の変更、これが問題に遭遇した唯一のテーブル/データベースではありません


2
MySQLクライアントを開いて、問題を示すいくつかのコマンドを入力してから、コマンドの正確なコピーをコピーして貼り付け、ここに出力できますか。問題を詳細に説明できたのは素晴らしいことですが、正確なコマンドとメッセージを投稿した方がよいでしょう。
Mark Byers、

同じ名前のビューがまったくない場合、MySQLのデータファイル構造は不安定です。
eggyal

3
あなたは、に応じて何を得るのかSHOW FULL TABLES IN askyouSELECT * FROM information_schema.TABLES WHERE TABLE_SCHEMA LIKE 'askyou'
eggyal

1
innodb_file_per_tableを使用していますか?
ESG

1
@RafaelBarros:結構です。打ち間違え。明確にしていただきありがとうございます。
eggyal 2013

回答:


19

この問題は、データファイルにデータファイルがない場合に発生しますが、テーブル定義ファイルが存在するか、その逆です。innodb_file_per_tableを使用している場合は、データディレクトリを調べて.frm、問題のテーブルのファイルと.ibdファイルの両方があることを確認してください。MYISAMの場合.frm.MYI.MYDファイルが必要です。

この問題は通常、孤立したファイルを手動で削除することで解決できます。


3
私は使っていませんinnodb_file_per_table。ただし、オンにしてテーブルを再作成しようとすると、.ibdファイルのみが作成されます。.frmどこにも見つかりません。これは特定のテーブルにのみ適用されます(10以上のテーブルは正しいファイルで作成されます)。孤立したibdを削除しても何の役にも立たない
Corkscreewe

1
私はinnodb_file_per_tableを使用しています。しかし、孤立した.frmを削除すると、createステートメントを実行したときに再作成されます(ただし、createステートメントはエラーを返し、.ibdファイルは作成されず、それでもドロップできません)
andrew lorien

14

ここでワイルドな推測を続けますが、おそらくinnodbには、おそらくテーブルスペース内のテーブルのエントリがまだあるようibdataです。あなたがいる場合、本当に必要としないすべてのデータの、またはあなたがバックアップを持っている場合は、次のことを試してみてください。

  1. すべてのスキーマを削除する(mysqlを除く)
  2. データベースをシャットダウンする
  3. データディレクトリ内のすべてのフォルダが適切に削除されていることを確認します(ここでも、mysqlを除きます)。
  4. ibdataとログファイルを削除する
  5. データベースを再起動します。テーブルスペースとログを最初から再作成する必要があります。

2
素晴らしい:mysqlを停止し、「ibdata1」、「ib_logfile1」、「ib_logfile0」を削除して、mysqlを再起動すると問題が解決しました。どうもありがとう!
Meilo

4

修正は簡単です。少なくとも私が解決したことは、私のために機能しました。別のMySQLインスタンスにテーブル「zzz」を作成します。zzzは問題のテーブル名です。(つまり、テーブルがschrodingerと呼ばれる場合は、記述されたものをzzzの代わりに使用します。)テーブルの定義が何であるかは問題ではありません。これは一時的なダミーです。zzz.frmファイルを、テーブルが存在するサーバー上のデータベースディレクトリにコピーし、ファイルの所有権と権限がファイルに対して正しいことを確認します。MySQLでは、「テーブルの表示」を実行できるようになり、テーブルzzzが表示されます。mysql>ドロップテーブルzzz; ...これで動作するはずです。必要に応じて、ディレクトリ内のzzz.MYDまたはZZZ.MYIファイルをすべてクリアします。


実際、この解決策は私の命を救ってくれました、ありがとう!FRMとIDBファイルを別のデータベースからコピーしましたが、同じサーバー(同じMySQLバージョンなど)にありましたが、正常に動作しているようです。
ピエール

これは、.frm他のインスタンス(マスター/スレーブ)からファイルをコピーしてディレクトリに配置する方法であり、テーブルを削除すると、テーブルを再度作成できるようになります。
juliangonzalez

3

これがここでの質問のケースに対する直接の回答ではないかと思いますが、ここでは、OS X Lionシステムでこの正確に認識されている問題をどのように解決したかを示します。

スケジュールした分析ジョブのテーブルを頻繁に作成/削除しています。ある時点で、テーブルの取得を開始しましたが、スクリプトの途中でエラーが既に存在します。通常、サーバーを再起動することで問題は解決しましたが、解決策が面倒すぎました。

次に、ローカルエラーログファイルで次の特定の行に気づきました。

[Warning] Setting lower_case_table_names=2 because file system for /usr/local/mysql/data/ is case insensitive

これにより、テーブルに大文字が含まれている場合、MySQLは私がそれらを削除した後でも、まだそこにあると誤解する可能性があるという考えがわかりました。それが事実であることが判明し、テーブル名に小文字のみを使用するように切り替えると、問題はなくなりました。

それはおそらく私の場合のいくつかの設定ミスの結果ですが、うまくいけば、このエラーケースは誰かが解決策を見つけることを試みるより少ない時間を無駄にするのを助けるでしょう。


3

これは古い質問ですが、私は同じ問題にぶつかっただけで、上部にリンクされている関連する問題の1つで答えは私が必要とするものであり、ファイル、テーブルの削除、サーバーのシャットダウンなどよりもはるかに簡単でした。

mysqladmin -uxxxxxx -pyyyyy flush-tables

1

私の場合、mysqlデータディレクトリの所有権をアプリケーションを実行したユーザーに変更することで問題は解決しました。(私の場合、それはJetty Webサーバーを実行するJavaアプリケーションでした。)

mysqlが実行中で他のアプリがそれを適切に使用できたとしても、このアプリには問題がありました。データディレクトリの所有権を変更し、ユーザーのパスワードをリセットした後、すべてが正常に動作しました。


1

このエラー1051で在庫があり、データベースを削除してこれを再度インポートするだけの場合は、この手順を実行してください。すべてうまくいきます。

Unix環境でAS ルート

  • rm -rf / var / lib / mysql / YOUR_DATABASE;
  • オプション-> mysql_upgrade --force
  • mysqlcheck -uUSER -pPASS YOUR_DATABASE
  • mysqladmin -uUSER -pPASSドロップYOUR_DATABASE
  • mysqladmin -uUSER -pPASSはYOUR_DATABASEを作成します
  • mysql -uUSER -pPASS YOUR_DATABASE <IMPORT_FILE

よろしく、クリストゥス


0

私はこの問題を抱えていて、上記のようにIBDファイルを削除することが役立つことを望みましたが、違いはありませんでした。MySQLは新しいIBDファイルのみを再作成しました。私の場合、同じMySQLインスタンスの他のデータベースには、実際には類似したテーブルがあります。FRMファイルが見つからなかったので、別のデータベースの同様のテーブルからFRMファイルをコピーし、MySQLを再起動すると、テーブルが正しく機能しました。


0

テーブルを作成して削除した後でこのエラーに遭遇し、もう一度作成したかった。私の場合、自己完結型のダンプファイルがあったので、スキーマを削除して再作成し、ダンプファイルを使用してテーブルとデータをインポートしました。


0

これは私たちのサイトで発生します(まれですが)通常、大量の再構築を行う特定のスクリプトの実行中に「イベント」が発生します。イベントには、ネットワークの停止または電源の問題が含まれます。
非常にまれな状況でこれに対して私が行うこと-強引なアプローチを使用します。

  • 特定のテーブルを削除して再構築する必要がありました。私は通常、テーブルが作成されているのでこれで問題ないという立場にあります。(データを回復する必要がある場合は、状況が異なる場合があります)
  • 管理者として、mysqlのインストールに移動します(Windowsでは "... program files / mysql / MySQL Server xx / data / <schemaname>
  • <schemaname>フォルダーでテーブル名の問題のあるファイルを見つけて削除します。
  • 孤立した一時ファイルを確認し、それらも削除します。#... frmファイルが存在する場合。
  • MySQLでは、テーブルを再度作成できます

私は長い間(数年)いくつかの異なるデータベースでこの問題を抱えてきました。矛盾するメッセージがあったので、それは困惑した。他の回答で説明されているように、データベースの削除/再構築/名前変更のバリエーションを初めて実行したところ、うまくいきましたが、確かにその方が時間がかかります。私にとって幸運なことに、再構築されている参照テーブルが常に発生します-ドロップされ、作成されます-通常は午前中に。まれに問題が発生しましたが、特殊な奇抜なケースとして認識されるようになりました。(再説明します。データを回復する必要がある場合は、他のソリューションを参照してください。)

  • 別のユーザーまたは別のデータベースに属するテーブルではない
  • それは大文字/小文字の問題ではなく、すべて小文字を使用しますが、それは興味深い問題でした!
  • それは「それは間違いなく<there / not-there / some-other-user-table-case>であり、あなたはそれを正しく行っていない」のバリエーションを持つ余分なイライラする応答を見ていた:)
  • テーブルが「テーブルを表示」に表示されなかった
  • テーブルはINNODBテーブルでした(常にありました/されていました)。
  • テーブルを削除しようとすると、テーブルが存在しないというエラーメッセージが表示されました。
  • しかししようとしてCREATEテーブルは、テーブルが既に存在していることをエラーメッセージを与えました。
  • mysql 5.0または5.1の使用
  • 修理はこの問題には効果がない

-1

特定のテーブルでこの問題が発生していました。可能な解決策を読んで、私は次のようないくつかの手順を実行しました:

  • 孤立したファイルを検索する:誰も存在しませんでした。
  • execute::show full tables in database;問題のあるものは見られませんでした。
  • 実行:: describe table;戻り値table doesn't exist;
  • 実行:: SELECT * FROM information_schema.TABLES WHERE TABLE_NAME='table';戻り値Empty set;
  • 上記のクエリを手動でphpMyAdminで検索します。存在しませんでした。

そして、それらのステップの後で、私は再びチェックしshow tables;ます...そしてvualá!問題のあるテーブルはなくなりました。問題なく同じ名前で作成してドロップでき、サーバーを再起動する必要もありませんでした。奇妙な...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.