刪庫了,咱們必定要跑路嗎?

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

在 mysql 數據庫中,咱們知道 binlog 日誌記錄了咱們對數據庫的全部操做,因此 binlog 日誌就是咱們自救的利器。程序員

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

想要自救成功,binlog 這把利器必定要好,在本身以前,咱們必定要肯定咱們有 binlog 這把利器,如下就是確保有 binlog 利器的操做。數據庫

一、確認數據庫是否開啓 binlog 日誌服務器

show variables like 'log_%';
複製代碼

在這裏插入圖片描述

查看紅色圈出來的地方,若是爲 ON 則表示開啓,不然未開啓。沒有開啓的話,就須要作如下操做。微信

二、開啓 binlog 日誌工具

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

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

其中 binlog-format 有三種選項:ui

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

三、重啓 MySQL 服務器spa

四、再次確認 binlog 日誌開啓成功。

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

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

一、建立數據庫pingtouge

create database pingtouge;
複製代碼

二、建立 student 表

create table student(
   id INT NOT NULL AUTO_INCREMENT,
   name VARCHAR(100) NOT NULL,
   num VARCHAR(40) NOT NULL,
   PRIMARY KEY (id )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
複製代碼

三、插入數據

insert into student(name,num)values('張三','1234');
insert into student(name,num)values('李四','1235');
複製代碼

有了數據以後,能夠正式進入場景了, 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 來恢復二進制日誌文件,命令格式爲:

mysqlbinlog binlog日誌文件 --start-position 初始偏移量的位置 --stop-position 結束偏移量的位置 | mysql -u root -p 數據庫名稱;
複製代碼

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

執行:

mysqlbinlog d:\Mysql-binlog\mysql-bin.000043 --start-position 710 --stop-position 996 | mysql -u root -p pingtouge;
複製代碼

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

在這裏插入圖片描述
從上圖中,能夠看出,咱們成功的恢復了 student 表中 id=1 的這條數據。

場景二:誤刪了數據表

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

在這裏插入圖片描述

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

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

在這裏插入圖片描述
在這裏插入圖片描述
一張圖截不全,我就分兩張圖了。一樣咱們使用 mysqlbinlog 來恢復 student 表,執行:

mysqlbinlog d:\Mysql-binlog\mysql-bin.000043 --start-position 393 --stop-position 1997 | mysql -u root -p pingtouge
複製代碼

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

場景三:誤刪了數據庫

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

刪除 pingtouge 數據庫

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

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

mysqlbinlog d:\Mysql-binlog\mysql-bin.000043 --start-position 219 --stop-position 3861 | mysql -u root -p
複製代碼

須要注意的是最後不須要帶上數據庫,執行完以後,發現與數據庫pingtouge相關的數據所有都回來了。

刪庫了,咱們不必定須要跑路,必定要學習自救,少年。

以上就是今天分享的內容,但願對您的學習或者工做有所幫助,若是您以爲文章不錯,歡迎點個贊和轉發,謝謝。

最後

目前互聯網上不少大佬都有 MySQL 數據恢復相關文章,若有雷同,請多多包涵了。原創不易,碼字不易,還但願你們多多支持。若文中有所錯誤之處,還望提出,謝謝。

歡迎掃碼關注微信公衆號:「互聯網平頭哥」,和平頭哥一塊兒學習,一塊兒進步。

互聯網平頭哥
相關文章
相關標籤/搜索