私はすべてのデータベーステーブルファイルを持っているMySQL InnoDBを持っています、しかしMySQLはそれらを見ないし、それらをロードしません。
これらの3つのファイルibdata1
、ib_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
MySQLがそれらのファイルを見ることができない理由はここにあります:システムテーブルスペース(ibdata1)はInnoDBが潜在的なテーブル使用法をマップすることを可能にするStorage-Engine特有のデータ辞書を持っています:
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
データベースに復元してみましょう。
.frm
に.ibd
および/tmp/innodb_data
ファイルのバックアップがあることを確認してください。
CREATE TABLE tags
ステートメントを取得し、それをCREATE TABLE mydb.tags ...
として実行します。元のtags.frm
とまったく同じ構造であることを確認してください。
MySQLを使用して空のtags.ibd
を削除します
ALTER TABLE mydb.tags DISCARD TABLESPACE;
tags.ibd
のバックアップコピーを取り込む
cd /var/lib/mysql/mydb
cp /tmp/innodb_data.tags.ibd .
chown mysql:mysql tags.ibd
InnoDBデータディクショナリにtags
テーブルを追加する
ALTER TABLE mydb.tags IMPORT TABLESPACE;
テーブルのアクセシビリティをテストする
SHOW CREATE TABLE mydb.tags\G
SELECT * FROM mydb.tags LIMIT 10;
正常な結果が得られたら、InnoDBテーブルをインポートしていただきありがとうございます。
将来的には、ibdata1とそのログを削除しないでください
私は前にこのようなことについて議論しました
Apr 23, 2012
: MySQL:.frmと.ibdファイルに保存されているテーブルを復元するにはどうすればいいですか?Sep 28, 2011
: ファイルが移動されたInnoDBテーブルを回復する方法tags
のテーブル構造が分からない場合はどうしますか?
.frm
ファイルを使用するだけでCREATE TABLEステートメントを取得するためのツールがあります。私もこれについての記事を書きました: どうやって.frmファイルからテーブルスキーマを抽出することができますか? 。その記事では、LinuxマシンからWindowsマシンに.frmファイルをコピーし、Windowsツールを実行してCREATE TABLE
ステートメントを取得しました。
私は同じ状況があります、特定のtblnameを削除または作成することはできません。私の修正手順は以下のとおりです。
MySQLを停止します。
service mysql stop
Ib_logfile0とib_logfile1を削除します。
cd /var/lib/mysql;
rm ib_logfile0 ib_logfile1
Tblnameファイルを削除します。 警告:これはあなたのデータを完全に削除します
cd /var/lib/mysql/dbname;
rm tblname*
MySQLを起動します。
service mysql start
私もこの問題を抱えていました。誤ってibdata1
を削除したため、データがすべて失われました。
GoogleとSOで1〜2日の検索を行った後、ようやく自分の命を救う解決策を見つけました(膨大なレコードを含むデータベースとテーブルが非常に多くありました)。
/var/lib/mysql
からバックアップを取ります
dbsake を使って.frm
ファイルからテーブルスキーマを復元します(別のオプションがありました!mysqlfrm。私のために働くt)
dbsake frmdump --type-codes /var/lib/mysql/database-name/tbl.frm
エクスポートされたスキーマを使用して(新しい名前で)新しいテーブルを作成します。
このコマンドで新しいテーブルデータを破棄します。
ALTER TABLE `tbl-new` DISCARD TABLESPACE;
cp tbl.ibd [email protected] && chown mysql:mysql [email protected]
ALTER TABLE `tbl-new` IMPORT TABLESPACE;
DROP TABLE `tbl`;
/var/lib/mysql/database-name
を確認し、古いテーブルのデータ(.ibd
ファイル)がある場合はそれを削除してください。rm tbl.ibd
ALTER TABLE `tbl-new` RENAME `tbl`;