私は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サーバーをリセットするか、またはユーザーのアクセス権を設定する必要があると思われますが、ここでは単に仮説を立てています。
ここで少し遅くなりますが、一般的に、 '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ファイルが表示されるだけです。
XamppとMampのユーザー
MySQLからデータベースをインポートしている間(空にした後)も同じエラーが発生しました。私は他のすべてが削除されている間私はtablename.ibd
ファイルが残っていたことがわかりました。 mysql/data/database_name
から手動で削除したところエラーが消えました。
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
を削除します削除した後に.idb
を作り直す場合は、この回答を読んでください。
これは私と一緒に働いた方法です。対応する.idb
がなくても.frm
ファイルがあり、.idb
ファイルを削除するたびに、データベースでそれが再作成されます。そして私はmysqlで1行に解決策を見つけました ドキュメント (テーブルスペースが存在しませんpart)
1-他のデータベースディレクトリに一致する.frmファイルを作成し、孤立テーブルがあるデータベースディレクトリにコピーします。
2-元のテーブルに対してDROP TABLEを発行します。これでテーブルは正常に削除され、InnoDBは.ibdファイルが見つからないという警告をエラーログに出力します。
私は別のテーブル.frm
ファイルをコピーして、欠けているテーブルのように名前を付けてから、通常のドロップテーブルクエリを作成します。そして、それはうまくいってテーブルは正常にドロップされます!
私のシステムはWindows上のxamppですMariaDB v 10.1.8
私の場合、唯一の解決策は次のとおりです。
bad_table
ENGINE = MyISAM ...bad_table
Usersテーブルを作成しようとしたときに、wampserverで実行したときと同じエラーが発生しました。 users.ibdファイルを見つけ、このファイルを削除した後、再度migrateコマンドを実行しました。私のwindowsマシン上のファイルはwamp/bin/mysql/mysql 5.6.12/data/myprojectにありました。
解決策
しかし、もっと簡単な方法はこれです:mysqlを再起動して、投稿の冒頭近くに記載されているのと同じ4つのステップを実行します。これにより、データディクショナリとファイルのテーブルスペースIDが一致しました。そのため、表領域のインポートは成功しました。
これにより、回復プロセスやファイル転送中にInnoDBのいくつかを確実に処理できるようになります。
解決方法は次のとおりです。
このエラーは、機能を中断したときに発生します。以下のクエリを誤った外部キーで実行したようなものです。
set foreign_key_checks=0
Tablename.ibdを削除/移動してもうまく動かなかった。
解決方法
破損していて存在していないテーブルを削除しようとしていたので、phpmyadmin-> database-> export->選択したテーブルをbackup-> export(.sqlとして)に移動して、他のテーブルのバックアップを取りました。
その後、データベース名の横にあるデータベースアイコンを選択してドロップしました。新しいデータベースを作成しました。新しいデータベースを選択します - >インポート - >以前にダウンロードしたファイルを選択 - >インポートをクリックします。今私は私の古い作業テーブルを持っていて、破損したテーブルを削除しています。今私はただエラーを投げていたテーブルを作成します。
破損したテーブルを以前にバックアップした可能性があります。
私は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)
私にとっては、MYSQL DATAディレクトリの下の/ var/lib/mysql/{db_name}(linux)に移動して、{table_name} .ibd fileをドロップするだけでした。フォルダ名として。
同じテーブルの良いバージョンを持つ別のサーバーがある場合は、コピーを作成できます(table_copy)、table_copyを問題のあるサーバーに転送します。次に、問題のある表を削除し、table_copyをtableに変更します。
この問題を数回抱えていた。あなたが大きな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
(...)
まったく同じ問題がありました。私は[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=3306
にmy.cnf
を指定することもできます。
brew services stop [email protected]
を実行して変更してからbrew services start [email protected]
表領域を削除しようとすると、他のエラーが発生する可能性があります。私にとっては、私は次のエラーが出ました:
DROP TABLESPACE `tablename`
Error Code: 1478. Table storage engine 'InnoDB' does not support the create option 'TABLESPACE or LOGFILE GROUP'
私の解決策はデータベースを削除することでした。これにより、それに関連するテーブルスペースがすべて削除され、テーブルを再度作成できるようになります。
Mysqlのrootユーザーとして次のクエリを実行できます。
drop tablespace `tableName`
私がこの問題を「解決」するために見つけた方法はかなり面倒ですが、それを処理するスクリプトがあります。
基本的に、あなたはibdata1
とib_logfile*
ファイルが必要です(これらはとりわけ外部キーのマッピングを含みます)。これを行う唯一の安全な方法は、すべてのデータベースをエクスポートし、mysqlを停止し、ファイルを削除し、mysqlを起動してからファイルをインポートすることです。
この問題を解決するのに役立つスクリプトは https://github.com/uberhacker/shrink-ibdata1 です。このスクリプトの目的は異なりますが、は問題を解決します。
自分のlocalhostにある古いDBをwampから直接削除し、すべてのサービスを停止し、wamp/bin/mysql/mysql [version]/dataに移動して問題のあるDBを見つけ、削除してすべてのサービスを再度開始します。データベースを再作成すれば完了です。これでテーブルをインポートできます。
それが私のために働いた唯一の方法は: