****欧欧美毛片4,国产午夜精品视频,97视频在线观看免费视频,久久七国产精品

數據恢復咨詢熱線:400-666-3702??

歡迎訪問南京兆柏數據恢復公司,專業數據恢復15年

兆柏數據恢復公司

?行業新聞

?當前位置: 主頁 > 行業新聞

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

瀏覽量: 次 發布日期:2023-10-10 20:11:04

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

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

  嗯!你志哥以前干過直接在生產環境中對數據進行操作,或者忘記了當前是在開發環境,還是在生產環境中,就直接對數據庫進行操作。

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

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

  InnoDB 存儲引擎中的表空間是怎樣的?兩種表空間存儲方式各有哪些優缺點?

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

  如何模擬 InnoDB 文件的損壞與數據恢復

  InnoDB 存儲引擎的表空間

  InnoDB 存儲引擎的文件格式是.ibd 文件,數據會按照表空間(tablespace)進行存儲,分為共享表空間和獨立表空間。如果想要查看表空間的存儲方式,我們可以對innodb_file_per_table變量進行查詢,使用show variables like 'innodb_file_per_table';。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 都無法進行操作。

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

  使用innodb_force_recovery啟動服務器

  將innodb_force_recovery參數設置為 1,啟動數據庫。如果數據表不能正常讀取,需要調大參數直到能讀取數據為止。通常設置為 1 即可。

  備份數據表

  在備份數據之前,需要準備一個新的數據表,這里需要使用 MyISAM 存儲引擎。原因很簡單,InnoDB 存儲引擎已經寫保護了,無法將數據備份出來。然后將損壞的 InnoDB 數據表備份到新的 MyISAM 數據表中。

  刪除舊表,改名新表

  數據備份完成之后,我們可以刪除掉原有損壞的 InnoDB 數據表,然后將新表進行改名。

  關閉innodb_force_recovery,并重啟數據庫

  innodb_force_recovery大于 1 的時候會有很多限制,我們需要將該功能關閉,然后重啟數據庫,并且將數據表的 MyISAM 存儲引擎更新為 InnoDB 存儲引擎。

  往期推薦

  如何保證集合是線程安全的? ConcurrentHashMap如何實現高效地線程安全?

  Java程序運行在Docker等容器環境有哪些新問題?

  Redis數據增多了,是該加內存還是加實例?

  哨兵機制:主庫掛了,如何不間斷服務?

相關推薦