MySQL ibdファイルを使用してInnoDBテーブルを復元
2712 ワード
発生した問題[Problem]
ある日バグを書いていたら、突然別のバグを発見し、思い切って手の中のバグを置いて別のバグを解決..オフィスのエアコンの温度が高すぎて、暑くて気絶したのかもしれませんが、解決の過程で、製品データベースを見て、色番号を格納する列を見て、値は6-10バイトしか格納されていませんが、タイプは
それから4-5日ほど経って、悲劇的に、下流のクライアントは製品のページに反応して、最終的に戻ったデータが短いことを調べました.図に従って骥を探して、位置付けの原因は、mysqlの格納するデータ、少しだけ残って、わけがわからなくて切られました.その理由は、当然、上記の
数日たっても全量の回復はできないので、
本文[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つ目の方法は、サーバに
リカバリ2用ibdリカバリテーブル
第2の方法は、ibdata 1ファイルのバックアップがなく、単一テーブルのidbファイルしかない場合、他のデータベースでデータベースを再作成することができます(不要な損失を防ぐことができます).PCというデータテーブルを新規作成し、エンジンがinnodbであることに注意し、構造があれば元の構造に従って直接生成したほうがいい.例:
これにより、リカバリされたテーブル構造と同じテーブルが作成され、ローカルの
削除される前の単一テーブルのibdファイルをvimで表示し、
新しいデータの
その後、データベースを再起動すると、バックアップが完了した時点の完全なテーブルデータを復元し、mysqldumpエクスポートで元のデータベースにインポートし、単一テーブルibdリカバリ操作を実現します.
教訓をくみ取って、これからは注意して操作しなければならない.の
ある日バグを書いていたら、突然別のバグを発見し、思い切って手の中のバグを置いて別のバグを解決..オフィスのエアコンの温度が高すぎて、暑くて気絶したのかもしれませんが、解決の過程で、製品データベースを見て、色番号を格納する列を見て、値は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つのファイルのバックアップが完全であれば、product
のibd frm
とibdata1
を対応する場所に直接配置して置き換え、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で表示し、
:%!xxd
でtablespaceid
を表示し、tablespaceid
を後でローカルに作成したデータベースのテーブルのtablespaceid
に変更します.ここでは、:%!xxd -r
からwq
に保存する必要があります.新しいデータの
tablespaceid
を新しいデータベースに変更した ibd
をコピーし、新しいデータベースのmy.cnf
プロファイルをリカバリモードに変更します.innodb_force_recovery = 6
その後、データベースを再起動すると、バックアップが完了した時点の完全なテーブルデータを復元し、mysqldumpエクスポートで元のデータベースにインポートし、単一テーブルibdリカバリ操作を実現します.
教訓をくみ取って、これからは注意して操作しなければならない.の