MySQL備份策略:全備+增量備份主要包括以下幾個步驟:
1、開啓BINLOG服務
2、使用MYSQLDUMP對數據庫進行完全備份
3、使用flush logs指令刷新創建新的2進制日誌
4、使用mysqlbinlog logs-bin.[0-9]* |mysql進行增量備份的恢復
一般的,假設我們週日下午3點進行了完全備份並生成備份文件full_backup_20170215.sql,周1周2中午1點進行了兩次增量備份,
分別生成增量備份文件mysql-bin.000018,mysql-bin.000019,周3上午10點數據庫發生奔潰,需要進行數據恢復,此時正在記錄的
2進制日誌爲mysql-bin.000020,需要恢復其中記錄的操作,具體爲:
1、恢復全備
2、恢復BINLOG(備份後的BINLOG文件:mysql-bin.000018,mysql-bin.000019,mysql-bin.000020)
##binlog文件可以導成SQL文件或者直接用/usr/local/mysql/bin/mysqlbinlog mysql-bin.000018,mysql-bin.000019,mysql-bin.000020|mysql
這樣導入也是可以的,導成SQL文件,不需要加任何參數mysqlbinlog mysql-bin.000020>a20.sql
全備+增量備份
週日全備,周1、2、3是增量,周3刪除數據,周4、5、6繼續增量,還原周3誤刪除的數據:
1、還原全備
2、還原增備(1,2,4,5,6)
3、對周3的BINLOG 文件導成SQL文件,找到刪除的數據行前加#號,然後在還原周3的增量
全局替換sed -i "s/delete/#delete/g" aa17.sql, 基於binlog_format=mixed
################################################
對於在row模式下,誤刪除某些數據,要立刻還原的操作
基於row模式的binlog,生成DML(insert/update/delete)的rollback語句
通過mysqlbinlog -v 解析binlog生成可讀的sql文件
提取需要處理的有效sql
"### "開頭的行.如果輸入的start-position位於某個event group中間,則會導致"無法識別event"錯誤
將INSERT/UPDATE/DELETE 的sql反轉,並且1個完整sql只能佔1行
INSERT: INSERT INTO => DELETE FROM, SET => WHERE
UPDATE: WHERE => SET, SET => WHERE
DELETE: DELETE FROM => INSERT INTO, WHERE => SET
用列名替換位置@{1,2,3}
通過desc table獲得列順序及對應的列名
特殊列類型value做特別處理
逆序
注意:
表結構與現在的表結構必須相同[謹記]
由於row模式是冪等的,並且恢復是一次性,所以只提取sql,不提取BEGIN/COMMIT
只能對INSERT/UPDATE/DELETE進行處理
代碼作者不詳,能用就好o(∩_∩)o :
使用過程簡單:
1、添加連接數據庫的用戶名和密碼
2、在/usr/bin目錄下不要有其他版本的mysqlbinlog文件,和當前版本統一
3、執行腳本 perl binlog_rollback.pl -f './mysql-bin.000020' -i -o '/tmp/t.sql' -u 'dlan' -p 'root123'
4、代碼包下載 http://down.51cto.com/data/2287584