MySql恢復(fù)數(shù)據(jù)方法梳理講解
一、前言
mysql具有binlog功能,可以記錄對(duì)表進(jìn)行過的操作、執(zhí)行過的sql語句;
以下主要是總結(jié)下binlog的開啟方法、使用方法等;
如果誤刪數(shù)據(jù)庫表中的某些數(shù)據(jù)、或者誤刪整個(gè)表、誤修改表結(jié)構(gòu)等,就可以使用這個(gè)方法進(jìn)行恢復(fù)。
二、步驟
1.如果想使用MySql數(shù)據(jù)恢復(fù)功能,首先需要修改Mysql配置文件,開啟binlog功能。(有些版本binlog默認(rèn)是不開啟的,因此需要手動(dòng)修改配置文件開啟)
(1)windows環(huán)境
配置文件名稱為my.ini
,可以安裝軟件everything搜索這個(gè)文件。路徑樣例如下:
C:ProgramDataMySQLMySQL Server 5.7my.ini
(2)linux環(huán)境
配置文件名稱為my.cnf
,可以使用find命令搜索文件所在位置:
sudo find / -name my.cnf
位置樣例如下:
/etc/my.cnf
2.找到配置文件后(my.ini/my.cnf),新增以下配置即可(當(dāng)然先看看配置文件是否已配置了這行,不要重復(fù)了):
log-bin=mysqlbinlog
binlog-format=ROW
或者也可以指定binlog的位置(下方是linux下的路徑):
log-bin=/data/mysql/log/mysqlbinlog
binlog-format=ROW
注意,指定binlog在某個(gè)文件夾下時(shí),必須自己創(chuàng)建文件夾,否則重啟mysql會(huì)報(bào)錯(cuò)。
3.配置完成后,重啟mysql。
4.現(xiàn)在,對(duì)mysql的數(shù)據(jù)庫、表、數(shù)據(jù)等操作、執(zhí)行增刪改sql,都會(huì)記錄到binlog中。(搜索mysqlbinlog就可以找到這個(gè)日志文件)
5.進(jìn)行測(cè)試,新建一個(gè)表binlog_test,列隨意,然后寫幾行數(shù)據(jù),然后清空表數(shù)據(jù)。(準(zhǔn)備使用binlog還原數(shù)據(jù))
6.查看binlog的命令如下:
mysql> show binlog events; #只查看第一個(gè)binlog文件的內(nèi)容 mysql> show binlog events in 'mysqlbinlog.000002';#查看指定binlog文件的內(nèi)容 mysql> show binary logs; #獲取binlog文件列表 mysql> show master status; #查看當(dāng)前正在寫入的binlog文件
7.首先看當(dāng)前使用的是哪個(gè)binlog:
show master status;
本人執(zhí)行后,發(fā)現(xiàn)當(dāng)前使用的binlog是:mysqlbinlog.000004
8.然后查看這個(gè)binlog的內(nèi)容:
show binlog events in 'mysqlbinlog.000004';
執(zhí)行后,可以從查詢結(jié)果的Info
列中,找到剛才創(chuàng)建binlog_test
表的sql(對(duì)應(yīng)的Event_type
是Query
);
可以看到剛才清空表數(shù)據(jù)的記錄行,Event_type
是Delete_rows
;
在上一些,可以看到創(chuàng)建表后、新增數(shù)據(jù)的Event_type
是Write_rows
;
9.分析這個(gè)binlog,我們的目標(biāo)是還原剛才被刪除的數(shù)據(jù),因此找到create table語句后的第一個(gè)Event_type
是Query
的行,它的Pos
為460
;
再找到Event_type
是Delete_rows
上面最接近的、Info
中是COMMIT
的行,它的Event_type
是Xid
,End_log_pos
是1199
。
(每一行的End_log_pos對(duì)應(yīng)下一行的Pos)
10.現(xiàn)在找到了一個(gè)范圍,從460
到1199
之間的執(zhí)行日志,就是給表binlog_test
增加數(shù)據(jù)的日志,因此只要重復(fù)執(zhí)行這之間的操作,就可以還原數(shù)據(jù)了。
11-1.windows下,找到mysqlbinlog.exe
的位置;
linux下,找到mysqlbinlog
的位置(這個(gè)是mysql的bin目錄下的一個(gè)可執(zhí)行文件);
然后執(zhí)行以下命令,即可還原數(shù)據(jù):
mysqlbinlog --no-defaults --start-position=460 --stop-position=1199 "C:ProgramDataMySQLMySQL Sever 5.7Datamysqlbinlog.000004" -d test | mysql -uroot -proot test
其中,指定了開始位置為460
,結(jié)束位置為1199
,命令執(zhí)行后就會(huì)讀取日志中指定范圍內(nèi)的命令并重新執(zhí)行。
其它命令的含義為:
"-d test"的意思是,指定數(shù)據(jù)庫為test(binlog_test表在test數(shù)據(jù)庫中)
"|"是管道符
"mysql -uroot -proot test"是mysql的賬號(hào)密碼、登陸目標(biāo)數(shù)據(jù)庫
"-uroot":賬號(hào)是root
"-proot":密碼是root
"test":數(shù)據(jù)庫是test
11-2.也可以把binlog日志中,指定范圍內(nèi)的日志導(dǎo)出,然后自己執(zhí)行source命令還原數(shù)據(jù),如下:
mysqlbinlog "C:ProgramDataMySQLMySQL Sever 5.7Datamysqlbinlog.000004" -d test --skip-gtids --start-position=460 --stop-position=1199 > test.sql
執(zhí)行這個(gè)命令后,指定范圍內(nèi)的日志被導(dǎo)出到test.sql
中;
然后登陸mysql,執(zhí)行命令:
mysql> use test; mysql> source test.sql;
這樣就可以還原數(shù)據(jù)了。
三、其它筆記
1.如果使用truncate刪除表的數(shù)據(jù),binlog中也會(huì)新增幾行記錄,記錄truncate操作,樣例如下:
mysqlbinlog.000004 | 3122 | Query | 1 | 3211 | use 'test'; TRUNCATE 'binlog_test'
如果想恢復(fù)數(shù)據(jù),就需要找到最開始插入數(shù)據(jù)的Pos、到truncate之前的End_log_pos,然后重新執(zhí)行這期間的命令。
2.增刪改操作會(huì)記錄到binlog中,慢查詢sql也可以記錄到慢查詢log中,不過也需要自己修改配置文件開啟慢查詢?nèi)罩尽?/p>
到此這篇關(guān)于MySql恢復(fù)數(shù)據(jù)方法梳理講解的文章就介紹到這了,更多相關(guān)MySql恢復(fù)數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MySQL通過binlog實(shí)現(xiàn)恢復(fù)數(shù)據(jù)
- Python MySQL如何通過Binlog獲取變更記錄恢復(fù)數(shù)據(jù)
- MySQL通過日志恢復(fù)數(shù)據(jù)的操作步驟
- MySQL通過ibd文件恢復(fù)數(shù)據(jù)的操作過程
- MySQL開啟配置binlog及通過binlog恢復(fù)數(shù)據(jù)步驟詳析
- mysql binlog如何恢復(fù)數(shù)據(jù)到某一時(shí)刻
- MySQL誤刪后使用binlog恢復(fù)數(shù)據(jù)的實(shí)現(xiàn)方法
- mysql數(shù)據(jù)損壞,如何通過ibd和frm文件批量恢復(fù)數(shù)據(jù)庫數(shù)據(jù)
- Mysql如何通過ibd文件恢復(fù)數(shù)據(jù)
- mysql如何根據(jù).frm和.ibd文件恢復(fù)數(shù)據(jù)表
- 一步步教你如何使用mysql?binlog恢復(fù)數(shù)據(jù)
- Mysql通過ibd文件恢復(fù)數(shù)據(jù)的詳細(xì)步驟
- MySQL數(shù)據(jù)庫通過Binlog恢復(fù)數(shù)據(jù)的詳細(xì)步驟
- Mysql如何通過binlog日志恢復(fù)數(shù)據(jù)詳解
- mysql5.7使用binlog 恢復(fù)數(shù)據(jù)的方法
- MySQL通過binlog恢復(fù)數(shù)據(jù)
- mysql8.0無備份通過idb文件恢復(fù)數(shù)據(jù)的方法、idb文件修復(fù)和tablespace?id不一致處理
相關(guān)文章
關(guān)于MySQL的存儲(chǔ)過程與存儲(chǔ)函數(shù)
存儲(chǔ)過程是在大型數(shù)據(jù)庫系統(tǒng)中,一組為了完成特定功能的SQL?語句集(這些SQL語句已經(jīng)編譯過了),它存儲(chǔ)在數(shù)據(jù)庫中,一次編譯后永久有效,需要的朋友可以參考下2023-05-05mysql中數(shù)據(jù)庫覆蓋導(dǎo)入的幾種方式總結(jié)
這篇文章主要介紹了mysql中數(shù)據(jù)庫覆蓋導(dǎo)入的幾種方式總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03如何優(yōu)雅、安全的關(guān)閉MySQL進(jìn)程
這篇文章主要介紹了如何優(yōu)雅、安全的關(guān)閉MySQL進(jìn)程,幫助大家更好的理解和學(xué)習(xí)MySQL,感興趣的朋友可以了解下2020-08-08超詳細(xì)匯總21個(gè)值得收藏的mysql優(yōu)化實(shí)踐
這篇文章主要分享的是超詳細(xì)匯總21個(gè)值得收藏的mysql優(yōu)化實(shí)踐,對(duì)正在學(xué)習(xí)的同學(xué)有一定的參考價(jià)值,需要的同學(xué)可以參考一下2022-01-01將json文件數(shù)據(jù)導(dǎo)入到MySQL表中的詳細(xì)教程
如何使用json文件將數(shù)據(jù)導(dǎo)入到MySQL數(shù)據(jù)庫中的表里?Excel表格等文件的數(shù)據(jù)通過java或者python等語言讀取后生成一個(gè)json文件,然后想要將文件中的數(shù)據(jù)寫入到MySQL表中,本文介紹了將json文件數(shù)據(jù)導(dǎo)入到MySQL表中的詳細(xì)教程,需要的朋友可以參考下2024-07-07MySql 存儲(chǔ)引擎和索引相關(guān)知識(shí)總結(jié)
這篇文章主要介紹了MySql 存儲(chǔ)引擎和索引相關(guān)知識(shí)總結(jié),文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-06-06MySQL數(shù)據(jù)庫中外鍵(foreign?key)用法詳解
這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫中外鍵(foreign?key)的相關(guān)資料,MySQL 外鍵約束可以用來保證表與表之間的關(guān)系完整性,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10