検索

MySQL没有类型Oracle的闪回机制,当你执行了drop table xxx 之后,这个表就永久删除了,你只能从备份里进行恢复,如果你没有备份

MySQL没有类型Oracle的闪回机制,当你执行了drop table xxx 之后,这个表就永久删除了,你只能从备份里进行恢复,如果你没有备份,那你就只能哭了。本文提供一种思路,让类似情况能有挽回的机会。

我们知道,Mysql的MYISAM引擎表在当前Database目录下,有3个对应的文件,,frm结构文件,MYI索引文件,MYD数据文件。当你在Mysql中,drop了MYISAM引擎表后,其实就是在文件系统里将其对应的3个文件rm了。所以当你执行drop后,如果能将上面3个文件恢复,那么表也将恢复。

如果你使用的是EXT3文件系统,那么可以使用ext3grep来完成上面的操作,举例说明:

1.安装ext3grep
首先需要安装e2fsprogs-libs,可以到下载源码包

tar -xzvf e2fsprogs-1.41.5.tar.gz
cd e2fsprogs-1.41.5
mkdir build; cd build
../configure
make
make install
make install-libs(e2fsprogs-libs)
在安装ext3grep,可以到下载

tar xfvz ext3grep-0.10.1.tar.gz
cd ext3grep-0.10.1
./configure
make
make install

ext3grep -V
Running ext3grep version 0.10.1
ext3grep v0.10.1, Copyright (C) 2008 Carlo Wood.
ext3grep comes with ABSOLUTELY NO WARRANTY;
This program is free software; your freedom to use, change
and distribute this program is protected by the GPL.
2.删除测试表

mysql> use test
mysql> desc t;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(10) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.01 sec)
 
mysql> select * from t;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
+------+
3 rows in set (0.00 sec)
 
mysql>drop table t;
 
mysql> quit
3.停止mysql,并将数据文件所在分区umount。

# /etc/init.d/mysqld stop
Shutting down MySQL..                                      [  OK  ]
cd
# umount /dev/sda6
4.利用ext3grep工具进行恢复

# ext3grep /dev/sda6 --ls --inode 2
Running ext3grep version 0.10.1
WARNING: I don't know what EXT3_FEATURE_COMPAT_EXT_ATTR is.
Number of groups: 1778
Loading group metadata... done
Minimum / maximum journal block: 29065730 / 29099045
Loading journal descriptors... sorting... done
The oldest inode block that is still in the journal, appears to be from 1243924942 = Tue Jun  2 14:42:22 2009
Number of descriptors in journal: 418; min / max sequence numbers: 13 / 36
Inode is Allocated
Loading sda6.ext3grep.stage2... done
The first block of the directory is 1539.
Inode 2 is directory "".
Directory block 1539:
          .-- File type in dir_entry (r=regular file, d=directory, l=symlink)
          |          .-- D: Deleted ; R: Reallocated
Indx Next |  Inode   | Deletion time                        Mode        File name
==========+==========+----------------data-from-inode------+-----------+=========
   0    1 d       2                                         drwxr-xr-x  .
   1    2 d       2                                         drwxr-xr-x  ..
   2    3 d      11                                         drwx------  lost+found
   3    4 r      12                                         rrw-r--r--  1
   4    5 r      13                                         rrw-r--r--  5
   5  end d  237569                                         drwxr-xr-x  data
   6  end r      15  D 1243919862 Tue Jun  2 13:17:42 2009  rrw-r--r--  3.txt
可以看到Mysql数据文件的目录data对应的Inode是237569,然后在查看改Inode对应的block。

# ext3grep /dev/sda6 --inode 237569
Running ext3grep version 0.10.1
No --ls used; implying --print.

Inode is Allocated
Group: 29
Generation Id: 3010341297
uid / gid: 500 / 500
mode: drwxr-xr-x
size: 4096
num of links: 4
sectors: 8 (--> 0 indirect blocks).

Inode Times:
Accessed:       1243930169 = Tue Jun  2 16:09:29 2009
File Modified:  1243930170 = Tue Jun  2 16:09:30 2009
Inode Modified: 1243930170 = Tue Jun  2 16:09:30 2009
Deletion time:  0

Direct Blocks: 968704
Loading sda6.ext3grep.stage2... done
There is no directory block associated with inode 237569.
看到Direct Blocks: 968704,在查看这个block。

# ext3grep /dev/sda6 --ls --block 968704
Running ext3grep version 0.10.1
WARNING: I don't know what EXT3_FEATURE_COMPAT_EXT_ATTR is.
Number of groups: 1778
Minimum / maximum journal block: 29065730 / 29099045
Loading journal descriptors... sorting... done
The oldest inode block that is still in the journal, appears to be from 1243925348 = Tue Jun  2 14:49:08 2009
Number of descriptors in journal: 236; min / max sequence numbers: 15 / 45
Group: 29

Block 968704 is a directory. The block is Allocated

          .-- File type in dir_entry (r=regular file, d=directory, l=symlink)
          |          .-- D: Deleted ; R: Reallocated
Indx Next |  Inode   | Deletion time                        Mode        File name
==========+==========+----------------data-from-inode------+-----------+=========
   0    1 d  237569                                         drwxr-xr-x  .
   1    3 d       2                                         drwxr-xr-x  ..
   2    3 r  237570  D 1243930170 Tue Jun  2 16:09:30 2009  rrw-r-----  mysql.err
   3    4 d  237571                                         drwx------  mysql
   4    5 r  237641                                         rrw-r-----  ibdata1
   5    7 d  237642                                         drwx------  test
   6    7 r  237646  D 1243926673 Tue Jun  2 15:11:13 2009  rrw-rw----  mysql.pid
   7    8 r  237647                                         rrw-r-----  ib_logfile0
   8  end r  237648                                         rrw-r-----  ib_logfile1
在data目录下面,其文件所对应的Inode,我们是删除的test下的表,所以在查看test目录所对应的Inode.

# ext3grep /dev/sda6 --inode 237642
Running ext3grep version 0.10.1
No --ls used; implying --print.

Inode is Allocated
Group: 29
Generation Id: 3010341370
uid / gid: 500 / 500
mode: drwx------
size: 4096
num of links: 2
sectors: 8 (--> 0 indirect blocks).

Inode Times:
Accessed:       1243928606 = Tue Jun  2 15:43:26 2009
File Modified:  1243928606 = Tue Jun  2 15:43:26 2009
Inode Modified: 1243928606 = Tue Jun  2 15:43:26 2009
Deletion time:  0

Direct Blocks: 971511
Loading sda6.ext3grep.stage2... done
There is no directory block associated with inode 237642.

# ext3grep /dev/sda6 --ls --block 971511
Running ext3grep version 0.10.1
WARNING: I don't know what EXT3_FEATURE_COMPAT_EXT_ATTR is.
Number of groups: 1778
Minimum / maximum journal block: 29065730 / 29099045
Loading journal descriptors... sorting... done
The oldest inode block that is still in the journal, appears to be from 1243925348 = Tue Jun  2 14:49:08 2009
Number of descriptors in journal: 236; min / max sequence numbers: 15 / 45
Group: 29

Block 971511 is a directory. The block is Allocated

          .-- File type in dir_entry (r=regular file, d=directory, l=symlink)
          |          .-- D: Deleted ; R: Reallocated
Indx Next |  Inode   | Deletion time                        Mode        File name
==========+==========+----------------data-from-inode------+-----------+=========
   0    1 d  237642                                         drwx------  .
   1  end d  237569                                         drwxr-xr-x  ..
   2    3 r  237643  D 1243928606 Tue Jun  2 15:43:26 2009  rrw-r-----  u.frm
   3    4 r  237649  D 1243928606 Tue Jun  2 15:43:26 2009  rrw-r-----  u.MYD
   4  end r  237645  D 1243928606 Tue Jun  2 15:43:26 2009  rrw-r-----  u.MYI
   5  end r  237644  D 1243926666 Tue Jun  2 15:11:06 2009  rrw-rw----  t.frm
   6    7 r  237650  D 1243926666 Tue Jun  2 15:11:06 2009  rrw-rw----  t.MYI
   7  end r  237651  D 1243926666 Tue Jun  2 15:11:06 2009  rrw-rw----  t.MYD
ok,到这里我们需要恢复的表t的3个文件已经出来了,然后在执行恢复。

# ext3grep /dev/sda6 --restore-inode 237650
Running ext3grep version 0.10.1
Restoring inode.237650
# ext3grep /dev/sda6 --restore-inode 237651
Running ext3grep version 0.10.1
Restoring inode.237651

# ext3grep /dev/sda6 --restore-inode 237644
Running ext3grep version 0.10.1
Restoring inode.237644

cd RESTORED_FILES/
mv inode.237644 t.frm
mv inode.237650 t.MYI
mv inode.237651 t.MYD
ll
total 20
-rw-r-----  1 root root 8556 Jun  2 16:26 t.frm
-rw-r-----  1 root root   21 Jun  2 16:26 t.MYD
-rw-r-----  1 root root 1024 Jun  2 16:26 t.MYI
将数据文件所在分区mount,并将恢复的表t的文件copy到原目录。设置好权限,启动mysql。

mount /dev/sda6 /u01
cp t.* /u01/data/test
chown -R mysql.mysql test/
/etc/init.d/mysqld start
Starting MySQL.                                            [  OK  ]
mysql> use test
Database changed

mysql> select * from t;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
+------+
3 rows in set (0.01 sec)
OK,表已经被恢复。

linux

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
MySQLのライセンスは、他のデータベースシステムと比較してどうですか?MySQLのライセンスは、他のデータベースシステムと比較してどうですか?Apr 25, 2025 am 12:26 AM

MySQLはGPLライセンスを使用します。 1)GPLライセンスにより、MySQLの無料使用、変更、分布が可能になりますが、変更された分布はGPLに準拠する必要があります。 2)商業ライセンスは、公的な変更を回避でき、機密性を必要とする商用アプリケーションに適しています。

MyisamよりもInnodbを選びますか?MyisamよりもInnodbを選びますか?Apr 25, 2025 am 12:22 AM

Myisamの代わりにInnoDBを選択する場合の状況には、次のものが含まれます。1)トランザクションサポート、2)高い並行性環境、3)高いデータの一貫性。逆に、Myisamを選択する際の状況には、1)主に操作を読む、2)トランザクションサポートは必要ありません。 INNODBは、eコマースプラットフォームなどの高いデータの一貫性とトランザクション処理を必要とするアプリケーションに適していますが、Myisamはブログシステムなどの読み取り集約型およびトランザクションのないアプリケーションに適しています。

MySQLの外国キーの目的を説明してください。MySQLの外国キーの目的を説明してください。Apr 25, 2025 am 12:17 AM

MySQLでは、外部キーの機能は、テーブル間の関係を確立し、データの一貫性と整合性を確保することです。外部キーは、参照整合性チェックとカスケード操作を通じてデータの有効性を維持します。パフォーマンスの最適化に注意し、それらを使用するときに一般的なエラーを避けてください。

MySQLのインデックスのさまざまなタイプは何ですか?MySQLのインデックスのさまざまなタイプは何ですか?Apr 25, 2025 am 12:12 AM

MySQLには、B-Treeインデックス、ハッシュインデックス、フルテキストインデックス、空間インデックスの4つのメインインデックスタイプがあります。 1.B-Treeインデックスは、範囲クエリ、ソート、グループ化に適しており、従業員テーブルの名前列の作成に適しています。 2。HASHインデックスは、同等のクエリに適しており、メモリストレージエンジンのHASH_TABLEテーブルのID列の作成に適しています。 3。フルテキストインデックスは、記事テーブルのコンテンツ列の作成に適したテキスト検索に使用されます。 4.空間インデックスは、地理空間クエリに使用され、場所テーブルのGEOM列での作成に適しています。

MySQLでインデックスをどのように作成しますか?MySQLでインデックスをどのように作成しますか?Apr 25, 2025 am 12:06 AM

tocreateanindexinmysql、usethecreateindexstatement.1)forasinglecolumn、 "createdexidx_lastnameonemployees(lastname);" 2)foracompositeindexを使用して、 "createindexidx_nameonemployees(lastname、firstname);" 3); "3)、" 3)を使用します

MySQLはSQLiteとどのように違いますか?MySQLはSQLiteとどのように違いますか?Apr 24, 2025 am 12:12 AM

MySQLとSQLiteの主な違いは、設計コンセプトと使用法のシナリオです。1。MySQLは、大規模なアプリケーションとエンタープライズレベルのソリューションに適しており、高性能と高い並行性をサポートしています。 2。SQLiteは、モバイルアプリケーションとデスクトップソフトウェアに適しており、軽量で埋め込みやすいです。

MySQLのインデックスとは何ですか?また、パフォーマンスをどのように改善しますか?MySQLのインデックスとは何ですか?また、パフォーマンスをどのように改善しますか?Apr 24, 2025 am 12:09 AM

MySQLのインデックスは、データの取得をスピードアップするために使用されるデータベーステーブル内の1つ以上の列の順序付けられた構造です。 1)インデックスは、スキャンされたデータの量を減らすことにより、クエリ速度を改善します。 2)B-Tree Indexは、バランスの取れたツリー構造を使用します。これは、範囲クエリとソートに適しています。 3)CreateIndexステートメントを使用して、createIndexidx_customer_idonorders(customer_id)などのインデックスを作成します。 4)Composite Indexesは、createIndexIDX_CUSTOMER_ORDERONORDERS(Customer_Id、Order_date)などのマルチコラムクエリを最適化できます。 5)説明を使用してクエリ計画を分析し、回避します

データの一貫性を確保するために、MySQLでトランザクションを使用する方法を説明します。データの一貫性を確保するために、MySQLでトランザクションを使用する方法を説明します。Apr 24, 2025 am 12:09 AM

MySQLでトランザクションを使用すると、データの一貫性が保証されます。 1)StartTransactionを介してトランザクションを開始し、SQL操作を実行して、コミットまたはロールバックで送信します。 2)SavePointを使用してSave Pointを設定して、部分的なロールバックを許可します。 3)パフォーマンスの最適化の提案には、トランザクション時間の短縮、大規模なクエリの回避、分離レベルの使用が合理的に含まれます。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません