web-dev-qa-db-ja.com

エラー:テーブルxxxのテーブルスペースが存在します。 IMPORTの前に表領域を削除してください

私はMySQLにはかなり慣れていません。Googleやstackoverflowの検索では助けを見つけることができない、かなり興味深いエラーが出ています。

私は、MacOS 10.8.3上でMySQL 5.6.10のローカルサーバを実行しており、Navicat Essentials for MySQLを介してデータベースを管理しています。

私の知る限りでは、データベースを実行して数日から数週間管理しただけで、Navicat内からクエリを使用して作成したテーブルの一部が削除される(不完全に見える)ことがあります。

これらのテーブルを使用してクエリを実行しようとすると、Navicatは特定のテーブルが存在しないことを警告します。これまでのところ非常に良い - ここに良い部分があります:

テーブルを作成しようとすると、 "temp"という名前で、以前は存在していましたが、次のエラーメッセージが表示されます。

Error : Tablespace for table '`database`.`temp`' exists. Please DISCARD the tablespace before IMPORT.

ただし、テーブルを削除しようとした場合、またはこのテーブルのテーブルスペースを破棄しようとした場合は、

DROP TABLE temp;
ALTER TABLE temp DISCARD TABLESPACE;

次のようなエラーメッセージが表示されます。

Error : Unknown table 'database.temp'
Error : Table 'database.temp' doesn't exist

つまり、表スペースを破棄することをお勧めしますが、削除しようとすると表が存在しません。 DISCARDクエリがチェックしていない別の場所にこのテーブルの何らかのタイプの残りがある可能性はありますか?そして、誰もがそのすべてを引き起こす可能性があるという考えを持っていますか。

私が言ったように、私はこの話題に不慣れで、ほとんど無知です。ラップトップを再起動する、つまりローカルのMySQLサーバーをリセットするか、またはユーザーのアクセス権を設定する必要があると思われますが、ここでは単に仮説を立てています。

111
MattMirabilis

ここで少し遅くなりますが、一般的に、 'innodb_file_per_table'モードで実行しているときに 'tablespace full'エラーが発生したときにこの問題が発生するのを確認しました。あまり詳しく説明しないと(more here )、データベースサーバのテーブルスペースはinnodb_data_file_path設定によって定義され、デフォルトではかなり小さくなります。もっと大きくしても、 'テーブルスペースがいっぱい'はもっと大きなクエリなどで発生する可能性があります(多くの非テーブル 'もの'がそこに格納されています、ログを元に戻したり、キャッシュなど)。

とにかく、私はあなたがテーブルごとのファイルが格納されているOSディレクトリ、OSXのデフォルトでは/ var/lib/mysql、homebrew iircでは/ usr/local/var/mysqlを見ると、孤立したtablename.ibdファイル、通常のコンパニオンtablename.frmファイルはありません。その.ibdファイルを安全な一時的な場所(安全のため)に移動すれば、問題は解決します。

$ ls /var/lib/mysql

table1.frm
table1.idb
table2.frm
table2.ibd
table3.idb <- problem table, no table3.frm
table4.frm
table4.idb

$ mkdir /tmp/mysql_orphans
$ mv /var/lib/mysql/table3.ibd /tmp/mysql_orphans/

ただし、注意点が1つありますが、元々問題の原因となっていることを確認してください。長時間実行されているクエリ、ロックされたテーブルなどが消去されました。それ以外の場合は、もう一度試したときに、孤立した別の.ibdファイルが表示されるだけです。

103
DangerDave

XamppとMampのユーザー

MySQLからデータベースをインポートしている間(空にした後)も同じエラーが発生しました。私は他のすべてが削除されている間私はtablename.ibdファイルが残っていたことがわかりました。 mysql/data/database_nameから手動で削除したところエラーが消えました。

62
Technotronic

WAMP [Windows 7 Ultimate x 64-bit]ユーザーの場合

私はDangerDaveが言ったことに同意するので、私は答えを利用可能にしていますWAMPユーザー

注:まず、..\WAMP\Bin\MySQL\MySQL [あなたのMySQLのバージョン]\Dataフォルダに移動する必要があります。

今、あなたはあなたのすべてのデータベースのフォルダを見るでしょう

  • 問題のあるテーブルがあるデータベースのフォルダをダブルクリックして開きます。
  • ファイル[Your offending MySQL table name].frmがあるべきではなく、代わりにファイル[Your offending MySQL table name].ibdがあるべきです
  • [Your offending MySQL table name].ibdを削除します
  • 次に、ごみ箱からも削除します
  • それからデータベースでMySQLクエリを実行すれば完了です。
22
Harshul Vijay

削除した後に.idbを作り直す場合は、この回答を読んでください。

これは私と一緒に働いた方法です。対応する.idbがなくても.frmファイルがあり、.idbファイルを削除するたびに、データベースでそれが再作成されます。そして私はmysqlで1行に解決策を見つけました ドキュメントテーブルスペースが存在しませんpart)

1-他のデータベースディレクトリに一致する.frmファイルを作成し、孤立テーブルがあるデータベースディレクトリにコピーします。

2-元のテーブルに対してDROP TABLEを発行します。これでテーブルは正常に削除され、InnoDBは.ibdファイルが見つからないという警告をエラーログに出力します。

私は別のテーブル.frmファイルをコピーして、欠けているテーブルのように名前を付けてから、通常のドロップテーブルクエリを作成します。そして、それはうまくいってテーブルは正常にドロップされます!

私のシステムはWindows上のxamppですMariaDB v 10.1.8

17
Accountant م

私の場合、唯一の解決策は次のとおりです。

  1. CREATE TABLE bad_table ENGINE = MyISAM ...
  2. rm bad_table.ibd
  3. DROP TABLE bad_table
5

Usersテーブルを作成しようとしたときに、wampserverで実行したときと同じエラーが発生しました。 users.ibdファイルを見つけ、このファイルを削除した後、再度migrateコマンドを実行しました。私のwindowsマシン上のファイルはwamp/bin/mysql/mysql 5.6.12/data/myprojectにありました。

4
morgan

解決策

しかし、もっと簡単な方法はこれです:mysqlを再起動して、投稿の冒頭近くに記載されているのと同じ4つのステップを実行します。これにより、データディクショナリとファイルのテーブルスペースIDが一致しました。そのため、表領域のインポートは成功しました。

これにより、回復プロセスやファイル転送中にInnoDBのいくつかを確実に処理できるようになります。

ref

4
Bhavin Rana

解決方法は次のとおりです。

  1. データベースをバックアップする(ドロップオプションとデータを含む構造)
  2. mySQLエンジンサービスを停止します
  3. mysql/dataの中から手動でデータベースディレクトリを削除する
  4. mySQLエンジンを起動します。
  5. 破損したデータベースとは異なる任意の名前で新しいデータベースを作成します。
  6. 新しいデータベース内に破損したテーブルの名前を持つ単一のテーブルを作成します(これが秘密です)。そして、まったく同じ構造でテーブルを作成することをお勧めします。
  7. データベースを古い破損したデータベースに名前変更する
  8. バックアップを復元すると、テーブルは正常に動作します。
2
Mahmoud Rabea

このエラーは、機能を中断したときに発生します。以下のクエリを誤った外部キーで実行したようなものです。

set foreign_key_checks=0
2
zeddarn

Tablename.ibdを削除/移動してもうまく動かなかった。

解決方法

破損していて存在していないテーブルを削除しようとしていたので、phpmyadmin-> database-> export->選択したテーブルをbackup-> export(.sqlとして)に移動して、他のテーブルのバックアップを取りました。

その後、データベース名の横にあるデータベースアイコンを選択してドロップしました。新しいデータベースを作成しました。新しいデータベースを選択します - >インポート - >以前にダウンロードしたファイルを選択 - >インポートをクリックします。今私は私の古い作業テーブルを持っていて、破損したテーブルを削除しています。今私はただエラーを投げていたテーブルを作成します。

破損したテーブルを以前にバックアップした可能性があります。

2
Rust

私はFedoraのmariadb 10.2.16で、ログファイルに同じエラーが表示されるテーブルがあったときに行ったこととまったく同じです。

2018-07-11  9:43:58 140323764213504 [Note] InnoDB: The file './database_name/innodb_table.ibd' already exists though the corresponding table did not exist in the InnoDB data dictionary. You can resolve the problem by removing the file.
2018-07-11  9:44:29 140323764213504 [Warning] InnoDB: Tablespace 'database_name/innodb_table' exists in the cache with id 2836 != 2918

あなたの走行距離と誤差は変わるかもしれませんが、私が思う主なものは

...already exists though the corresponding table did not exist in the InnoDB data dictionary...

ドロップテーブルを使用しても、テーブルの変更と同様に機能しません。

MariaDB [database_name]> drop table innodb_table;
ERROR 1051 (42S02): Unknown table 'database_name.innodb_table'

MariaDB [database_name]> alter table innodb_table discard tablespace;
ERROR 1146 (42S02): Table 'database_name.innodb_table' doesn't exist

テーブル作成も失敗します。

MariaDB [database_name]> create table  innodb_table(`id` int(10) unsigned NOT NULL);
ERROR 1813 (HY000): Tablespace for table '`database_name`.`innodb_table`' exists. Please DISCARD the tablespace before IMPORT

これを修正するために、私がしたのは最初のことでした

create table  innodb_table2(`id` int(10) unsigned NOT NULL);
Query OK, 0 rows affected (0.07 sec)

それから/ var/lib/mysql/database_nameディレクトリーで、innodb_table.ibdの上書きを確認して、rootとして次のようにしました。

cp innodb_table2.frm innodb_table.frm
cp innodb_table2.ibd innodb_table.ibd
chown mysql:mysql innodb_table.frm innodb_table.ibd
chmod 660 innodb_table.frm innodb_table.ibd
systemctl restart mariadb

その後、MySQLのコンソールに戻って私は両方のテーブルで正常に削除コマンドを発行しました

MariaDB [database_name]> drop table innodb_table;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    8
Current database: database_name

Query OK, 0 rows affected (0.08 sec)

MariaDB [database_name]> drop table innodb_table2;
Query OK, 0 rows affected (0.25 sec)

そしてすべてがすべて正方形になり、1つのテーブルを再作成できます。

MariaDB [database_name]> create table  innodb_table (`id` int(10) unsigned NOT NULL);
Query OK, 0 rows affected (0.08 sec)
2
Chris

私にとっては、MYSQL DATAディレクトリの下の/ var/lib/mysql/{db_name}(linux)に移動して、{table_name} .ibd fileをドロップするだけでした。フォルダ名として。

1
Yura Galavay

同じテーブルの良いバージョンを持つ別のサーバーがある場合は、コピーを作成できます(table_copy)、table_copyを問題のあるサーバーに転送します。次に、問題のある表を削除し、table_copyをtableに変更します。

1
user3524152

この問題を数回抱えていた。あなたが大きなDBを持っていて、追加された行方不明のテーブルでバックアップ/リストアを避けたいと思うならば、前後に数回試してください:

DROP TABLE my_table;

ALTER TABLE my_table DISCARD TABLESPACE;

-そして-

/ var/lib/mysql/my_db /ディレクトリにあるrm my_table.ibd(対応するmy_table.frmなしの孤児)

-その後-

存在しない場合はCREATE TABLE my_table(...)

1
Nerko

まったく同じ問題がありました。私は[email protected]を追加しました(以前は5.5でしたが)。

5.6のデフォルトはinnodb_file_per_table=1ですが、5.5ではinnodb_file_per_table=0です。

既存のibdata1ファイル(統合されたinnodbデータ)には、作成または削除しようとしているテーブルへの参照がまだあります。 innodb_file_per_tableを0に戻すか、またはibdata1データファイルを削除します(これによりすべてのデータが失われるため、最初にmysqldumpを実行するか、または.sqlダンプを作成してください)。

もう1つの[email protected]デフォルトはポートの欠如でした。そのため、ネットワーキングはunixソケットにとってデフォルトではなく、mysqlクライアントは報告し続けました。

ERROR 2013 (HY000): Lost connection to MySQL server at 'sending authentication information', system error: 32

<string>--port=3306</string>.plist配列に追加しましたが、port=3306my.cnfを指定することもできます。

brew services stop [email protected]を実行して変更してからbrew services start [email protected]

1
jaygooby

表領域を削除しようとすると、他のエラーが発生する可能性があります。私にとっては、私は次のエラーが出ました:

DROP TABLESPACE `tablename`

Error Code: 1478. Table storage engine 'InnoDB' does not support the create option 'TABLESPACE or LOGFILE GROUP' 

私の解決策はデータベースを削除することでした。これにより、それに関連するテーブルスペースがすべて削除され、テーブルを再度作成できるようになります。

1
Aris

Mysqlのrootユーザーとして次のクエリを実行できます。

drop tablespace `tableName`
0
Saroj

私がこの問題を「解決」するために見つけた方法はかなり面倒ですが、それを処理するスクリプトがあります。

基本的に、あなたはibdata1ib_logfile*ファイルが必要です(これらはとりわけ外部キーのマッピングを含みます)。これを行う唯一の安全な方法は、すべてのデータベースをエクスポートし、mysqlを停止し、ファイルを削除し、mysqlを起動してからファイルをインポートすることです。

この問題を解決するのに役立つスクリプトは https://github.com/uberhacker/shrink-ibdata1 です。このスクリプトの目的は異なりますが、は問題を解決します。

0
Glen Solsberry

自分のlocalhostにある古いDBをwampから直接削除し、すべてのサービスを停止し、wamp/bin/mysql/mysql [version]/dataに移動して問題のあるDBを見つけ、削除してすべてのサービスを再度開始します。データベースを再作成すれば完了です。これでテーブルをインポートできます。

0
XMaster

それが私のために働いた唯一の方法は:

  1. 同様のテーブルを作成する
  2. 新しい類似したテーブルの.frmファイルと.idbファイルを破損したテーブルの名前にコピーします。
  3. 権限を修正
  4. MariaDBを再起動します
  5. 破損したテーブルを削除する
0
avibrazil