寫在前面mysql
mysqldump用於備份數據,進行全庫的全量備份,或者單庫備份。sql
binlog用於增量備份,其增量備份的前提是創建在全量備份的基礎之上的。數據庫
即一次完整的恢復須要mysqldump備份文件+binlog才能正確還原回數據。測試
———————————————————————————————————————————————————————————spa
1、使用mysqldump備份全庫+binlog備份並進行恢復。
備註:此處binlog的格式爲Mixed的,本身感受設置爲Mixed格式好一點。
一、首先建立test庫和對應的表tb一、tb2
二、進行全庫備份
三、此時咱們在往tb2表內添加一些數據,這時插入的記錄記錄在binlog中。
四、這時咱們模擬誤刪操做,對tb2進行全表update
五、查看當前binlog文件名稱【此時建議刷新下binlog---> flush logs】,此次的update一樣也記錄到binlog中。我此次測試沒有刷新binlog,若刷新了binlog,則對應的操做應該在上一個binlog文件內。
此時咱們進行數據恢復
、、、
恢復思路:從全庫備份中恢復test庫,在利用binlog進行數據的增量恢復。
、、、3d
一、全備中恢復指定庫
從 mysqldump 全備中恢復指定庫,使用--one-database 簡寫-o的參數,極大地方便了咱們恢復數據的靈活性
mysql -uroot -pTcdn@2007 -o test < all.sql日誌
查看數據已經恢復到使用mysqldump備份前的狀態了。
二、在使用binlog進行增量備份,恢復七、八、9字段的數據
登陸數據,查看binlog的events
code
咱們看到在position位置爲2304的時候進行了update操做,所以咱們從start-position=123到stop-position=2132這段時間恢復,即跳過update操做。把mysqldump到產生binlog的這段時間全部的操做在回放以便。
使用mysqlbinlog 指定起始pos和結束pos進行恢復。cdn
這樣咱們就把數據恢復了。blog
2、如今咱們在測試使用mysqldump進行單庫備份+binlog增量備份進行數據測試。
一、首先和前面同樣,建立兩個表tb一、tb2
二、而後咱們在進行單庫備份
這樣咱們就有了這樣一個針對test庫的一個備份(和生產環境備份策略一致)
三、一樣咱們進行數據插入和全表update操做。
此時模擬誤刪操做了,而且此時咱們刷新下binlog(緣由爲將誤刪操做截止到這個binlog,以便咱們查找信息)
四、下面咱們恢復數據。
此時看到已經恢復了部分數據,這是基於mysqldump的備份恢復的。
下來咱們在利用binlog日誌進行數據恢復
五、登陸數據庫內,查看binlog的events
咱們看到在position位置爲7485的時候進行了update操做,所以咱們從start-position=123到stop-position=7313這段時間恢復,即跳過update操做。把mysqldump到產生binlog的這段時間全部的操做在回放以便。
使用mysqlbinlog 指定起始pos和結束pos進行恢復。
此時數據已經所有恢復了。
3、以上使用mysqldump備份數據的時候咱們都是備份的全庫或者單庫的。而在實際的生產環境中咱們通常也是這兩種方式進行備份,我理解就是備份的比較粗略。沒有細化到表。
可是通常咱們誤刪的操做基本都是針對表或表裏面的字段進行操做的。
所以我這邊測試下了,備份的時候使用備份單庫,可是恢復的時候把有問題的表從庫中抽出來,而後在恢復。最後結合binlog進行數據還原。
一、首先test庫內有兩張表tb一、tb2
二、此時咱們進行單庫備份,即備份數據庫test
三、在tb2表內插入數據,並進行數據誤刪操做(全表update)
此時刷新binlog
四、此時恢復咱們先從單庫備份test.sql中把tb2這張表抽出來。使用sed -n便可
sed -n -e '/Table structure for table tb2
/,/UNLOCK TABLES/p' test.sql > tb2_$(date +%F).sql
而後咱們在進行恢復(和前面同樣的方式,只是後面的數據文件換了)
五、此時咱們在使用binlog這種方式進行增量恢復,進入到數據庫內查看binlog的events。
mysql> show binlog events in "mysql-bin.000010";
咱們看到在position位置爲16556的時候進行了update操做,所以咱們從start-position=123到stop-position=16384這段時間恢復,即跳過update操做。把mysqldump到產生binlog的這段時間全部的操做在回放以便。
使用mysqlbinlog 指定起始pos和結束pos進行恢復。
此時數據已經恢復了。
總結
數據庫備份使用mysqldump+binlog的這種放手進行全量+增量的方式備份操做。
不管使用mysqldump的方式進行全庫、單庫、單表(此類型未測試,但感受能夠)備份。都能恢復數據庫。在加上binlog這種增量的備份進行增量還原便可完成數據庫的遷移,即出現誤操做的時候可使用這種方式嘗試進行恢復。