資料庫沒有備份,沒有使用Binlog的情況下,如何恢復數據?

2020-09-06 碼農架構I

公眾號 :碼農架構

MySQL 的複製主要是通過 Binlog 來完成的,Binlog 記錄了資料庫更新的事件,從庫 I/O 線程會向主庫發送 Binlog 更新的請求,同時主庫二進位轉儲線程會發送 Binlog 給從庫作為中繼日誌進行保存,然後從庫會通過中繼日誌重放,完成資料庫的同步更新,看來是一套完美的的災備方案!但是有沒有經歷過「手抖」後的「絕望」。

嗯!你志哥以前幹過

直接在生產環境中對數據進行操作,或者忘記了當前是在開發環境,還是在生產環境中,就直接對資料庫進行操作。

當然如果我們對資料庫做過時間點備份,也可以直接恢復到該時間點。不過我們今天要討論的是一個特殊的情況,也就是在沒做資料庫備份,沒有開啟使用 Binlog 的情況下,儘可能地找回數據。

今天的分享內容主要包括以下幾個部分

  1. InnoDB 存儲引擎中的表空間是怎樣的?兩種表空間存儲方式各有哪些優缺點?
  2. 如果.ibd 文件損壞了,數據該如何找回?
  3. 如何模擬 InnoDB 文件的損壞與數據恢復?

InnoDB 存儲引擎的表空間

InnoDB 存儲引擎的文件格式是.ibd 文件,數據會按照表空間(tablespace)進行存儲,分為共享表空間和獨立表空間。如果想要查看表空間的存儲方式,我們可以對innodb_file_per_table變量進行查詢,使用show variables like &39;;。ON 表示獨立表空間,而 OFF 則表示共享表空間。

如果採用共享表空間的模式,InnoDB 存儲的表數據都會放到共享表空間中,也就是多個數據表共用一個表空間,同時表空間也會自動分成多個文件存放到磁碟上。這樣做的好處在於單個數據表的大小可以突破文件系統大小的限制,最大可以達到 64TB,也就是 InnoDB 存儲引擎表空間的上限。不足也很明顯,多個數據表存放到一起,結構不清晰,不利於數據的找回,同時將所有數據和索引都存放到一個文件中,也會使得共享表空間的文件很大。

採用獨立表空間的方式可以讓每個數據表都有自己的物理文件,也就是 table_name.ibd 的文件,在這個文件中保存了數據表中的數據、索引、表的內部數據字典等信息。它的優勢在於每張表都相互獨立,不會影響到其他數據表,存儲結構清晰,利於數據恢復,同時數據表還可以在不同的資料庫之間進行遷移。

如果.ibd 文件損壞了,數據如何找回

如果我們之前沒有做過全量備份,也沒有開啟 Binlog,那麼我們還可以通過.ibd 文件進行數據恢復,採用獨立表空間的方式可以很方便地對資料庫進行遷移和分析。如果我們誤刪除(DELETE)某個數據表或者某些數據行,也可以採用第三方工具回數據。

我們這裡可以使用 Percona Data Recovery Tool for InnoDB 工具,能使用工具進行修復是因為我們在使用 DELETE 的時候是邏輯刪除。我們之前學習過 InnoDB 的頁結構,在保存數據行的時候還有個刪除標記位,對應的是頁結構中的 delete_mask 屬性,該屬性為 1 的時候標記了記錄已經被邏輯刪除,實際上並不是真的刪除。不過當有新的記錄插入的時候,被刪除的行記錄可能會被覆蓋掉。所以當我們發生了 DELETE 誤刪除的時候,一定要第一時間停止對誤刪除的表進行更新和寫入,及時將.ibd 文件拷貝出來並進行修復。

如果已經開啟了 Binlog,就可以使用閃回工具,比如 mysqlbinlog 或者 binlog2sql,從工具名稱中也能看出來它們都是基於 Binlog 來做的閃回。原理就是因為 Binlog 文件本身保存了資料庫更新的事件(Event),通過這些事件可以幫我們重現資料庫的所有更新變化,也就是 Binlog 回滾

innodb_force_recovery參數一共有 7 種狀態,除了默認的 0 以外,還可以為 1-6 的取值,分別代表不同的強制恢復措施。

當我們需要強制恢復的時候,可以將innodb_force_recovery設置為 1,表示即使發現了損壞頁也可以繼續讓服務運行,這樣我們就可以讀取數據表,並且對當前損壞的數據表進行分析和備份。

通常innodb_force_recovery參數設置為 1,只要能正常讀取數據表即可。但如果參數設置為 1 之後還無法讀取數據表,我們可以將參數逐一增加,比如 2、3 等。一般來說不需要將參數設置到 4 或以上,因為這有可能對數據文件造成永久破壞。另外當innodb_force_recovery設置為大於 0 時,相當於對 InnoDB 進行了防寫,只能進行 SELECT 讀取操作,還是有限制的讀取,對於 WHERE 條件以及 ORDER BY 都無法進行操作。

當我們開啟了強制恢復之後,資料庫的功能會受到很多限制,我們需要儘快把有問題的數據表備份出來,完成數據恢復操作。整體的恢復步驟可以按照下面的思路進行:

  1. 使用innodb_force_recovery啟動伺服器將innodb_force_recovery參數設置為 1,啟動資料庫。如果數據表不能正常讀取,需要調大參數直到能讀取數據為止。通常設置為 1 即可。
  2. 備份數據表
    在備份數據之前,需要準備一個新的數據表,這裡需要使用 MyISAM 存儲引擎。原因很簡單,InnoDB 存儲引擎已經防寫了,無法將數據備份出來。然後將損壞的 InnoDB 數據表備份到新的 MyISAM 數據表中。
  3. 刪除舊錶,改名新表
    數據備份完成之後,我們可以刪除掉原有損壞的 InnoDB 數據表,然後將新表進行改名。
  4. 關閉innodb_force_recovery,並重啟資料庫
    innodb_force_recovery大於 1 的時候會有很多限制,我們需要將該功能關閉,然後重啟資料庫,並且將數據表的 MyISAM 存儲引擎更新為 InnoDB 存儲引擎。

【公眾號:碼農架構】

分享、點讚、在看,給個三連擊唄!

相關焦點

  • 使用binlog日誌恢復MySQL資料庫刪除數據的方法
    [offset,]:偏移量(不指定就是0)row_count:查詢總條數(不指定就是所有行)刪除數據案例及操作步驟:下面我們通過一個實例操作來完整查看「如何通過binlog日誌恢復MySQL資料庫刪除數據。
  • MySQL資料庫的mysqldump完全備份、binlog的增量備份與還原
    MySQL資料庫的mysqldump完全備份、binlog的增量備份與還原一、 備份的目的:做災難性恢復:對損壞的書籍進行恢復和還原需求改變:因需求改變而需要把數據還原到改變以前備份的資料庫大小不超過50G三、 按照備份時對資料庫的影響範圍分類:hot backup :指在資料庫運行中直接備份,對正在運行的資料庫沒有任何影響;稱為 在線備份(OnlineBackup) (備份的同時,業務不受影響)
  • MySQL資料庫遭到攻擊篡改---使用備份和binlog進行數據恢復
    數據篡改即是對計算機網絡數據進行修改、增加或刪除,造成數據破壞。資料庫數據被攻擊了首先得查看是被刪除了還是被篡改了?是否有備份數據,是否能夠進行恢復並加固。本文來自資料庫技術專家張正,主要描述了MySQL遭到攻擊篡改數據,利用從庫的備份和主庫的Binlog進行不完全恢復。
  • 淺談使用Binlog實現MySQL增量備份
    首先我先闡述一下,他的基本原理,就是定時製作基線,然後定時更新binlog,形成增量數據文件,然後在必要的時候進行恢復,追溯。那麼我們又該如何選擇備份方案呢?1, 按天備份周一 00:00 全備數據周二 00:00 全備數據26_01.sql.gz26_02.sql.gz周一增備周二增備binlog.000022binlog.000023binlog.000024......
  • 實戰 | MySQL數據備份、恢復
    當有增量備份需求時,採用xtrabackup進行增量備份,以降低磁碟空間的消耗。為了能更靈活的將數據恢復到指定的時間點,使用 binlog 作為增量備份。1.2.備份策略(某手機公司)使用 xtrabackup 每天做一次全量備份,並以 binlog 作為增量備份binlog 保留七天,全量備份保留一個月,超過一個月的保留近一年每個月1號的數據使用xtrabackup備份時,都是在從庫執行一般一個實例僅一個業務資料庫,因此不涉及分庫備份
  • 電子數據取證之MySQL資料庫刪除數據的恢復指南
    [offset,]:偏移量(不指定就是0)row_count:查詢總條數(不指定就是所有行)刪除數據案例及操作步驟:下面我們通過一個實例操作來完整查看「如何通過binlog日誌恢復MySQL資料庫刪除數據。
  • MySQL基於binlog實現數據增量恢復實踐
    數據恢復最近公司發生了一次小小的數據安全事故,雖然最終結果是所有數據都安全的恢復回來了,對公司所有業務沒有造成太大的影響。公司的所有業務和項目都是部署到雲端,虛擬機,資料庫和存儲都是基於公有雲的基礎設施。公有雲的資料庫服務一般都具有數據備份和數據恢復等基本功能,當對數據表進行誤操作或者發生黑客攻擊刪表,刪庫操作後,都可以基於備份數據在幾分十分鐘內恢復所有數據。因為時效性的原因恢復的數據可能會存在少許差異,但是不至於造成整個業務中斷和系統崩潰。
  • 「刪庫跑路」使用Binlog日誌恢復誤刪的MySQL數據
    模擬一次誤刪數據的操作,並且使用binlog日誌恢復誤刪的數據。寫這篇文章的初衷,是有一次我真的險些把測試資料庫的一張表給刪除了,當時嚇出一身冷汗。binlog不會記錄SELECT和SHOW這類操作,因為這類操作對數據本身並沒有修改,但你可以通過查詢通用日誌來查看MySQL執行過的所有語句。
  • Facebook如何實現PB級資料庫自動化備份
    有可用的二進位日誌,就能讓他們在數秒內啟動另一個資料庫作為主資料庫。由於RBU中有秒級的二進位日誌,即使某個舊主資料庫完全不可用,也沒有關係,只要利用將記錄下的事務恢復到上一個備份中即可完成立即恢復。  RBU伺服器的第二個工作是執行傳統備份。MySQL備份有兩種方式:二進位和邏輯(mysqldump)。
  • MySQL 數據恢復
    對於 MySQL 數據的備份, 主要有兩種: 全量備份和增量備份.全量備份: 將資料庫中的所有數據全部進行備份. 相當於複製粘貼的步驟. 全量備份要保存所有數據, 佔用空間大, 必然不可能精確到每一秒.增量備份: 對資料庫的所有變動進行備份.
  • 連延遲從庫都用不上了,MySQL備份還能恢復嗎?
    背景首先交代一下背景,由於某些因素的限制,我們公司目前的備份策略採用的是隔天全備的方案,增量備份則使用的是binlog server的方式,那麼如何快速恢復就成為了我們需要思考的問題。但是即便有了延遲從庫,假設我們錯過了延遲的時間,或者在後續利用延遲從庫恢復的時候指定錯了位點,導致了誤刪DDL同樣應用到了從庫,這個時候我們就沒有辦法利用延遲從庫這根救命稻草了。全備恢復(異機恢復)此時,我們只能通過備份來進行數據恢復了。
  • MySQL恢復delete的數據
    引擎表誤刪恢復(獨立表空間innodb_file_per_table=1)的情況下如何恢復數據、如果不幸誤刪了資料庫MySQL資料庫誤刪恢復。如果沒有完整的把資料庫或者表刪除掉,而僅僅是刪除了表裡的部分數據,比如本文探討的:delete命令數據誤刪恢復,這種情況應該發生的概率更大,畢竟有機會刪除庫和表的權限和命令通常控制的都很嚴(刪庫跑路是段子)。有人會有疑惑,用delete命令去刪除數據,不都是正常想刪除掉的麼,為何存在要恢復的情況。
  • Xtrabackup 實現數據的備份與恢復
    Xtrabackup介紹Xtrabackup是由percona開源的免費資料庫熱備份軟體,它能對InnoDB資料庫和XtraDB存儲引擎的資料庫非阻塞地備份(對於MyISAM的備份同樣需要加表鎖);mysqldump備份方式是採用的邏輯備份,其最大的缺陷是備份和恢復速度較慢,如果資料庫大於50G,mysqldump備份就不太適合
  • 備份恢復,DBA最後一道防線,你完全掌握了嗎?
    在一次遷移升級過程中,bug導致資料庫無法啟動 需要找回前兩天的數據 雲平臺全面癱瘓,雖然出現概率很小 這時可以通過之前備份+binglog進行恢復數據。 備份的目的是發生災難時進行恢復。
  • mysql備份與恢復:完全,增量備份,基於位置點,時間點恢復
    理論介紹數據備份的重要性資料庫備份的分類常見的備份方法MySQL完全備份資料庫完全備份分類資料庫備份與恢復MySQL資料庫完全備份與恢復mysqldump備份與恢復MySQL資料庫增量備份恢復基於位置的恢復基於時間恢復
  • 「效率源實戰」如何通過日誌備份恢復SQL Server資料庫刪除數據?
    簡單恢復模式主要使用於對資料庫數據安全要求不太高的資料庫,不備份日誌,只能還原到故障前最新的備份。所以使用此模式儘量將備份的時間間隔縮短,以避免故障丟失過多的數據。完整恢復模式 可在最大程度避免出現故障時丟失數據,它包括資料庫備份和日誌備份,可完整的記錄所有日誌直到日誌被備份時才會截斷日誌。
  • 一種MySQL備份恢復流程的設計思路
    binlog server的方式,那麼如何快速恢復就成為了我們需要思考的問題恢復需求根據我以往的一些經驗來說,通常需要從備份恢復數據的場景有如下幾種:被誤刪庫了被誤刪表了,類型為TRUNCATE或者DROP被誤刪列了,類型為
  • MySQL update的數據恢復
    通常情況下是碰不到這類問題的,做好準備也可以規避掉類似的問題。有Delete誤刪數據,自然就聯想到update誤更新數據。本文探討下MySQL update的數據恢復。實際上update誤更新數據的隱蔽性相對於delete更強,少數據了自然相對容易對比數目、數據的連續性等直觀感受發現。而數據變更了,尤其是非字符型數據(字符型數據如標題、作者等。
  • iPhone沒有備份怎麼辦?果師兄輕鬆恢復蘋果數據
    iPhone沒有備份怎麼辦?果師兄輕鬆恢復蘋果數據 2019年04月18日 10:35作者:黃頁編輯:黃頁 蘋果用戶數據丟失後可以通過iTunes或iCloud備份進行找回,那如果你的iPhone沒有備份怎麼辦
  • 蘋果手機沒有備份怎麼辦?果師兄:沒有備份可以這樣恢復
    蘋果手機沒有備份怎麼辦?果師兄:沒有備份可以這樣恢復 2019年04月25日 10:30作者:黃頁編輯:黃頁 蘋果手機上的內存越來越大,存儲的重要資料也越來越多,數據一旦丟失十分麻煩。