如何撤銷 DROP 表?

如何撤銷 DROP 表?

我不小心掉落了所有桌子。我可以恢復回來嗎?我沒有備份副本。

答案1

如果你確實沒有備份,那麼我 99% 確定你運氣不好。

如果您確實有任何形式的備份,無論有多舊,那麼您是否透過 log-bin 選項開啟了二進位日誌記錄到 MySQL 設定檔 (my.ini) 中?如果是這樣,您可能能夠恢復自上次備份以來的狀態。

抱歉,以糟糕的方式開始新的一周。

答案2

這個問題相當老了,但沒有一個肯定的答案,所以我會添加一個。

MySQL 刪除表後,資料仍會在媒體上保留一段時間。因此您可以獲得記錄並重建表。稍後我將在部落格中介紹它,但現在先快速繪製草圖。

您需要有表格的結構(CREATE TABLE 語句)。

如果 innodb_file_per_table 為 ON,則刪除的資料表位於磁碟分割區上。停止 MySQL 並儘快將其重新掛載為唯讀。如果 MySQL 位於根分割區上(順便說一句,這不是一個好主意),則取得映像或取出磁碟並將其插入另一台伺服器。換句話說,停止所有寫入。

如果 innodb_file_per_table OFF 那就停止 MySQL。

然後下載並編譯InnoDB的un-drop工具https://github.com/twindb/undrop-for-innodb/。有關詳細信息,請查看“[編譯 TwinDB 恢復工具包][1]”帖子。

然後使用stream_parser解析磁碟分割或ibdata1(取決於innodb_file_per_table設定):

./stream_parser -f /path/to/diskimage_or_ibdata1

然後恢復InnoDB字典以了解刪除的表在哪個index_id中。

然後取得表結構並取得記錄

./c_parser -f pages-diskimage_or_ibdata1/FIL_PAGE_INDEX/00000<index_id>.page

它將記錄輸出到 stdout,並將 LOAD DATA 命令輸出到 stderr。 [1]:https://twindb.com/how-to-recover-innodb-dictionary/

Undrop For InnoDB 的 PS 影片教學 - Undrop for InnoDB 概述https://youtu.be/-1LeLhGjAWM

答案3

這就是我所做的。在 mysql 目錄中(對於 Ubuntu,這是 /var/lib/mysql,對於使用 Homebrew 的 Mac,這是 /usr/local/var/mysql),我找到了一些檔案。首先,我將包含特定模式的 myapp_development/ 目錄複製到我的本機 mysql 目錄中。然後我備份了本地的ibdata1,並將伺服器的ibdata1複製到mysql目錄中。殺死了 mysqld。 (ps aux找到 PID,然後kill PID)。重新啟動mysql,它以崩潰恢復模式啟動。然後啟動我的本機 mysql 客戶端並產生我需要的表的完整轉儲。

而且,代表我們以為永遠消失的元資料輸入數週的工作的 15,000 行被保存了!

希望這對某人有幫助。

答案4

您無法「撤銷」DROP TABLE.

你可以看看MySQL有沒有二進位日誌記錄啟用後,也許您可以從那裡提取一些數據。

除此之外,您可以忘記 MySQL,並遇到「我不小心從檔案系統中刪除了一些檔案」的相同類別問題。有一些工具可以嘗試恢復文件,也有一些公司在專業的基礎上這樣做。

相關內容