删库了,我们一定要跑路吗?
在工作中,我們誤刪數(shù)據(jù)或者數(shù)據(jù)庫,我們一定需要跑路嗎?我看未必,程序員一定要學(xué)會自救,神不知鬼不覺的將數(shù)據(jù)找回。
在 mysql 數(shù)據(jù)庫中,我們知道 binlog 日志記錄了我們對數(shù)據(jù)庫的所有操作,所以 binlog 日志就是我們自救的利器。
接下來就來開啟程序員自救之路。
想要自救成功,binlog 這把利器一定要好,在自己之前,我們一定要確定我們有 binlog 這把利器,以下就是確保有 binlog 利器的操作。
1、確認(rèn)數(shù)據(jù)庫是否開啟 binlog 日志
show variables like 'log_%';查看紅色圈出來的地方,如果為 ON 則表示開啟,否則未開啟。沒有開啟的話,就需要做以下操作。
2、開啟 binlog 日志
如果未開啟 binlog 日志的話,就需要開啟 binlog 日志,在 MySQL 的配置文件中設(shè)置,如果你的是windowns 電腦則找到 my.ini 文件,unix 系統(tǒng)找到 my.cnf文件。在文件中修改或者配置如下參數(shù):
# Binary Logging. #日志文件的名字及存儲路徑 log-bin=D:\Mysql-binlog\mysql-bin #設(shè)置日志格式 binlog-format=mixed其中 binlog-format 有三種選項(xiàng):
- STATMENT:每一條會修改數(shù)據(jù)的 SQL 語句會記錄在 binlog 中。
- ROW:不記錄每一條 SQL語句的上下文信息,僅記錄哪條記錄被修改。
- MIXED:以上兩種模式的混合使用,一般的復(fù)制使用STATEMENT模式保存binlog,對于STATEMENT模式無法復(fù)制的操作使用ROW模式保存binlog,MySQL會根據(jù)執(zhí)行的 SQL 語句選擇日志保存方式。
3、重啟 MySQL 服務(wù)器
4、再次確認(rèn) binlog 日志開啟成功。
好了,操作完上面幾步之后,我們就可以學(xué)習(xí)如何自救了,我們使用三個場景來分別演示誤刪數(shù)據(jù)、誤刪表、誤刪庫的情況下如何自救。
在進(jìn)入具體的場景前,我們先來準(zhǔn)備演示需要的數(shù)據(jù)庫、表和數(shù)據(jù)。
1、創(chuàng)建數(shù)據(jù)庫pingtouge
create database pingtouge;2、創(chuàng)建 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;3、插入數(shù)據(jù)
insert into student(name,num)values('張三','1234'); insert into student(name,num)values('李四','1235');有了數(shù)據(jù)之后,可以正式進(jìn)入場景了, are you ready?
場景一:誤刪了某條數(shù)據(jù)
一不小心將 student 表中 id=1 的數(shù)據(jù)刪除了。該怎么辦?
憑著記憶手動插入這條數(shù)據(jù)嗎?好像也不是不可以哇,能記住的都是天才,利用 binlog 日志才是王道。
使用 show master status命令,查看最新的 binlog 日志文件。
獲取到最新的 binlog 日志文件后,使用 show binlog events in 'mysql-bin.000043';命令查看 binlog 日志文件,如下圖所示:
binlog 日志記錄了我們對數(shù)據(jù)庫的所有操作,包括語句提交前和提交后的偏移量,在數(shù)據(jù)恢復(fù)時會使用到這兩個偏移量。
在正式進(jìn)入數(shù)據(jù)恢復(fù)之前,我們先來認(rèn)識 MySQL 提供的一個工具:mysqlbinlog 。mysqlbinlog 是用來操作 binlog 日志文件,我們數(shù)據(jù)恢復(fù)就需要使用到它。
使用 mysqlbinlog 來恢復(fù)二進(jìn)制日志文件,命令格式為:
mysqlbinlog binlog日志文件 --start-position 初始偏移量的位置 --stop-position 結(jié)束偏移量的位置 | mysql -u root -p 數(shù)據(jù)庫名稱;我們在 binlog 日志文件中找到 student 表中 id=1 這條數(shù)據(jù)在刪除之前的最后一次操作的起始偏移量和結(jié)束偏移量,在上圖中,我已經(jīng)標(biāo)出,起始偏移量為:710,結(jié)束偏移量為:996。有了這兩個參數(shù)之后,我們就可以使用 mysqlbinlog 命令來恢復(fù)數(shù)據(jù)了。
執(zhí)行:
mysqlbinlog d:\Mysql-binlog\mysql-bin.000043 --start-position 710 --stop-position 996 | mysql -u root -p pingtouge;如果命令執(zhí)行成功的話,再次執(zhí)行 select * from student命令,查看數(shù)據(jù)是否恢復(fù)。
從上圖中,可以看出,我們成功的恢復(fù)了 student 表中 id=1 的這條數(shù)據(jù)。
場景二:誤刪了數(shù)據(jù)表
又是一不小心把表 student 給刪除了。
對于誤刪表,同樣可以使用 binlog 日志來恢復(fù),畢竟 binlog 日記記錄的是我們對 MySQL 的所有操作,跟恢復(fù)單條數(shù)據(jù)一樣,我們同樣需要在 binlog 日志文件中查找到起始偏移量和結(jié)束偏移量,用來恢復(fù)數(shù)據(jù)。
與單條數(shù)據(jù)不一樣的是,對于表的偏移量,起始偏移量是創(chuàng)建表之前的開始偏移量,結(jié)束偏移量是刪除數(shù)據(jù)庫之前的最后一個結(jié)束偏移量。 如下圖示:
一張圖截不全,我就分兩張圖了。同樣我們使用 mysqlbinlog 來恢復(fù) student 表,執(zhí)行:
命令執(zhí)行完成后,再次執(zhí)行 select * from student;,你會發(fā)現(xiàn)我們的數(shù)據(jù)都回來了。
場景三:誤刪了數(shù)據(jù)庫
你在工作中受氣了,準(zhǔn)備刪庫跑路啦,于是你就把pingtouge數(shù)據(jù)庫給刪除了,刪完之后你就后悔了,怎么辦?在線等。
不要慌,萬能的 binlog 日志可以救你,跟前面兩種場景一樣,還是在 binlog 日志中查詢到需要恢復(fù)數(shù)據(jù)庫的起始偏移量和結(jié)束偏移量。這里我就不截圖了。
通過查看 binlog 日志發(fā)現(xiàn)創(chuàng)建數(shù)據(jù)庫pingtouge的開始偏移量為 219,刪庫之前的最后偏移量為 3861,有了這兩個偏移量之后,執(zhí)行:
mysqlbinlog d:\Mysql-binlog\mysql-bin.000043 --start-position 219 --stop-position 3861 | mysql -u root -p需要注意的是最后不需要帶上數(shù)據(jù)庫,執(zhí)行完之后,發(fā)現(xiàn)與數(shù)據(jù)庫pingtouge相關(guān)的數(shù)據(jù)全部都回來了。
刪庫了,我們不一定需要跑路,一定要學(xué)習(xí)自救,少年。
以上就是今天分享的內(nèi)容,希望對您的學(xué)習(xí)或者工作有所幫助,如果您覺得文章不錯,歡迎點(diǎn)個贊和轉(zhuǎn)發(fā),謝謝。
總結(jié)
以上是生活随笔為你收集整理的删库了,我们一定要跑路吗?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: range方法在Python2和Pyth
- 下一篇: 阿里面试官问我,你们的需求研发/开发流程