MySQLは.frm和ibdファイルリカバリデータ

4694 ワード

前言
MySQLのデータベースでは、インストールディレクトリの下にあるdataフォルダの下にある同命フォルダに関連ファイルが格納されており、ストレージエンジンによって作成されたテーブルによってファイルが異なります.次に、これらのデータベースファイルを認識します.
db.opt
ライブラリのデフォルトの文字セット符号化と文字セットソート規則を記録するために使用されます.すなわち、データベースがデフォルトの文字セットとソートルールを指定する場合、後続のテーブルが文字セットとソートルールを指定していない場合、新しいテーブルはdbを採用する.optファイルで指定したプロパティ.
.frm
テーブルに関するメタデータ情報はすべて格納.frmファイルでは、主にテーブル構造の定義情報であり、どのストレージエンジンでもテーブル名で命名される.frmファイル.
MYDと.MYI
.MYD:MY Dataは、MyISAMストレージエンジン専用のMyISAMテーブルを格納ためのデータである.MYI:MY Indexは、MyISAMストレージエンジンに特化した主なMyISAMテーブルを格納するインデックス関連情報でもある.
ibdと.ibdata
どちらもInnoDBストレージエンジン専用のデータベースファイルです.共有テーブル空間を利用する場合、全てのInnoDBテーブルのデータが格納される.ibdataでは、テーブルがますます多くなると、このファイルは大きくなります.対応するibdとは,表領域を独占する場合のInnoDB表を用いたデータファイルである.テーブルスペースを独り占めする方法に変更するのはmy.iniプロファイルにこのバーを追加/変更するには、Innodb_file_per_table=1注意:筆者が使用するMySQL-5.7はデフォルトのテーブルスペースであり、プロファイルに追加する必要はありません.
もちろん、ユニークな表空間を開いても、ibdataファイルもますます大きくなります.このファイルには保存されているからです.
  • 変更バッファ
  • デュアルライトバッファ
  • 取り消しログ
  • これらのものはいったい何ですか.私も知らない233
    MyISAMストレージエンジンであれば、直接コピーします.frm、.MYD、.MYIは新しいライブラリフォルダの下に行けばいいので、便利で簡単に使えます.しかし、現在MySQLは構成されていない場合、デフォルトのストレージエンジンはInnoDBであり、優位性があることを示しています.具体的に両者の違いは別編やネットで資料を調べてみましょう.三言二言でははっきり言えませんが、ここでは展開しません.もちろん、このブログにアクセスできるのはInnoDBテーブルのデータ復旧を見たいに違いない.特に紛失した.ibdataファイルの場合.
    一、回復表構造
    最も重要なことは、テーブル構造を復元することです.幸いにも当時のテーブル構造を保持していれば、このステップはスキップできます.
    1.1同じ名前のテーブルを任意に作成する
    CREATE TABLE weibo_tweets(a int)ENGINE=InnoDB;

    1.2 mysqlサービスのクローズnet stop mysql
    1.3バックアップのコピーfrmは新しいテーブルを上書きする.frm
    1.4 mysqlサービスを開始するnet start mysql
    1.5 mysqlインストールディレクトリdataフォルダの下にテキストエディタで開く.Errファイル
    これはmysqlのエラーログで、2018-01-09T08:19:46.170814Z 3 [Warning] InnoDB: Table data_rec/weibo_tweets contains 1 user defined columns in InnoDB, but 6 columns in MySQL. Please check INFORMATION_SCHEMA.INNODB_SYS_COLUMNSなどのレコードが見つかり、元のテーブルに6つのフィールドがあることがわかりました.
    1.6現在のテーブルを削除し、6つのフィールドを持つ同じ名前のテーブルを新規作成する
    mysql> DROP TABLE weibo_tweets;
    Query OK, 0 rows affected (0.26 sec)
    
    mysql>CREATE TABLE weibo_tweets(a1 int,a2 int,a3 int,a4 int,a5 int,a6 int)ENGINE=InnoDB;
    Query OK, 0 rows affected (0.66 sec)

    1.7手順1.2-1.3を繰り返す
    プロファイルを変更するmy.ini[mysqld]でinnodb_force_recovery=6を追加/変更
    1.8 mysqlサービスを開始し、テーブル構造を確認し、テーブル構造が回復したことを発見する
    mysql> desc weibo_tweets;
    +-------------+---------------+------+-----+-------------------+----------------+
    | Field       | Type          | Null | Key | Default           | Extra          |
    +-------------+---------------+------+-----+-------------------+----------------+
    | id          | int(11)       | NO   | PRI | NULL              | auto_increment |
    | uid         | varchar(10)   | NO   |     | NULL              |                |
    | content     | varchar(1000) | YES  |     | NULL              |                |
    | pub_time    | varchar(20)   | YES  |     | NULL              |                |
    | tool        | varchar(50)   | YES  |     | NULL              |                |
    | create_time | datetime      | YES  |     | CURRENT_TIMESTAMP |                |
    +-------------+---------------+------+-----+-------------------+----------------+
    6 rows in set, 1 warning (0.01 sec)

    表構造を導出、コマンドプロンプトの下にmysqldump -uroot -proot data_rec weibo_twets > e:\tweets.sqlを入力.sqlファイルにテーブル作成文が見つかりました.あるいは、navicatなどのデータベース管理ソフトウェアでこのテーブルを見つけ、オブジェクト情報にDDLタブの内容をコピーすることもできます.
    1.9 mysqlサービスを停止し、プロファイルmyを変更する.ini innodb_force_recovery=0を修正するか、直接注釈します.
    2.0 mysqlサービスを起動し、このテーブルを削除し、取得したテーブル文でテーブルを新規作成する
    これで、テーブル構造は完全に復元されました.
    二、回復表データ
    2.1表領域の分離
    現在のibdのデータファイルと.frm分離.ALTER TABLE weibo_tweets DISCARD TABLESPACE;
    2.2バックアップのコピーibdファイルは新しいテーブルデータを上書きする
    2.3新しい接続の再確立ALTER TABLE weibo_tweets IMPORT TABLESPACE;これで、データの復元が完了しました.
    三、後の話
    ネット上でvimで16進数で開く人がいます.ibdファイルは、表領域IDを見てバックアップする.ibdファイルの上書き後の表領域IDの変更は新しい.ibdファイルのIDは、データファイルと表領域の接続を再確立してデータを復元することもできます.Windows環境ではWinHexでこの目的を達成することができ、聞こえることも可能です.私は怠け者なのでやってみません.興味のある余力のある人はやってみてください.