mysql 資料庫二進位制日誌恢復

2021-08-24 19:05:31 字數 4443 閱讀 9139

如果mysql伺服器啟用了二進位制日誌,你可以使用mysqlbinlog工具來恢復從指定的時間點開始 (例如,從你最後一次備份)直到現在或另乙個指定的時間點的資料。「mysqlbinlog:用於處理二進位制日誌檔案的實用工具」。

要想從二進位制日誌恢復資料,你需要知道當前二進位制日誌檔案的路徑和檔名。一般可以從選項檔案(即my.cnf or my.ini,取決於你的系統)中找到路徑。如果未包含在選項檔案中,當伺服器啟動時,可以在命令列中以選項的形式給出。啟用二進位制日誌的選項為-- log-bin。要想確定當前的二進位制日誌檔案的檔名,輸入下面的mysql語句:

show binlog events /g

你還可以從命令列輸入下面的內容:

mysql --user=root -pmy_pwd -e 'show binlog events /g'

將密碼my_pwd替換為伺服器的root密碼。

1. 指定恢復時間

對於mysql 4.1.4,可以在mysqlbinlog語句中通過--start-date和--stop-date選項指定datetime格式的起止時間。舉例說明,假設在今天上午10:00(今天是2023年4月20日),執行sql語句來刪除乙個大表。要想恢復表和資料,你可以恢復前晚上的備份,並輸入:

mysqlbinlog --stop-date="2005-04-20 9:59:59" /var/log/mysql/bin.123456 /

| mysql -u root -pmypwd

該命令將恢復截止到在--stop-date選項中以datetime格式給出的日期和時間的所有資料。如果你沒有檢測到幾個小時後輸入的錯誤的sql語句,可能你想要恢復後面發生的活動。根據這些,你可以用起使日期和時間再次執行mysqlbinlog:

mysqlbinlog --start-date="2005-04-20 10:01:00" /var/log/mysql/bin.123456 /

| mysql -u root -pmypwd /

在該行中,從上午10:01登入的sql語句將執行。組合執行前夜的轉儲檔案和mysqlbinlog的兩行可以將所有資料恢復到上午10:00前一秒鐘。你應檢查日誌以確保時間確切。下一節介紹如何實現。

2. 指定恢復位置

也可以不指定日期和時間,而使用mysqlbinlog的選項--start-position和--stop-position來指定日誌位置。它們的作用與起止日選項相同,不同的是給出了從日誌起的位置號。使用日誌位置是更準確的恢復方法,特別是當由於破壞性sql語句同時發生許多事務的時候。要想確定位置號,可以執行mysqlbinlog尋找執行了不期望的事務的時間範圍,但應將結果重新指向文字檔案以便進行檢查。操作方法為:

mysqlbinlog --start-date="2005-04-20 9:55:00" --stop-date="2005-04-20 10:05:00" /

/var/log/mysql/bin.123456 > /tmp/mysql_restore.sql

該命令將在/tmp目錄建立小的文字檔案,將顯示執行了錯誤的sql語句時的sql語句。你可以用文字編輯器開啟該檔案,尋找你不要想重複的語句。如果二進位制日誌中的位置號用於停止和繼續恢復操作,應進行注釋。用log_pos加乙個數字來標記位置。使用位置號恢復了以前的備份檔案後,你應從命令列輸入下面內容:

mysqlbinlog --stop-position="368312" /var/log/mysql/bin.123456 /

| mysql -u root -pmypwd

mysqlbinlog --start-position="368315" /var/log/mysql/bin.123456 /

| mysql -u root -pmypwd /

上面的第1行將恢復到停止位置為止的所有事務。下一行將恢復從給定的起始位置直到二進位制日誌結束的所有事務。因為mysqlbinlog的輸出包括每個sql語句記錄之前的set timestamp語句,恢復的資料和相關mysql日誌將反應事務執行的原時間

備份與恢復

如果你可以關閉你的mysql伺服器,你可以生成乙個包含innodb用來管理它的表的所有檔案的二進位製備份。使用如下步驟:

1. 關閉mysql伺服器,確信它是無錯誤關閉。

2.複製你所有資料檔案(ibdata檔案和.ibd檔案)到乙個安全的地方。

3. 複製你所有ib_logfile檔案到乙個安全的地方。

4. 複製my.cnf配置檔案或檔案到乙個安全的地方。

5. 為你innodb表複製.frm檔案到乙個安全的地方。

複製對innodb表起作用,所以你可以使用mysql複製能力來在需要高可用性的資料庫站點保有乙份資料庫的複製。

除了剛才描述的二進位製備份,你也應該周期性地用mysqldump轉儲你的資料庫。這麼做的原因是,二進位制檔案可能被破壞而你沒有注意到。轉儲的檔案被儲存成為人可讀的文字檔案,所以定點表的損壞修復變得更容易。再者,因為形式更簡單,嚴重資料損壞的機會就更小。mysqldump也有乙個--single-transaction選項,你可以用它來做乙個一致的快照而不用把其它客戶端排除在外面。

強制恢復

用select into outfile從從資料庫轉儲你的表,通常以這種方法獲取的大多數資料是完好的。

儘管如此,你可以用它來強制innodb儲存引擎啟動同時阻止後台操作執行,以便你能轉儲你的表。例如:你可以在重啟伺服器之前,在選項檔案的[mysqld]節新增如下的行:

[mysqld]innodb_force_recovery = 4備份策略(*)mysql資料庫中的myisam表,我們必須假定在備份過程中沒有對mysql賬戶進行管理更改。

需要進行完全備份,但有時不方便。會產生大的備份檔案並需要花時間來生成。從某個角度,完全備份並不理想,

因為每個成功的完全備份包括所有資料,甚至自從上一次完全備份以來沒有更改的部分。

完成了初使完全備份後,

進行增量備份會更有效。這樣備份檔案要小得多,備份時間也較短。不利之處是,恢復時不能只過載完全備份來恢復資料。

還必須要用增量備份來恢復增量更改。

要想進行增量備份,我們需要儲存增量更改。應使用--log-bin選項啟動mysql伺服器,以便更新資料時將這些更改儲存到檔案中。

恢復時mysql二進位制日誌很重要,因為它們是增量備份。如果進行完全備份時確保清空了日誌,則後面建立的二進位制日誌檔案包含了備份後的所有資料更改。讓我們稍稍修改前面的mysqldump命令,讓它在完全備份時能夠清空 mysql二進位制日誌,以便轉儲檔案包含包含新的當前的二進位制日誌:

shell>mysqldump --single-transaction --flush-logs --master-data=2

--all-databases > backup_sunday_1_pm.sql

執行該命令後,資料目錄則包含新的二進位制日誌檔案,gbichot2-bin.000007。

在星期一下午1點,我們可以清空日誌開始新的二進位制日誌檔案來建立增量備份。例如,執行mysqladmin flush-logs命令建立gbichot2-bin.000008。星期日下午1點的完全備份和星期一下午1點之間的所有更改為檔案gbichot2-bin.000007。該增量備份很重要,因此最好將它複製到安全的地方。(例如,備份到磁帶或***上,或複製到另一台機器上)。在星期二下午1點,執行另乙個mysqladmin flush-logs命令。星期一下午1點和星期二下午1點之間的所有所有更改為檔案gbichot2-bin.000008(也應複製到某個安全的地方)。

為恢復進行備份

現在假設在星期三上午8點出現了災難性崩潰,需要使用備份檔案進行恢復。恢復時,我們首先恢復最後的完全備份(從星期日下午1點開始)。完全備份檔案是一系列sql語句,因此恢復它很容易:

shell>mysql

在該點,資料恢復到星期日下午1點的狀態。要想恢復從那時起的更改,我們必須使用增量備份,也就是,gbichot2-bin.000007和gbichot2-bin.000008二進位制日誌檔案。根據需要從備份處取過這些檔案,然後按下述方式處理:

shell>mysqlbinlog gbichot2-bin.000007 gbichot2-bin.000008 | mysql

我們現在將資料恢復到星期二下午1點的狀態,但是從該時刻到崩潰之間的資料仍然有丟失。要想恢復,我們需要mysql伺服器將mysql二進位制日誌儲存到安全的位置(raid disks, san, ...),應為與資料檔案的儲存位置不同的地方,保證這些日誌不在毀壞的硬碟上。(也就是,我們可以用--log-bin選項啟動伺服器,指定乙個其它物理裝置上的與資料目錄不同的位置。這樣,即使包含該目錄的裝置丟失,日誌也不會丟失)。如果我們執行了這些操作,我們手頭上會有gbichot2-bin.000009檔案,我們可以用它來恢復大部分最新的資料更改,而不會丟失到崩潰時的資料。

MysqL資料庫二進位制日誌

二進位制日誌 該日誌檔案會以二進位制形式記錄資料庫的各種操作,但是不記錄查詢語句。mysql 的二進位制日誌 binlog 可以說是 mysql 最重要的日誌,它記錄了所有的 ddl 和 dml 語句 除了資料查詢語句select show等 以事件形式記錄,還包含語句所執行的消耗的時間,mysql...

資料庫二進位制日誌

二進位制日誌記錄三種格式 基於 語句 記錄 statement,記錄語句,預設模式 mariadb 10.2.3 版本以下 日誌量較少 基於 行 記錄 row,記錄資料,日誌量較大,更加安全,建議使用的格式 混合模式 mixed,讓系統自行判定該基於哪種方式進行,預設模式 mariadb 10.2....

mysql 二進位制日誌

如果mysql 伺服器啟用了二進位制日誌,你可以使用mysqlbinlog工具來恢復從指定的時間點開始 例如,從你最後一次備份 直到現在或另乙個指定的時間點的資料。mysqlbinlog 用於處理二進位制日誌檔案的實用工具 要想從二進位制日誌恢復資料,你需要知道當前二進位制日誌檔案的路徑和檔名。一般...