在mysql的my.ini文件中加入
log-bin=C:/Program Files/MySQL/MySQL Server 5.5/binlogs/mysql-bin
查看是否開(kāi)啟
mysql>?show?variableslike'log_%';
binlog用于恢復(fù)誤刪的數(shù)據(jù)
我們了解了MySQL的binlog日志的開(kāi)啟方式以及binlog日志的一些原理和常用操作拘鞋,我們知道淤击,binlog有兩大作用逢艘,一個(gè)是使用binlog恢復(fù)數(shù)據(jù)估盘,另一個(gè)就是用來(lái)做主從復(fù)制喷市。本篇筆記就是來(lái)記錄如何使用binlog日志來(lái)做數(shù)據(jù)恢復(fù)跌宛。當(dāng)然了酗宋,使用binlog日志所恢復(fù)的數(shù)據(jù)只能是部分?jǐn)?shù)據(jù),并不能夠使用binlog日志來(lái)做數(shù)據(jù)庫(kù)的備份疆拘,如果想要做數(shù)據(jù)庫(kù)備份蜕猫,依然要使用我們傳統(tǒng)的備份方法,而binlog可以作為增量備份哎迄。
在正式開(kāi)始之前回右,先來(lái)說(shuō)一說(shuō)mysql完整備份數(shù)據(jù)庫(kù),以及恢復(fù)數(shù)據(jù)庫(kù)的方法
備份數(shù)據(jù)庫(kù):
首先我們來(lái)創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)漱挚,mytest
create database mytest;
接著我們來(lái)創(chuàng)建一張表
use mytest;
create table t1(id int ,name varchar(20));
然后我們插入兩條數(shù)據(jù)
insert into t1 values (1,'xiaoming');
insert into t1 values (2,'xiaohong');
下面我們對(duì)mytest數(shù)據(jù)庫(kù)進(jìn)行備份翔烁,備份到/root/bakup/
mysqldump -uroot -p -B -F -R -x --master-data=2 mytest | gzip > /root/backup/bak_$(date +%F).sql.gz
參數(shù)說(shuō)明:
-B:指定數(shù)據(jù)庫(kù)
-F:刷新日志
-R:備份存儲(chǔ)過(guò)程等
-x:鎖表
--master-data:在備份語(yǔ)句里添加CHANGE MASTER語(yǔ)句以及binlog文件及位置點(diǎn)信息
查看備份文件
這樣呢,我們就把數(shù)據(jù)做了一個(gè)完整的備份旨涝。下面來(lái)刪除數(shù)據(jù)庫(kù)蹬屹,然后通過(guò)備份數(shù)據(jù)進(jìn)行恢復(fù)數(shù)據(jù)庫(kù)。
gzip -d bakup_xxx.gz
mysql -uroot -p < bakup_xxx.sql
這樣我們就把數(shù)據(jù)導(dǎo)入到庫(kù)里了白华。
繼續(xù)上面的操做慨默,我們新增xiaoli和xiaozhao這兩條數(shù)據(jù),并把xiaozhao這條記錄刪除掉弧腥。
在刪除之前厦取,我們先來(lái)刷新binlog日志,生成一個(gè)新的日志鸟赫,那么我們之后所要操做的內(nèi)容都會(huì)被記錄到新的日志文件中蒜胖。(通過(guò)前面binlog日志的詳細(xì)說(shuō)明我們知道,每次刷新和服務(wù)重啟的時(shí)候抛蚤,都會(huì)生成一個(gè)binlog日志文件台谢。)
flush logs;
show master status;
我們注意,binlog的文件是0009岁经,位置是在154朋沮,這兩個(gè)信息很重要
下面我們來(lái)做插入和刪除操作
這個(gè)時(shí)候我們應(yīng)該是來(lái)查看一下binlog日志的狀態(tài),以便與我們一會(huì)來(lái)進(jìn)行恢復(fù)到此狀態(tài),但是樊拓,真正的環(huán)境中我們并不知道這個(gè)狀態(tài)纠亚,因此這里也就不去查看這個(gè)狀態(tài)了,這個(gè)狀態(tài)的值可以通過(guò)后面查看binlog日志文件來(lái)進(jìn)行分析筋夏。下面我們開(kāi)始誤操作:
我們來(lái)把xiaozhao刪除掉
這樣數(shù)據(jù)就刪除掉了蒂胞,下面我們?cè)賮?lái)查看binlog的狀態(tài)
show master status;
這個(gè)時(shí)候我們發(fā)現(xiàn)我刪除操作是個(gè)錯(cuò)誤的操作,要進(jìn)行恢復(fù)条篷,那么該如何恢復(fù)呢骗随?這個(gè)時(shí)候我們就可以通過(guò)binlog的position來(lái)進(jìn)行恢復(fù)。
在進(jìn)行其他的處理之前赴叹,我們建議鸿染,馬上再執(zhí)行一次flush logs,也就是讓出錯(cuò)的部分就集中在這么一個(gè)binlog日志文件中乞巧。
我們來(lái)查看0009的binlog日志涨椒。
show binlog events in 'mysql-bin.000012'
我們看到delete_rows 結(jié)束點(diǎn)是928這個(gè)點(diǎn),起始點(diǎn)是在755這個(gè)點(diǎn)绽媒,我們可以把操作的這些數(shù)據(jù)刪除到我們上次備份的內(nèi)容蚕冬,然后通過(guò)執(zhí)行binlog來(lái)進(jìn)行恢復(fù),當(dāng)然恢復(fù)到755這個(gè)點(diǎn)之前些椒。
比如我上次備份的是整個(gè)數(shù)據(jù)庫(kù)播瞳,我就可以把整個(gè)數(shù)據(jù)庫(kù)刪除,然后通過(guò)備份文件恢復(fù)免糕,然后再通過(guò)binlog做增量恢復(fù)赢乓。這樣數(shù)據(jù)就回來(lái)了。這里就不再進(jìn)行刪庫(kù)了石窑,我們直接演示使用binlog日志恢復(fù)數(shù)據(jù)的方法
語(yǔ)法如下
mysqlbinlog mysql-bin.0000xx | mysql -u用戶名 -p密碼 數(shù)據(jù)庫(kù)名
比如我們要把所有的操作都恢復(fù)(不包括我們的刪除牌芋,我們知道刪除是在755點(diǎn)上):
mysqlbinlog mysql-bin.000009 --start-position 154 --stop-position 755 | mysql -uroot -p mytest
再來(lái)查看表
我們發(fā)現(xiàn)xiaozhao又回來(lái)了,當(dāng)然了松逊,這里多了一個(gè)xiali躺屁,是因?yàn)槲抑安](méi)有刪除備份前的數(shù)據(jù)。當(dāng)然了经宏,我們?cè)诨謴?fù)的過(guò)程中可以選擇只恢復(fù)xiaozhao這么一塊內(nèi)容
下面是binlog日志恢復(fù)中一些常用的參數(shù)
--start-datetime:從二進(jìn)制日志中讀取指定等于時(shí)間戳或者晚于本地計(jì)算機(jī)的時(shí)間
--stop-datetime:從二進(jìn)制日志中讀取指定小于時(shí)間戳或者等于本地計(jì)算機(jī)的時(shí)間 取值和上述一樣
--start-position:從二進(jìn)制日志中讀取指定position 事件位置作為開(kāi)始犀暑。
--stop-position:從二進(jìn)制日志中讀取指定position 事件位置作為事件截至