刪庫了,我們一定要跑路嗎?

在工作中,我們誤刪數據或者數據庫,我們一定需要跑路嗎?我看未必,程序員一定要學會自救,神不知鬼不覺的將數據找回。

在 mysql 數據庫中,我們知道 binlog 日誌記錄了我們對數據庫的所有操作,所以 binlog 日誌就是我們自救的利器。

接下來就來開啟程序員自救之路。

想要自救成功,binlog 這把利器一定要好,在自己之前,我們一定要確定我們有 binlog 這把利器,以下就是確保有 binlog 利器的操作。

1、確認數據庫是否開啟 binlog 日誌

<code>show variables like 'log_%';/<code>


刪庫了,我們一定要跑路嗎?


查看紅色圈出來的地方,如果為 ON 則表示開啟,否則未開啟。沒有開啟的話,就需要做以下操作。

2、開啟 binlog 日誌

如果未開啟 binlog 日誌的話,就需要開啟 binlog 日誌,在 MySQL 的配置文件中設置,如果你的是windowns 電腦則找到 my.ini 文件,unix 系統找到 my.cnf文件。在文件中修改或者配置如下參數:

<code># Binary Logging.
#日誌文件的名字及存儲路徑
log-bin=D:\\Mysql-binlog\\mysql-bin
#設置日誌格式
binlog-format=mixed/<code>

其中 binlog-format 有三種選項:

  • STATMENT:每一條會修改數據的 SQL 語句會記錄在 binlog 中。
  • ROW:不記錄每一條 SQL語句的上下文信息,僅記錄哪條記錄被修改。
  • MIXED:以上兩種模式的混合使用,一般的複製使用STATEMENT模式保存binlog,對於STATEMENT模式無法複製的操作使用ROW模式保存binlog,MySQL會根據執行的 SQL 語句選擇日誌保存方式。

3、重啟 MySQL 服務器

4、再次確認 binlog 日誌開啟成功。

好了,操作完上面幾步之後,我們就可以學習如何自救了,我們使用三個場景來分別演示誤刪數據、誤刪表、誤刪庫的情況下如何自救。

在進入具體的場景前,我們先來準備演示需要的數據庫、表和數據。

1、創建數據庫pingtouge

<code>create database pingtouge;/<code>

2、創建 student 表

<code>create table student(
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
num VARCHAR(40) NOT NULL,
PRIMARY KEY (id )
/<code>

3、插入數據

<code>insert into student(name,num)values('張三','1234');
insert into student(name,num)values('李四','1235');/<code>

有了數據之後,可以正式進入場景了, are you ready?

場景一:誤刪了某條數據

一不小心將 student 表中 id=1 的數據刪除了。該怎麼辦?


刪庫了,我們一定要跑路嗎?


憑著記憶手動插入這條數據嗎?好像也不是不可以哇,能記住的都是天才,利用 binlog 日誌才是王道。

使用 show master status命令,查看最新的 binlog 日誌文件。


刪庫了,我們一定要跑路嗎?


獲取到最新的 binlog 日誌文件後,使用 show binlog events in 'mysql-bin.000043';命令查看 binlog 日誌文件,如下圖所示:


刪庫了,我們一定要跑路嗎?


binlog 日誌記錄了我們對數據庫的所有操作,包括語句提交前和提交後的偏移量,在數據恢復時會使用到這兩個偏移量。

在正式進入數據恢復之前,我們先來認識 MySQL 提供的一個工具:mysqlbinlog 。mysqlbinlog 是用來操作 binlog 日誌文件,我們數據恢復就需要使用到它。

使用 mysqlbinlog 來恢復二進制日誌文件,命令格式為:

<code> mysqlbinlog binlog日誌文件 --start-position 初始偏移量的位置 --stop-position 結束偏移量的位置 | mysql -u root -p 數據庫名稱;/<code>

我們在 binlog 日誌文件中找到 student 表中 id=1 這條數據在刪除之前的最後一次操作的起始偏移量和結束偏移量,在上圖中,我已經標出,起始偏移量為:710,結束偏移量為:996。有了這兩個參數之後,我們就可以使用 mysqlbinlog 命令來恢復數據了。

執行:

<code> mysqlbinlog d:\\Mysql-binlog\\mysql-bin.000043 --start-position 710 --stop-position 996 | mysql -u root -p pingtouge;/<code>

如果命令執行成功的話,再次執行 select * from student命令,查看數據是否恢復。


刪庫了,我們一定要跑路嗎?

從上圖中,可以看出,我們成功的恢復了 student 表中 id=1 的這條數據。


場景二:誤刪了數據表

又是一不小心把表 student 給刪除了。


刪庫了,我們一定要跑路嗎?


對於誤刪表,同樣可以使用 binlog 日誌來恢復,畢竟 binlog 日記記錄的是我們對 MySQL 的所有操作,跟恢復單條數據一樣,我們同樣需要在 binlog 日誌文件中查找到起始偏移量和結束偏移量,用來恢復數據。

與單條數據不一樣的是,對於表的偏移量,起始偏移量是創建表之前的開始偏移量,結束偏移量是刪除數據庫之前的最後一個結束偏移量。 如下圖示:


刪庫了,我們一定要跑路嗎?

刪庫了,我們一定要跑路嗎?

一張圖截不全,我就分兩張圖了。同樣我們使用 mysqlbinlog 來恢復 student 表,執行:


<code> mysqlbinlog d:\\Mysql-binlog\\mysql-bin.000043 --start-position 393 --stop-position 1997 | mysql -u root -p pingtouge/<code>

命令執行完成後,再次執行 select * from student;,你會發現我們的數據都回來了。

場景三:誤刪了數據庫

你在工作中受氣了,準備刪庫跑路啦,於是你就把pingtouge數據庫給刪除了,刪完之後你就後悔了,怎麼辦?在線等。


刪庫了,我們一定要跑路嗎?


不要慌,萬能的 binlog 日誌可以救你,跟前面兩種場景一樣,還是在 binlog 日誌中查詢到需要恢復數據庫的起始偏移量和結束偏移量。這裡我就不截圖了。

通過查看 binlog 日誌發現創建數據庫pingtouge的開始偏移量為 219,刪庫之前的最後偏移量為 3861,有了這兩個偏移量之後,執行:

<code>mysqlbinlog d:\\Mysql-binlog\\mysql-bin.000043 --start-position 219 --stop-position 3861 | mysql -u root -p/<code>

需要注意的是最後不需要帶上數據庫,執行完之後,發現與數據庫pingtouge相關的數據全部都回來了。

刪庫了,我們不一定需要跑路,一定要學習自救,少年。

以上就是今天分享的內容,希望對您的學習或者工作有所幫助,如果您覺得文章不錯,歡迎點個贊和轉發,謝謝。


作者:平頭哥的技術博文
鏈接:https://juejin.im/post/5e53258fe51d4526f65cc1f8


分享到:


相關文章: