昨日、MySQL データベースを SQL ファイルにダンプし、ibdata1 ファイルの名前を変更しました。その後、それを再作成して SQL ファイルをインポートし、新しい ibdata1 ファイルを MySQL データ ディレクトリに移動し、古いファイルを削除しました。
以前も問題なく実行できましたが、今回は何かがおかしいです。(MySQL 設定ではなく個人用)データベースを調べると、すべて存在していますが、空です… まあ。データディレクトリには、正しい内容の .ibd ファイルがまだあり、テーブルを表示できます。リストデータベースには存在しますが、テーブル自体には存在しません。(テーブルごとにファイルが有効になっており、すべてにおいて InnoDB をデフォルトとして使用しています。)
例えば、URLデータベースとそのURLテーブルの場合、mysql.exeまたはphpMyAdminを開いて正常に実行できますuse urls;
。期待したテーブルを表示することもできますが、またはをshow tables;
実行しようとすると、テーブルが存在しないというエラーが表示されます(describe urls;
select * from urls;
ただリストに表示されました)。(MySQL 管理者はデータベースをリストしますが、テーブルはリストしません。これは、データベースが完全に空であることを示します。)
問題は、SQL ファイルをすでに削除してしまったことです (ハード ドライブを徹底的に調べても復元できません)。そのため、これらのデータベース/テーブルを修復する方法を見つけようとしています。テーブルが存在しないというエラーが表示されるため、テーブル修復機能を使用できません。また、テーブルが存在しないというエラーが表示されるため、ダンプもできません。
すでに述べたように、データ自体は .ibd ファイルに存在し、テーブル名も存在します。必要なのは、データベースにテーブルが存在することを MySQL に認識させる方法だけです (問題のテーブルの列名は、16 進エディターを使用して ibdata1 ファイルで見つけることができます)。
この種の破損を修復する方法をご存知ですか? 袖をまくり上げて、調査し、修正するための一連の手順を実行することは構いません。
どうもありがとう。
答え1
まあ、私はいろいろなことを試し、たくさんのコマンド、スイッチ、構造を調べました (当然のことながら、MySQL のドキュメントは、膨大ではありますが、非常に役に立ちました。針と干し草の山です)。最終的に、私のトリックのいくつかはうまくいきました (他の人も同じトリックを考えていたことがわかりましたが、テーブル構造の回復とデータの回復という 2 つの主要な部分が 1 か所にまとめられていなかったので、ここでまとめて投稿します)。
私がしなければならなかったのは、IBDATA1 ファイルを再作成することでした。残念ながら、デーモンの実行中にデータベース (ディレクトリ) が検出されても、内部の Innodb テーブル (IBD/FRM ファイル) は取得されません。そこで、次の操作を実行しました。
- データディレクトリを空にします(または元のディレクトリを移動して空のディレクトリを作成します)
- デーモンを実行し、新しい空のIBDATA1ファイルを作成します。
- SQLスクリプトを使用してシステムテーブルをインポートします。
…\MySQL\share
- 同じ名前のダミーデータベースとテーブルを作成する
- 元のFRMファイルをコピーする
- どちらか
DESCRIBE
またはそれ以上を使用して、SHOW TABLE CREATE
テーブル構造を抽出します - 次に
DISCARD TABLESPACE
テーブルの上に - 元のIBDファイルにコピー
- それから私は
IMPORT TABLESPACE
- 最後に、デーモンを再度実行しました。
innodb-force-recovery=6
- そして私は
mysqldump
構造とデータを抽出するために走りました
もちろん、いつもスムーズだったわけではありません。問題のないテーブルもありましたが、 の後にテーブルとデータベースを削除しSHOW TABLE CREATE
、それを使用してテーブルを再作成してからデータをインポートする必要がありました。それ以外はそこまでも機能せず、16 進エディターを使用して FRM ファイルから列のコメントと名前を手動で取得する必要がありました (ただし、データ型と属性、キーなどが何であるかを把握するのは運任せでした)。また、デーモンとクライアントの再起動が多すぎました。
(私は今でも、FRM/IBD ファイルを直接解析する (または少なくとも FRM ファイルからテーブル構造を表示する) ツールを探していますが、オープンソースであり、ファイル形式が公開されているにもかかわらず、誰も「リバース エンジニアリング」しようとしていないようです。誰もが公式の MySQL ツールを使用することに満足しているようです。そのため、データ復旧会社や独自/商用ツールに大きなチャンスが生まれています。)
重要なのは、常に絶対的に最小限のもの (たとえば、MYSQL ディレクトリのみ、つまりシステム テーブル) で作業することです。残念ながら、これは物事が簡素化され、作業が簡単になることを意味しますが、一度に 1 つのテーブルを回復することも意味します。これは私にとっては大したことではありませんが、人によっては大したことかもしれません。
とにかく、過去数日間インターネットで見た多くの MySQL リカバリ ページのうち、いくつかは非常に役立ちました。履歴を徹底的に調べて、それらを発掘したら、追加します。
同様の状況にある他の人の役に立つことを願っています。
答え2
すべてのテーブルとデータベースを一覧表示できるということは、通常、*.frm ファイルが存在することを意味します。それらのデータが存在するということではありません。mysqld プロセスを開始してみましたか?InnoDB リカバリの強制? そうでない場合は試してください。はいの場合、起動時に MySQL ログに何と表示されますか?
それが完了したら、二度とそのようなバックアップを使用しないでください。