2013-11-13 14:52:59 +0000 2013-11-13 14:52:59 +0000
33
33

MySQL InnoDBはテーブルを失ったが、ファイルは存在する

私はMySQLのInnoDBでデータベースのテーブルファイルをすべて持っているのですが、MySQLはそれらを見ていないし、それらをロードしていません。

この問題は、この3つのファイルを削除したために発生しました。ibdata1, ib_logfile0, ib_logfile1, 0x6&

といった3つのファイルを削除したために問題が発生しました。

MySQLにテーブルを再表示させるにはどうしたらいいですか?

about_member.frm site_stories.frm
about_member.ibd site_stories.ibd
db.opt stories.frm
FTS_00000000000000bb_BEING_DELETED_CACHE.ibd stories.ibd
FTS_00000000000000bb_BEING_DELETED.ibd story_comments.frm
FTS_00000000000000bb_CONFIG.ibd story_comments.ibd
FTS_00000000000000bb_DELETED_CACHE.ibd story_likes.frm
FTS_00000000000000bb_DELETED.ibd story_likes.ibd
FTS_00000000000000f5_BEING_DELETED_CACHE.ibd story_tags.frm
FTS_00000000000000f5_BEING_DELETED.ibd story_tags.ibd
FTS_00000000000000f5_CONFIG.ibd story_views.frm
FTS_00000000000000f5_DELETED_CACHE.ibd story_views.ibd
FTS_00000000000000f5_DELETED.ibd story_view_totals.frm
member_favorites.frm story_view_totals.ibd
member_favorites.ibd tags.frm
members.frm tags.ibd
members.ibd

回答 (3)

36
36
36
2013-11-14 15:34:22 +0000

MySQL がこれらのファイルを見ることができない理由は次のとおりです。システムテーブル空間(ibdata1)には、ストレージエンジン固有のデータ辞書があり、これを使用してInnoDBがテーブルの使用可能性をマップすることができます。

ALTER TABLE tblname DISCARD TABLESPACE;
ALTER TABLE tblname IMPORT TABLESPACE;

InnoDBテーブルをある場所から別の場所に移動するには、

ALTER TABLE mydb.tags DISCARD TABLESPACE;

以下は MySQL 5.5 ドキュメント の一部で、考慮すべき点について説明されています。InnoDB共有テーブルスペースに格納されているテーブル定義には、データベース名が含まれています。テーブルスペースファイルに格納されているトランザクションIDとログシーケンス番号もデータベース間で異なります。

.ibd ファイルと関連するテーブルをあるデータベースから別のデータベースに移動するには、RENAME TABLE ステートメントを使用します。

RENAME TABLE db1.tbl_name TO db2.tbl_name; .ibdファイルの “クリーン "バックアップがあれば、以下のようにして元のMySQLインストレーションに復元することができます。

.ibdファイルをコピーしてからテーブルが削除されたり、切り捨てられたりしてはいけません。

このALTER TABLE文を発行して、現在の.ibdファイルを削除します。

ALTER TABLE tbl_name DISCARD TABLESPACE; バックアップの.ibdファイルを適切なデータベースディレクトリにコピーします。

このALTER TABLE文を発行して、テーブルに新しい.ibdファイルを使用するようにInnoDBに指示します。

ALTER TABLE tbl_name IMPORT TABLESPACE; このコンテキストでは、「クリーンな」.ibdファイルのバックアップは、以下の要件を満たすものです。

.ibdファイル内にトランザクションによるコミットされていない変更がない。

.ibdファイルにマージされていない挿入バッファエントリがない。

パージにより、.ibdファイルからすべての削除マーク付きインデックスレコードが削除されました。

mysqld は .ibd ファイルのすべての変更されたページをバッファプールからファイルにフラッシュしました。

これらの注意点とプロトコルを考えると、次のような行動が考えられます。

この例では、tagsテーブルをmydbデータベースにリストアしてみましょう

STEP #1

これらの.frmファイルと.ibdファイルのバックアップが/tmp/innodb_data にあることを確認してください。オリジナルのCREATE TABLE tags

と全く同じ構造であることを確認してください。 # STEP #3

MySQLを使用して空のCREATE TABLE mydb.tags ...を削除してください。 cd /var/lib/mysql/mydb cp /tmp/innodb_data.tags.ibd . chown mysql:mysql tags.ibd

STEP #5

tags.frm テーブルをInnoDBデータ辞書に追加

ALTER TABLE mydb.tags IMPORT TABLESPACE;

STEP 6

テーブルのアクセシビリティをテスト

SHOW CREATE TABLE mydb.tags\G
SELECT * FROM mydb.tags LIMIT 10;

正常な結果が得られた場合。おめでとうございます!InnoDBテーブルがインポートされました。

STEP 7

今後はibdata1とそのログを削除しないでください

Give it a Try !

CAVEAT

tagsのテーブル構造を知らない場合はどうすればいいですか?

Apr 23, 2012ファイルを使ってCREATE TABLE文を取得するツールがあります。これについては、以前にも記事を書きました: .frmファイルだけからテーブルスキーマを抽出する方法。その記事では、LinuxからWindowsマシンに.frmファイルをコピーし、Windowsツールを実行してSep 28, 2011文を取得しました。

10
10
10
2014-01-28 02:08:22 +0000

私も同じ状況で、特定のtblnameをドロップしたり、作成したりすることができません。修正方法は以下の通りです。

1.MySQLを停止。

  1. ib_logfile0とib_logfile1を削除する。

  2. tblnameファイルを削除してください。警告: これはあなたのデータを永久に削除します

  3. MySQLを起動します。

2
2
2
2019-03-27 11:19:13 +0000

私もこの問題がありました。ibdata1を誤って削除してしまい、すべてのデータが失われてしまいました。

1-2日かけてgoogleやSOで検索した結果、最終的に私の人生を救ってくれた解決策を見つけました(私は膨大なレコードを持つ多くのデータベースとテーブルを持っていました)。

  1. /var/lib/mysql

  2. .frm ファイルから dbsake でテーブルスキーマを復旧 (他にも mysqlfrm というオプションがありましたが、私の場合はうまくいきませんでした)

dbsake frmdump --type-codes /var/lib/mysql/database-name/tbl.frm
  1. エクスポートしたスキーマで新しいテーブル (新しい名前で) を作成する。
ALTER TABLE `tbl-new` DISCARD TABLESPACE;
  1. このコマンドで新しいテーブルデータを破棄する。
cp tbl.ibd tbl@002dnew.ibd && chown mysql:mysql tbl@002dnew.ibd
  1. 古いテーブルのデータをコピーして、新しいテーブルの代わりに貼り付け、そのデータに正しいパーミッションを設定する。
ALTER TABLE `tbl-new` IMPORT TABLESPACE;
  1. 新しいテーブルにデータをインポートする。
DROP TABLE `tbl`;
  1. よし!新しいテーブルにデータがあるので、古いテーブルを削除することができます。
rm tbl.ibd
  1. /var/lib/mysql/database-nameをチェックし、古いテーブルのデータ(.ibdファイル)があれば削除。
ALTER TABLE `tbl-new` RENAME `tbl`;
  1. 最後に新しいテーブルの名前を元の名前に変更する

0x1&