web-dev-qa-db-ja.com

MySQL InnoDBはテーブルを失いましたがファイルは存在します

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

これらの3つのファイルibdata1ib_logfile0およびib_logfile1を削除したため、問題が発生しました

mysqlの起動時に問題が発生していたため、MySQLでそれらが再生成されるため、それらを削除することをお勧めしていました(私はそれらをバックアップするべきだったのですが、しなかった).

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
30
Get Off My Lawn

MySQLがそれらのファイルを見ることができない理由はここにあります:システムテーブルスペース(ibdata1)はInnoDBが潜在的なテーブル使用法をマップすることを可能にするStorage-Engine特有のデータ辞書を持っています:

InnoDB Architecture

InnoDBテーブルをある場所から別の場所に移動するには、次のようなコマンドが必要です。

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

考慮すべき点を説明した MySQL 5.5ドキュメント の一部です。

.ibdファイルの移植性に関する考慮事項

MyISAMテーブルファイルの場合のように、データベースディレクトリ間で.ibdファイルを自由に移動することはできません。 InnoDB共有テーブルスペースに格納されているテーブル定義には、データベース名が含まれています。テーブルスペースファイルに格納されているトランザクションIDとログシーケンス番号も、データベースによって異なります。

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

表db1.tbl_nameをdb2.tbl_nameに名前変更します。 .ibdファイルの「クリーン」なバックアップがある場合は、それを元のMySQLインストールに復元することができます。

テーブルが.ibdファイルをコピーした後に削除または切り捨てられてはなりません。変更すると、テーブルスペース内に保存されているテーブルIDが変更されるためです。

このALTER TABLEステートメントを発行して、現在の.ibdファイルを削除します。

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

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

ALTER TABLE tbl_nameインポートテーブルスペース。この文脈では、「クリーン」な.ibdファイルのバックアップは、次の要件が満たされているものです。

.ibdファイルにトランザクションによるコミットされていない変更はありません。

.ibdファイルにマージされていない挿入バッファエントリはありません。

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

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

これらの警告とプロトコルを考えると、ここに提案された行動方針があります。

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

ステップ1

.frm.ibdおよび/tmp/innodb_dataファイルのバックアップがあることを確認してください。

ステップ2

CREATE TABLE tagsステートメントを取得し、それをCREATE TABLE mydb.tags ...として実行します。元のtags.frmとまったく同じ構造であることを確認してください。

ステップ3

MySQLを使用して空のtags.ibdを削除します

ALTER TABLE mydb.tags DISCARD TABLESPACE;

ステップ4

tags.ibdのバックアップコピーを取り込む

cd /var/lib/mysql/mydb
cp /tmp/innodb_data.tags.ibd .
chown mysql:mysql tags.ibd

ステップ5

InnoDBデータディクショナリにtagsテーブルを追加する

ALTER TABLE mydb.tags IMPORT TABLESPACE;

ステップ6

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

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

正常な結果が得られたら、InnoDBテーブルをインポートしていただきありがとうございます。

ステップ7

将来的には、ibdata1とそのログを削除しないでください

試してみる !!!

私は前にこのようなことについて議論しました

警告

tagsのテーブル構造が分からない場合はどうしますか?

.frmファイルを使用するだけでCREATE TABLEステートメントを取得するためのツールがあります。私もこれについての記事を書きました: どうやって.frmファイルからテーブルスキーマを抽出することができますか? 。その記事では、LinuxマシンからWindowsマシンに.frmファイルをコピーし、Windowsツールを実行してCREATE TABLEステートメントを取得しました。

34
RolandoMySQLDBA

私は同じ状況があります、特定のtblnameを削除または作成することはできません。私の修正手順は以下のとおりです。

  1. MySQLを停止します。

    service mysql stop
    
  2. Ib_logfile0とib_logfile1を削除します。

    cd /var/lib/mysql;
    rm ib_logfile0 ib_logfile1
    
  3. Tblnameファイルを削除します。 警告:これはあなたのデータを完全に削除します

    cd /var/lib/mysql/dbname;
    rm tblname*
    
  4. MySQLを起動します。

    service mysql start
    
9
user293871

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

GoogleとSOで1〜2日の検索を行った後、ようやく自分の命を救う解決策を見つけました(膨大なレコードを含むデータベースとテーブルが非常に多くありました)。

  1. /var/lib/mysqlからバックアップを取ります

  2. dbsake を使って.frmファイルからテーブルスキーマを復元します(別のオプションがありました!mysqlfrm。私のために働くt)

dbsake frmdump --type-codes /var/lib/mysql/database-name/tbl.frm
  1. エクスポートされたスキーマを使用して(新しい名前で)新しいテーブルを作成します。

  2. このコマンドで新しいテーブルデータを破棄します。

ALTER TABLE `tbl-new` DISCARD TABLESPACE;
  1. 古いテーブルのデータをコピーして、新しいテーブルの代わりに貼り付けて、正しい権限を設定します。
cp tbl.ibd [email protected] && chown mysql:mysql [email protected]
  1. 新しいテーブルにデータをインポートします。
ALTER TABLE `tbl-new` IMPORT TABLESPACE;
  1. 大丈夫です!新しいテーブルにデータがあり、古いテーブルを削除できます。
DROP TABLE `tbl`;
  1. /var/lib/mysql/database-nameを確認し、古いテーブルのデータ(.ibdファイル)がある場合はそれを削除してください。
rm tbl.ibd
  1. そして最後に新しいテーブルの名前を元の名前に変更します。
ALTER TABLE `tbl-new` RENAME `tbl`;
1
mostafaznv