MySQL ibdファイルを使用してInnoDBテーブルを復元

2712 ワード

発生した問題[Problem]
ある日バグを書いていたら、突然別のバグを発見し、思い切って手の中のバグを置いて別のバグを解決..オフィスのエアコンの温度が高すぎて、暑くて気絶したのかもしれませんが、解決の過程で、製品データベースを見て、色番号を格納する列を見て、値は6-10バイトしか格納されていませんが、タイプはTEXTに設定されています.思い切ってVarchar 64に変えたが、今は自分の機知に「いいね」をつけた.
それから4-5日ほど経って、悲劇的に、下流のクライアントは製品のページに反応して、最終的に戻ったデータが短いことを調べました.図に従って骥を探して、位置付けの原因は、mysqlの格納するデータ、少しだけ残って、わけがわからなくて切られました.その理由は、当然、上記のTEXTからVarcharへの変換によるものである.
数日たっても全量の回復はできないので、Mysql Innodbの単表回復に着手するしかありません.どちらの方法がいいですか?
本文[Solution]
MysqlはアリクラウドRDSに配備されているため、会社もキックアスで、ダブルスペアのインスタンスをしていないし、タイミングランニングスクリプトのバックアップがない(もともとDockerにある)、目の前に置かれている解決方法は2つあります.1つはbinlogリカバリ、1つはibdファイルとfrmファイルリカバリです.ここで選択したのは2つ目で、idbでテーブルの内容を復元します.
デフォルトのバックアップ方式は独立した空間ストレージであるため、各データベースの各テーブルはibdファイルに対応してローカルにダウンロードされ、このテーブル名がpcであると仮定すると、デフォルトはpc.ibd/pc.frmとして格納されます.(idbはコンテンツを格納し、frmは構造を格納する).
リカバリ
リカバリ1 ibdata 1とibd frmでリカバリ
1つ目の方法は、サーバにibdata1 ibd frmの3つのファイルのバックアップが完全であれば、productibd frmibdata1を対応する場所に直接配置して置き換え、mysqlを再起動すればいいです.
リカバリ2用ibdリカバリテーブル
第2の方法は、ibdata 1ファイルのバックアップがなく、単一テーブルのidbファイルしかない場合、他のデータベースでデータベースを再作成することができます(不要な損失を防ぐことができます).PCというデータテーブルを新規作成し、エンジンがinnodbであることに注意し、構造があれば元の構造に従って直接生成したほうがいい.例:
CREATE TABLE `productcolor` (
  `ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '  ',
  `ProductNO` varchar(45) NOT NULL COMMENT '      ',
  `RelatedID` varchar(45) DEFAULT NULL,
  `RGB` text NOT NULL COMMENT 'RGB ',
  `ColorNO` varchar(45) NOT NULL COMMENT '  ',
  `StyleID` int(11) DEFAULT NULL COMMENT 'Style    ',
  `TypeID` int(11) DEFAULT NULL,
  `IsDeleted` tinyint(1) DEFAULT '0',
  `CreateTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '    ',
  PRIMARY KEY (`ID`),
  KEY `idx_productno` (`ProductNO`)
) ENGINE=InnoDB AUTO_INCREMENT=19045 DEFAULT CHARSET=utf8mb4 COMMENT='     ';

これにより、リカバリされたテーブル構造と同じテーブルが作成され、ローカルの/usr/loacl/mysql/data/product/ディレクトリの下にpc.ibdとpc.frmがあります(パスは自分のサーバで決まります).
削除される前の単一テーブルのibdファイルをvimで表示し、:%!xxdtablespaceidを表示し、tablespaceidを後でローカルに作成したデータベースのテーブルのtablespaceidに変更します.ここでは、:%!xxd -rからwqに保存する必要があります.
新しいデータのtablespaceidを新しいデータベースに変更した ibd をコピーし、新しいデータベースのmy.cnfプロファイルをリカバリモードに変更します.
innodb_force_recovery = 6

その後、データベースを再起動すると、バックアップが完了した時点の完全なテーブルデータを復元し、mysqldumpエクスポートで元のデータベースにインポートし、単一テーブルibdリカバリ操作を実現します.
教訓をくみ取って、これからは注意して操作しなければならない.の