ファイルが移動されたInnoDBテーブルを回復する方法


13

そのため、レプリケーションストリームでセットアップされたテストデータベースサーバーがあります。名前を超えて、スレーブdatadirのスペースをすぐにいっぱいにする最適化が行われました。Mysqlは忠実に、もう少しスペースを待っていました。

このdatadirはmysqlのdatadirとしてのみ使用されるファイルシステムであるため、他に解放するものはありませんでした。

レプリケーションストリームの一部ではない4ギガのinnodbテストテーブルがあったので、それが機能するかどうかを確認するために何かを試してみようと思ったのです。

これが私がとったステップです

  1. 移動しようとしていたテーブルをフラッシュしました
  2. 読み取りロックを設定しました(書き込みがなく、レプリケーションストリームにない場合でも)
  3. .frmと.ibdをファイルシステムにコピーし、予備の部屋を用意しました
  4. テーブルのロックを解除しました
  5. そのテーブルは切り捨てられました-これにより、最適化が完了するのに十分なスペースが解放され、レプリケーションが再び開始されます。
  6. mysqlのスレーブ化/シャットダウンを停止する
  7. ファイルをtmpからデータディレクトリにコピーして戻します
  8. mysqlを再起動します

.errログには何も表示されず、見た目は良好です。mydbに接続して使用します。ショーテーブルで私がいじっていたテーブルを参照してください。しかし、私が試してみると

select * from testtable limit 10;

エラーが出ます

ERROR 1146 (42S02): Table 'mydb.testtable' doesn't exist

私がこれまでに伝えることができることから、私は他のすべてのテーブルから問題なく読むことができ、複製は苦情なしでバックアップを開始しました。

この時点から回復するためにできることはありますか?必要に応じてゼロから再構築できますが、他の人がこのベンチャーについて一般的に考えていることを知りたいと思いました。完璧な結果が得られなかった一連の手順について何かありましたか?

これがテストサーバーでない場合、「ライブで実行」して何が起こるかを確認できませんでした。私がそれを気に入らなければならなかった場合、本番スレーブのスペースを一時的に解放する最良の方法は何でしょうか?

回答:


15

ほとんどの人がTRUNCATE TABLEについて忘れている最大のことは、TRUNCATE TABLEがDMLではなくDDLであることです。InnoDBでは、ibdata1内のメタデータには、InnoDBテーブルの番号付きリストが含まれています。TRUNCATE TABLEを使用すると、InnoDBテーブルの内部メタデータIDがシフトします。これは、TRUNCATE TABLEが次のことを効果的に行うために発生します。

例:mydb.mytbというInnoDBテーブルを切り捨てる

USE mydb
CREATE TABLE newtb LIKE mytb;
ALTER TABLE mytb RENAME oldtb;
ALTER TABLE newtb RENAME mytb;
DROP TABLE oldtb;

したがって、新しいmytbは異なる内部メタデータIDを持ちます。

.ibdファイルを他の場所にコピーすると、.ibdには元の内部メタデータIDが含まれます。.ibdファイルを元に戻すだけでは、内部メタデータIDとibdata1のメタデータIDの調整は発生しません。

あなたがすべきだったことはこれです:

InnoDBテーブルの.ibdファイルをコピーします。次に、これを実行します

ALTER TABLE tablename DISCARD TABLESPACE;

後で元に戻すには、.ibdファイルをdatadirにコピーしてから実行します

ALTER TABLE tablename IMPORT TABLESPACE;

これにより、内部メタデータIDが保持されます。

.frmが常に存在することを確認してください。

私はかつて、クライアントが同じ方法でホース接続した30のInnoDBテーブルの復元を手伝いました。別のDBサーバーを使用し、InnoDBテーブルを追加および削除していくつかのゲームをプレイし、正しい内部メタデータIDを探し出さなければなりませんでした。

:クライアントは、この記事見つけhttp://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-fileを。私たちはそれを使用し、それは大いに役立ちました。それがあなたのお役に立てば幸いです。


1
私はすべてのテーブルが言う2つのデータベースを持っていますTable 'X' doesn't exist in engine。すべてのテーブルに対して上記の方法を実行する必要がありますか、それを修正するより良い方法がありますか?
パパニート

-2

友人に売る前に、XAMPPフォルダーを自分のハードドライブにのみコピーする前に、Macで経験しました。(成功ではありません)残念ながら、次の手順を試してみたため、問題が発生していました。-新しいXAMPPをインストールし、\ httdocsとvar \ mysql全体を新しいMacにコピーします。動作していません。PHPMyAdmin内のテーブルにまだアクセスできません...-同じxamppバージョンをインストールして、上記の手順を繰り返してみましたが、動作しません。-寝ることにした。

(成功)-今朝、バックアップディスクを持ってきてWindows 7で試します。-Windows用の最新の最新のXAMPPをインストールします。c:\ xampp-バックアップ\ httdocsからWebサイト(フォルダー)の1つを持ち、\ var \ mysqlは私のwindows 7で準備ができています。httdocs\および\ var \ mysql内に多くのプロジェクトがあるため、1つのWebサイトで試してから残りを試してみます-言及httdocs \フォルダーをWindows c:\ xampp \にコピーしますhttdocsおよび\ var \ mysqlをc:\ xampp \ mysql \ dataにコピーします

最後にまだib_logfile0、ib_logfile1、ibdata1をバックアップファイルからWindows xampp c:\ xampp \ mysql \ dataにコピーします

http:// localhost / mywebsiteを更新します

すごいすごい...それは働いています...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.