MySQL>テーブルが存在しません。しかし、そうです(またはそうすべきです)


261

MySQLインストールのdatadirを変更すると、1つを除いてすべてのベースが正しく移動しました。USEデータベースに接続できます。SHOW TABLESまた、すべてのテーブルが正しく返され、各テーブルのファイルはMySQLデータディレクトリに存在します。

しかし、SELECTテーブルから何かを実行しようとすると、テーブルが存在しないというエラーメッセージが表示されます。ただし、同じ表をSHOW TABLESステートメントで示すことができたため、これは意味がありません。

私の推測では、SHOW TABLESファイルの存在はリストされますが、ファイルが破損しているかどうかはチェックされません。その結果、それらのファイルをリストすることはできますが、アクセスすることはできません。

それにもかかわらず、それは単なる推測です。私はこれを見たことがありません。現在、テストのためにデータベースを再起動することはできませんが、それを使用する他のすべてのアプリケーションは正常に動作しています。しかし、それは単なる推測です。これまでに見たことはありません。

なぜこれが起こっているのか誰か知っていますか?

例:

mysql> SHOW TABLES;
+-----------------------+
| Tables_in_database    |
+-----------------------+
| TABLE_ONE             |
| TABLE_TWO             |
| TABLE_THREE           |
+-----------------------+
mysql> SELECT * FROM TABLE_ONE;
ERROR 1146 (42S02): Table 'database.TABLE_ONE' doesn't exist

バックアップからデータベースを復元しましたか?または、dbファイルをコピーしただけですか?mysqlサーバーへのrootアクセス権はありますか?
alinoz、2011年

ファイルをコピーしました!はい、すべてにrootアクセスできます
johnsmith

あなたは試すことができます:mysql_fix_privilege_tables
alinoz '13

4
これらのinnodbテーブルは何ですか?
ポールディクソン

1
はい、すべてのテーブルはInnoDBです。それを言わないのは私の悪い!
johnsmith、2011年

回答:


263

誰かがまだ気にかけている場合に備えて:

コマンドを使用してデータベースディレクトリを直接コピーした後、同じ問題が発生しました

cp -r /path/to/my/database /var/lib/mysql/new_database

InnoDBテーブルを使用するデータベースでこれを行うと、上記のクレイジーな「テーブルが存在しない」エラーが発生します。

問題はib*、MySQL datadirのルートにファイルが必要であるということです(例ibdata1ib_logfile0およびib_logfile1)。

それらをコピーしたとき、それは私のために働いた。


27
私を助けた!他の人にとっては、新しいインストールにコピーする場合は、既存のib *ファイルを上書きしないようにしてください。既存のmysql /ディレクトリをバックアップし、回復したい古いディレクトリに置き換え、mysqldumpですべてを更新してから、新しいmysql /を復元します。その後、mysqldumpsを適切にインポートできます。
マシュー

1
Macでデータベースをローカルに複製するには、ibdataファイル(データベースdirの隣にあります)をコピーするだけでなくchown _mysql:wheel、データベース名dir、ibdata、およびdir内のすべてのファイル(を使用chown -R ...)にコピーする必要がありました。同様に、アクセス許可はディレクトリ内で正しくなかっchmod -R 660 databasenameたため、データベースをデータベースに表示するために必要でした。
ディランヴァレード

4
マイクありがとう。明確にするために、これを機能させるにはmysqlサービスを再起動する必要があります。少なくとも私はそうしました、そしてそれがうまくいった良さに感謝します。そこでたくさんのデータが保存されました!
Nick Martin

15
注:使用することを忘れないでくださいchown!したがって、すべてcpこのコマンドを使用した後->chown mysql:mysql /var/lib/mysql/ -R
K-Gun

1
注2:適切な許可を適用することを忘れないでください。私の場合は sudo chmod -R 600 /var/lib/mysql
アウグスト

45

Mac OS(MySQL DMGインストール)の私にとっては、MySQLサーバーを再起動するだけで問題が解決しました。冬眠が原因だと思います。


私も同じ問題を解決してくれてありがとう。私のマシンは突然の停電でマシンがシャットダウンした後に起こりました。最初のマシンの再起動/ MySQLの起動後、エラーが発生しました。次に、この答えを読みます。システム環境設定からMySQLを停止/開始しましたが、修正されました。
ジェフエヴァンス

2
sudo /usr/local/mysql/support-files/mysql.server restart
laffuste 2015年

同様に。macOS Sierra 10.12.6にアップグレードした後、これに遭遇しました。因果関係があるかどうかは不明ですが、タイミングが疑わしいようです。
Dave Mulligan

おかげで、ある程度働いた。mysqlサービス(5.6、windows)を再起動して実行したcheck table TABLE_ONE;ところ、いくつかのエラー「パーティションp2がエラーを返しました」、「idx_blah_1が破損しているとマークされています」、および「idx_blah_2が破損しているとマークされています」が発生しました。これで実行に戻り、optimize table TABLE_ONE;「テーブル 'database.TABLE_ONE'は存在しません」というエラーが表示されます。
Omar

MojaveでのMySLQの実行。システム環境設定パネルからの再起動は機能しませんでした。コマンドラインから再起動する必要がありました。
Cortex

30

この問題は、使用しているテーブル名の大文字と小文字が区別されていないときに発生します。したがって、テーブルは「db」と呼ばれますが、selectステートメントでは「DB」を使用しました。大文字小文字が同じであることを確認してください。


13
+1フィールド名では大文字と小文字が区別されませんが、テーブル名では区別されます。よくある間違い、そして非常に迷惑です。
GolezTrol 2011年

27

このエラーは、に設定lower_case_table_names1、その変数のデフォルト値で作成されたテーブルにアクセスしようとしたときにも発生する可能性があります。その場合は、以前の値に戻すことができ、テーブルを読み取ることができます。


4
これは私を噛んだ。値を元に戻し、データベースを再起動し、テーブルをエクスポートし、値を1に戻し、データベースを再起動し、テーブルを再インポートし、すべてが再び機能しました。
wmarbut

17
  1. mysqldを停止する
  2. mysqlフォルダーのバックアップ: cp -a /var/lib/mysql /var/lib/mysql-backup
  3. 古いマシンからデータベースフォルダをコピーする /var/lib/mysql
  4. 古いデータベースのib *(ib_logfile *、ibdata)を上書きする
  5. mysqldを起動する
  6. ダンプデータベース
  7. mysqldump >dbase.mysql
  8. mysqlサービスを停止する
  9. 削除する /var/lib/mysql
  10. 名前/var/lib/mysql-backupを変更/var/lib/mysql
  11. mysqldを起動する
  12. データベースを作成する
  13. mysqldump < dbase.mysql

私の場合も、私は次のことを行わなければなりませんでした:10.5 / var / lib / mysql /から<db_name>ディレクトリを削除します
Tony the Tech

動いていない。:(テーブル 'tablename.wp_posts'は存在しません
Jahirul Islam Mamun

14

クエリを実行してください:

SELECT 
    i.TABLE_NAME AS table_name, 
    LENGTH(i.TABLE_NAME) AS table_name_length,
    IF(i.TABLE_NAME RLIKE '^[A-Za-z0-9_]+$','YES','NO') AS table_name_is_ascii
FROM
    information_schema.`TABLES` i
WHERE
    i.TABLE_SCHEMA = 'database'

あいにく、MySQLでは、Unicodeおよび印刷できない文字をテーブル名に使用できます。ドキュメント/ウェブサイトから作成コードをコピーしてテーブルを作成した場合、どこかに幅スペースがゼロである可能性があります。


とても便利な投稿、ありがとう!しかし、すべてのテーブルは正しい名前の長さのASCIIです
johnsmith

12

私はこの悪夢に3日間過ごしました。理想的には、復元できるバックアップを用意し、破損したテーブルを削除するだけです。これらの種類のエラーにより、ibdata1が巨大になる可能性があります(適度なテーブルのサイズが100GB以上)

mySqlDumpに依存している場合など、最近のバックアップがない場合、バックアップはおそらく過去のある時点で静かに壊れました。データベースをエクスポートする必要がありますが、これはもちろんできません。mySqlDumpの実行中にロックエラーが発生するためです。

したがって、回避策として/var/log/mysql/database_name/、table_name。*に移動して削除します。

次に、すぐにテーブルをダンプしてみます。これでうまくいくはずです。次に、データベースを新しいデータベースに復元し、不足しているテーブルを再構築します。次に、壊れたデータベースをダンプします。

私たちの場合mysql has gone away、すべてのデータベースでランダムな間隔で常にメッセージを取得していました。破損したデータベースが削除されると、すべてが正常に戻りました。


アンディに感謝し、私が直面している問題の手掛かりを得た。Cドライブのスペースを節約するために、ibdata1をCドライブの一部からDドライブに移動しました。ありがたいことに、コメントを読んだ後、Dドライブにibdata1(およびib_logfile1。とib_logfile0ファイル)を入れました。ここで、これらのファイルを移動した場所から見て、そこに復元します。その後、うまくいけば、私のテーブルが戻ってきます。
AKS

どのように「すぐにテーブルをダンプしようとする」のですか?私は同じ問題を抱えており、バックアップがないので、少なくともテーブル構造を取得する方法を探していますが、ディレクトリからファイルを削除すると、すべてがなくなってしまいますか?
mmvsbg 16

やった!おかげで、
jstuardo

11

理由はわかりませんが、私の場合、外部キーチェックを無効にしてから有効にするだけで解決しました

SET FOREIGN_KEY_CHECKS=0;
SET FOREIGN_KEY_CHECKS=1;

4
兄さん、ありがとう!私の場合、foreign_key_checksを無効にして、消えるテーブルで選択クエリを実行する必要があり、その後テーブルは再び正常になりました。この問題が発生する前にプログラムを中断したため、データ行にいくつかの外部キー違反があると思います。
Egist Li 2016

まだ正確に理由を見つけることはできませんでしたが、これにより私の問題も解決しました
Miroslav Glamuzina

11

同じ問題が発生し、2〜3日検索しましたが、解決策は本当に愚かでした。

mysqlを再起動します

$ sudo service mysql restart

これでテーブルにアクセスできるようになります。


1
$ sudo /usr/local/mysql/support-files/mysql.server restart
KirstieBallance

これは、私が試してみるリストの一番上にあるはずです。ショットの価値があり、私の場合はうまくいきました。
Coroos 2018年

7

わかりました、これはかなりばかげているように聞こえますが、私をユーモアを交わしています。
私にとって私のステートメントをこれに変更したときに問題は解決しました:

SELECT * FROM `table`

2つの変更を加えました
1.)テーブル名を小文字にしました-わかりました!!
2.)特定の引用記号を使用し= `:それはあなたのTAB上記のキーです

解決策はばかげているように聞こえますが、それは機能し、土曜日の夕方であり、私は午前9時から作業しています-だから私はそれを取ります:)

幸運を。


1
Just FYI-テーブルはMyISAMであり、INNOではない
PlanetUnknown 14

1
また、 `はバックティックと呼ばれます
Gary

7

WAMPのアップグレード後にこの問題が発生しましたが、データベースのバックアップがありません。

これは私のために働きました:

  1. 新しいWAMPを停止

  2. 古いWAMPインストールから必要なデータベースディレクトリとibdata1ファイルをコピーします

  3. 削除ib_logfile0してib_logfile1

  4. WAMPを開始する

これで、データベースのバックアップを作成できるようになります。ただし、サーバーが再起動した後も問題が発生します。したがって、WAMPを再インストールしてデータベースをインポートします。


私は人々が彼らが参照するファイルがどこに存在するかを示してくれればいいのに...
MagentoAaron

読み取り可能なテーブルがないmysql dockerイメージからここに取得しました。イメージの停止、これらのファイルの削除、および再起動により、アクセスが再度許可されたことを確認できます。
アンソニーハーレー

7

idb-fileをコピーする前に、sqlクエリを実行してテーブルスペースを破棄してください。

ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;

idbファイルをコピー

ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;

MySqlを再起動します


あなたは私を救った:)
l00k

@ I0pan私は言及されたのと同じ手順を試しました。しかし、ALTER TABLE mydatabase.mytable IMPORT TABLESPACEの後、テーブルが存在しないことを示しています。しかし、それは:(
Syed Asad Abbas Zaidi 2017

5

MySQLを再インストールする必要がある後、同じ問題が発生しました。インストール中に、InnoDBログファイルに関するデータを格納するいくつかの構成ファイル、これらのファイルib_logfile *(ログファイルは正しいですか?)が上書きされているようです。この問題を解決するために、私はib_logfile *ファイルを削除しました。


5

私にとってうまくいったのは、テーブルが存在していなくても、テーブルを削除することでした。次に、テーブルを再作成し、以前に実行したSQLダンプからデータを再入力しました。

テーブル名のメタベースが存在する必要があります。ドロップするまで、そこにまだ存在している可能性があります。


プロシージャを作成しましたが、ビューにする必要があることに気付きました。そこで、最後にいくつかのzzzを使用してプロシージャの名前を変更し、参照できるようにして、同じ名前のビューを作成しました。表示するSELECTを取得できませんでした。このエラーが発生しました。<br>コードをテキストファイルにコピーし、ビューとプロシージャの両方を削除しました。ビューを再現し、すべてが順調でした。<br>つまり、そうです-7年後-ある種のゴースト/キャッシュされた名前アクションが、いくつかのエッジケースでまだ起こっています。
Roger Krueger

5

ゴーストテーブルで同様の問題がありました。ありがたいことに、失敗前のSQLダンプを取得しました。

私の場合、私は:

  1. mySQLを停止する
  2. ib *ファイルを/var/mysqlオフからバックアップに移動する
  3. 削除する /var/mysql/{dbname}
  4. mySQLを再起動します。
  5. 空のデータベースを再作成する
  6. ダンプファイルを復元する

注:ダンプファイルが必要です。


私はあなたが意味を推測する/var/lib/mysql代わりに/var/mysql
knocte

データベースディレクトリの削除とバックアップからの復元だけが、私を助けました。
Jano 2017

3
  1. データベースにmysqldumpを実行します。

    mysqldump -u user -ppass dbname > D:\Back-ups\dbname.sql
  2. データベースを復元する

    mysql -u user -ppass dbname < D:\Back-ups\dbname.sql

これで、データベース内のすべてのテーブルが完全に復元されました。試して

SELECT * FROM dbname.tablename;

2

MariaDBを新しいコンピューターにインストールし、Mysqlサービスがデータフォルダーの名前をdataに変更しました-Mysql \ data \ table_foldersibdata1 をクラッシュしたHD MySqlデータフォルダーから新しくインストールされたmysqlデータフォルダーにコピーする問題を解決 しました。

ib_logfile0ib_logfile1をスキップしました(そうでない場合、サーバーはサービスを開始しませんでした)

mysqlサービスを開始しました。

その後、サーバーが実行されます。


2

問題は、無効な(破損した)innodbログファイルを(少なくとも1つは他のいくつかの問題で)処理する必要があるようです。一般的に言って、それらは単に再作成する必要があります。

ここにソリューションがありますが、そのほとんどはmysqlの再起動が必要です。

  • ログファイルを再作成します(mysqlを削除して再起動します)
  • ログファイルのサイズを変更します(MySql 5.6以降ではファイルが再生成されます)。
  • あるタイプのデータ移行を行っている場合は、適切なファイルを正しく移行し、他の人がすでに述べているようにアクセス許可を与えていることを確認してください
  • データとログファイルの権限を確認します。mysqlは両方の所有者です
  • 他のすべてが失敗した場合は、おそらくデータベースを再作成する必要があります

2

次に、別のシナリオ(バージョンのアップグレード)を示します。

私はOS(Mac OS El Captain)を再インストールし、mysqlの新しいバージョンをインストールしました(homebrewを使用)。インストールされたバージョン(5.7)はたまたま私の以前のバージョンよりも新しいものでした。次に、ib *ファイルを含むテーブルをコピーし、サーバーを再起動しました。mysqlワークベンチでテーブルを表示できましたが、何かを選択しようとすると、「テーブルが存在しません」というメッセージが表示されました。

解決:

  1. mysqlサーバーを停止します。例:mysql.server stopまたはbrew services stop mysql
  2. 使用してサーバーを起動しますmysqld_safe --user=mysql --datadir=/usr/local/var/mysql/(必要に応じてパスを変更します)
  3. 実行mysql_upgrade -u root -p password(別のターミナルウィンドウで)
  4. 実行中のサーバーをシャットダウンする mysqladmin -u root -p password shutdown
  5. サーバーを通常モードで再起動するmysql.server startか、brew services start mysql

関連ドキュメントはこちらです。


本当に多くのことを試しましたが、すべてのデータベースを備えた新しいサーバーに移動した後、これが私を大きく助けた唯一のことでした。ありがとう!(Ubuntu 16.04)
Falk

2

私の場合、テーブルにトリガーを定義してから、テーブルに行を挿入しようとしました。どういうわけかトリガーが誤っていたため、挿入によりエラーが発生し、テーブルが存在しないようです


1
これは私にとってはうまくいきます!各トリガーを確認し、1つのトリガーを改善する必要があることを確認しました。
Paresh、

1

テーブル名に隠し文字が含まれている可能性があります。ショーテーブルを実行しても、これらは表示されません。「SHOW CREATE TABLE TABLE_ONE」を実行してタブ「TABLE_ONE」を完成させ、隠し文字が含まれているかどうかを確認できますか。また、テーブルを削除して再作成してみましたか?特権に問題がなく、隠し文字がないことを確認するだけです。


タブ補完は役に立たず、テーブルが「存在しない」ため、テーブルの作成を表示できません。地獄から
ジョンスミス2011年

1

TimeMachineバックアップのインポート後も同じ問題が発生します。私の解決策は、MySQLサーバーを停止し、ib *ファイルの読み取り/書き込み権限を修正することでした。


1

私がここで取り上げる価値があると思うもう1つの答え(同じ問題でここに来て、これが私にとっての答えであることが判明したため):

クエリ内のテーブル名のスペルがデータベース内のものとまったく同じであることを再確認してください。

明らかな、初心者向けのようなものですが、「ユーザー」と「ユーザー」のようなものは人々をつまずかせる可能性があり、私はここのリストにあると役立つ回答だと思いました。:)


1

私の場合、エクスポートされたSQLファイルをインポートすると、テーブル作成クエリのテーブルが存在しないなどのエラーが発生しました。

データベース名にアンダースコアがあり、mysqlがその直前にエスケープ文字を置いていることに気付きました。

データベース名からアンダースコアを削除したので、すべてうまくいきました。

それが他の誰かにも役立つことを願っています。


1

私のテーブルはどういうわけか' Customers'リーディングスペースを含むように名前が変更されていました

この意味

a)クエリが壊れた

b)テーブルがアルファベット順に期待どおりの場所に表示されなかったため、パニックが発生し、表示されませんでした。

RENAME TABLE ` Customer` TO `Customer`;

1

私の場合、それはSQLCA.DBParmパラメータでした。

使った

SQLCA.DBParm = "Databse = "sle_database.text""

しかしそれは

SQLCA.DBParm = "Database='" +sle_database.text+ "'"

説明:

3つの文字列を結合します。

 1. Database='              -  "Database='"

 2. (name of the database)  - +sle_database.text+

 3. '                       - "'" (means " ' "  without space)

クォータマークにスペースを使用しないでください。同僚のJanに感謝します。


1

に移動:xampp\mysql\data\dbname
dbname内にtablename.frmとtablename.ibdファイルがあります。
それを削除してmysqlを再起動し、再試行してください。


1

ibdata1古いデータディレクトリからファイルのみをコピーします。ib_logfile1またはib_logfile0ファイルをコピーしないでください。これにより、MySQLが起動しなくなります。


1

今日同じ問題を越えてきました。これはmysqlの「識別子の大文字と小文字の区別」の問題です。

対応するデータファイルを確認してください。ファイルシステムではファイル名が小文字である可能性が高いですが、「show tables」コマンドにリストされているテーブル名は大文字です。システム変数「lower_case_table_names」が0の場合、「lower_case_table_names」が0の場合、名前の比較では大文字と小文字が区別されるため、クエリは「テーブルが存在しません」を返します。


1

Windowsでも同じ問題が発生しました。ib *ファイルとmysqlディレクトリをthdデータディレクトリの下にコピーすることに加えて、my.iniファイルも一致させる必要がありました。

以前のインストールのmy.iniファイルには、次の行がありませんでした。

innodb-page-size=65536

しかし、私の新しいインストールはそうしました。古いインストーラにはそのオプションがなかった可能性があります。これを削除してサービスを再起動すると、テーブルは期待どおりに機能しました。簡単に言うと、新しいmy.iniファイルが古いファイルのレプリカであることを確認してください。新しいインストールに応じて、datadir、plugin-dir、およびport#だけが例外です。

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