最初のステップを覚えておいてください!!!覚えておいてください!!!覚えておいてください!!!!急いで走らないでください
オンサイトの状態を維持します。マシンを再起動したり、実行中のmysqlプロセスを閉じたりすることはできません。閉じると、データを復元できなくなります。
これは、ファイルが実際にはiノードへのリンクであるためです。iノードリンクには、アクセス許可や所有者、データブロックアドレスなど、ファイルのすべての属性が含まれます(ファイルはディスク上のこれらのデータブロックに保存されます)。削除するとき(rm) iノードへのリンクを実際に削除するファイルでは、iノードの内容は削除されません。プロセスはまだ使用されている可能性があります。iノードへのすべてのリンクが完全に削除された場合にのみ、これらのデータブロックは新しいデータを書き込むことができます。
・procファイルシステムはデータの回復に役立ちます。システム上の各プロセスには、/ procにディレクトリと独自の名前があり、fd(ファイル記述子)サブディレクトリが含まれます(プロセスはファイルへのすべてのリンクを開く必要があります)。ファイルシステムからファイルを削除する場合、inode参照もあります。
2番目のステップは、削除されたファイルのPIDを取得することです
1.最初のメソッドlsof
(https://blog.csdn.net/zonghua521/article/details/78200239を参照してください)
プロセスがファイルを開いたときに、プロセスがファイルを開いたままにしておく限り、ファイルが削除されていても、ディスク上に存在します。つまり、プロセスはファイルが削除されたことを認識せず、ファイルが開かれたときに提供されたファイル記述子に対して読み取りと書き込みを行うことができます。このプロセスを除いて、対応するディレクトリインデックスノードが削除されているため、このファイルは表示されません。
/ procディレクトリには、カーネルとプロセスツリーを反映するさまざまなファイルが含まれています。/ procディレクトリはメモリにマップされた領域をマウントするため、これらのファイルとディレクトリはディスク上に存在しないため、これらのファイルを読み書きするとき、実際にはメモリから取得します関連情報。
lsofに関連する情報のほとんどは、プロセスの PIDにちなんで名付けられたディレクトリに保存されます。つまり、PID 1234のプロセスの情報は/ proc / 1234に含まれています。各プロセスディレクトリにはさまざまなファイルがあり、アプリケーションがプロセスのメモリ空間、ファイル記述子リスト、ディスク上のファイルへのシンボリックリンク、その他のシステム情報を簡単に理解できるようにします。
lsofプログラムは、この情報とカーネルの内部状態に関するその他の情報を使用して、出力を生成します。そのため、lsofは、プロセスのファイル記述子や関連ファイル名などの情報を表示できます。つまり、プロセスのファイル記述子にアクセスすることで、ファイルに関する関連情報を見つけることができます。
例1。
プロセスが実行中の場合、ファイル/ var / log / messagesを削除します
shell> rm / var / log / messages
削除後、このプロセスの変更を確認します
シェル> lsof | grep / var / log / messages
rsyslogd 1737 root 1w REG 8,2 5716123 652638 / var / log / messages(削除済み)
誰もが変更があることに気づき、2つを比較した後、それはより多くの(削除された)ことがわかります。このファイルの場所を見つけるには、これを見てください
2. 2番目の方法ps -aux | grep XXX(私が使用)
方法1の原理を理解した後、実際の最終目標はPIDを取得することです。そのため、アイデアを切り替えることができます。
mysqlのすべてのファイルが削除されていることがわかっているため、ps -aux | grep mysqlを直接使用して、まだ使用されているプロセスID を表示できます。
3. 3番目の方法はextundeleteを使用します
(参照)https://blog.csdn.net/zxc_user/article/details/82025475
この方法では、タイプがext3またはext4のファイルのみを復元できます。それ以外の場合は復元できません。
(注:私のデータベースサーバーはSSDを使用しており、すべて復旧プロセス中に失敗しました。機械的なハードディスクのデータのみを復旧でき、追加のディスクをマウントする必要があると想定されています。そのため、この方法をあきらめ、2番目の方法を使用しました。紹介なし、Baiduを使用できます)
3番目のステップは、バックアップフォルダーにデータを書き込むことです
コマンドを使用して、プロセスのPIDにちなんで名付けられたディレクトリを入力します
cd / proc / (2番目のステップで取得したPID) / fd
この時点で、rmによって削除されたファイルのステータスが削除されたことを確認できます
回復する必要があるファイル番号を見つける
たとえば、スクリーンショットの2
cat 2> / recover / pts / 1このステートメントの目的は、メモリに残っているファイルを特定の場所に書き直すことです
/ mysql / data /にあるすべてのデータベースファイルをバックアップしたところ、安心しましたが、現時点では、データが完全に復元されるまでに、40%の作業が残っています。
バックアップ.ibdファイルをサーバーからローカルにエクスポートし、mysqlデータを独自のテスト環境に復元します
4番目のステップのデータ復旧
1.テスト環境でオンラインと同じデータベースとテーブル構造を確立する
2. / mysql / data / database /関連テーブルの.ibdファイルを削除します
alter table { database }。{ table } discard tablespace;
3.バックアップ.ibdをデータベースフォルダーにコピーします
cp /recover/* /mysql/data/{database名称}/
mysqlで使用されるユーザー権限がある場合、認証が必要です
chown -R {user}。/ mysql / data /
4. mysqlと入力してデータをインポートします
alter table { database }。{ table } import tablespace;
この時点では、各ステートメントは1回しか実行できないことに注意してください。つまり、1つの文を実行する場合は、mysqlを終了し、mysqlを再度入力して2番目の文を実行する必要があります。
最後に、テーブルを参照することでデータが復元されたことを確認できます。この時点で復元されたデータベースをsqlファイルにエクスポートし、オンラインでリカバリを実行します
データは貴重です。よく考えてください。!知識の伝達が増え、プログラマーが1人減ります。。。。。