天天看點

使用MySQL自身複制來恢複binlog

在mysql手冊中一直是推薦使用mysqlbinlog工具來實作指定時間點的資料恢複,事實上,這是一個經常"讓人郁悶"的辦法。更好的辦法是,使用mysql内部複制線程中的sql thread來做恢複。

這個idea來自lazydba同學;在google稍作搜尋,在xaprb上baron schwartz也很早提到了使用類似的方法來恢複binlog,在那篇讨論中,還可以看到jeremy cole也提到:使用mysql手冊中推薦的方法是困難重重的,而且mysqlbinlog這個辦法從邏輯上來說也是一個錯誤--因為這樣mysql不得不在兩個不同的地方實作一套相同的邏輯,最終難免會出錯。使用mysqlbinlog來恢複,你可能會需要以下“讓人郁悶”的問題:

本文不打算寫一個step by step的文檔,隻介紹主要的思路和粗略的操作步驟。

優點:實施簡單;缺點:需要關閉一次資料庫(不确定不關閉資料庫行不行);

思路:直接将要恢複的binlog拷貝到relay log目錄,并修改slave-info相關的檔案,讓mysql把binlog當做relay log來執行

簡單的操作步驟:

這個方法,無需啟動資料庫,但是需要重新啟動一個全新的執行個體,将binlog拷貝到該執行個體中,這裡稱這個執行個體為binlog server。然後把需要恢複的執行個體複制指向這個binlog server。這裡需要做的是,将日志拷貝到binlog server對應目錄下,并修改對應的master-info檔案,使得備庫能夠dump到這些binlog檔案。

* 配置檔案中建議加上skip-slave-start,以免在不需要時候slave線程自己開始執行了

* start slave的時候,可以通過start slave until的方式,控制slave執行到的位點

* slave執行的其實位點,則通過relay-log.info或者change master to來指定

good luck.