MySQL通過binlog進行數據恢復

採用binlog恢復數據的兩種情況

1.數據庫丟失或者drop

    1)恢復系統自動備份

    2)用binlog恢復系統備份時間到此刻的的數據(drop操作需要binlog刪除drop記錄)

2.誤操作update,delete

    1)恢復系統自動備份

    2)在binlog日誌中刪除誤操作的操作語句,執行binlog恢復其他的數據
或者
在binlog中找到誤操作的記錄,用腳本回滾生成sql,進行恢復 一般用 mysqlbinlog_flushback,binlog2sql
一般誤操作之後把數據庫設置成鎖表只讀

這個時候記得趕緊加一個全局讀鎖,防止有新的寫入發生 flush tables with read lock;

mysqlbinlog_flushback使用限制

1.支持mysql版本爲MySQL 5.5 and 5.6.因爲底層使用的是python-mysql-replication包。
2.數據庫必須是row格式的。
3.反向生成的表必須有主鍵。
4.日誌必須在主庫存在
5.反向生成的mysql數據類型列出在下面。沒有列出的類型沒有經過嚴格的測試,也許有問題
6.支持的類型
        允許解析的字段類型,不在裏面的會報錯
  
ALLOW_TYPE={ "varchar":True, "char":True, "datetime":True, "date":True, "time":True, "timestamp":True, "bigint":True, "mediumint":True, "smallint":True, "tinyint":True, "int":True, "smallint":True, "decimal":True, "float":True, "double":True, "longtext":True, "tinytext":True, "text":True, "mediumtext":True }

數據恢復的操作過程和步驟

設置多實力的配置參數
server-id = 1  (在用到flushback.py時必須是主從複製)
socket=/mysql/server/mysql/mysql1.sock
port=3306
pid-file=/mysql/server/mysql/mysql1.pid
datadir=/mysqldata/data1
log-bin = mysql1-bin(生成的binlog名)
log-bin-index = mysql1-bin.index(記錄binlog日誌文件夾)
binlog_cache_size=1200K
binlog_format = ROW(binlog的生成模式statement(SBR) ROW MIXED)
wait_timeout=2880000
interactive_timeout = 2880000
max_allowed_packet = 256M(一個sql最大的長度)

一丶數據庫丟失

1.創建數據庫 
create database kuaiyun

2.找到系統的自動備份  kuaiyun.sql

3.導入數據庫備份數據

mysql -h127.0.0.1 -P3306 -uroot -p kuaiyun < kuaiyun.sql

備份數據庫

/mysql/server/mysql/bin/mysqldump -h127.0.0.1 -P3306 -uroot -p jingan >/root/jingan.sql

查看binlog文件  找到時間和位點 (儘量用位點)

 mysqlbinlog --base64-output=decode-rows -v mysql1-bin.000004(解碼,在查看位點的是解碼,在導入binlog數據時不解碼)

4.在binlog文件中找到系統自動備份時間節點,比如時間是2017-07-12 03:30:00 或者節點數999

mysqlbinlog --start-datetime="2017-07-12 03:30:00" ./mysql-bin.000001 |mysql -h127.0.0.1 -P3306 -uroot -p kuaiyun

mysqlbinlog --start-position=999 ./mysql-bin.000001 |mysql -h127.0.0.1 -P3306 -uroot -p kuaiyun

二丶誤操作drop數據庫

方法可以和數據庫丟失一樣,但是要找到執行drop的位點,排除drop的操作或者通過flushback或者binlog2sql恢復drop的文件

用mysqlbinlog_flushback恢復drop的文件

1.下載flushback包
   1 ). 下載地址
    https://github.com/58daojia-dba/mysqlbinlog_flashback
    基於binlog恢復工具mysqlbinlog_flashback
  2 ).簡介
    mysqlbinlog_back.py 是在線讀取row格式的mysqld的binlog,然後生成反向的sql語句的工具。
    一般用於數據恢復的目的。 所謂反向的sql語句就是如果是insert,則反向的sql爲delete。
    如果delete,反向的sql是insert,如果是update, 反向的sql還是update,但是update的值是原來的值。
 3 ).這個項目需要安裝
    python-pip
    pip install pymysql
    安裝pip
    安裝pip,最新版本爲1.4 這裏以1.3版本爲例
wget http://pypi.python.org/packages/source/p/pip/pip-1.3.tar.gz
    tar zxvf pip-1.3.tar.gz
    cd pip-1.3
    python setup.py install
或者使用pip的安裝腳本get-pip.py
    
wget https://raw.github.com/pypa/pip/master/contrib/get-pip.py
python get-pip.py
2.利用腳本生成回滾sql
   
 python mysqlbinlog_back.py --help 看在線的幫助
    python mysqlbinlog_back.py --host="127.0.0.1" --port=3306 --username="root" --password="" --schema=local_world -- tables="area_template" -S "mysql1-bin.000002" -L "2000"
3.生成的sql文件在./log目錄下
    flashback_local_world_20170713_141202.sql
4.把生成的sql文件導入進數據庫,相當於數據庫的所有sql
    1)創建同名數據庫  create dtaabase local_world;
    2)mysql -h127.0.0.1 -P3306 -uroot -p kuaiyun < flashback_local_world_20170713_141202.sql
完成
誤操作update,delete
利用備份+binlog恢復
1.和drop的一樣但是一定要在binlog中排除掉update和delete操作,找準位點
***利用工具生成sql
不用創建數據庫,和drop操作一樣

三丶其他---binlog2sql的使用

用途
    數據回滾
    1 ) .主從切換後數據不一致的修復
    2 ) .從binlog生成標準SQL,帶來的衍生功能

安裝
$ git clone https://github.com/danfengcao/binlog2sql.git
$ pip install -r requirements.txt
基本用法
解析出標準SQL
$ python binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' -d dbname -t table1 table2 --start-file='mysql-bin.000002' --start-pos=1240
輸出:
INSERT INTO d(`did`, `updateTime`, `uid`) VALUES (18, '2016-12-07 14:01:14', 4);
INSERT INTO c(`id`, `name`) VALUES (0, 'b');
UPDATE d SET `did`=17, `updateTime`='2016-12-07 14:01:14', `uid`=4 WHERE `did`=18 AND `updateTime`='2016-12-07 14:01:14' AND `uid`=4 LIMIT 1;
DELETE FROM c WHERE `id`=0 AND `name`='b' LIMIT 1;
解析出回滾SQL
$ python binlog2sql.py --flashback -h127.0.0.1 -P3306 -uadmin -p'admin' -d dbname -t table1 table2 --start-file='mysql-bin.000002' --start-pos=1240
輸出:
INSERT INTO c(`id`, `name`) VALUES (0, 'b');
UPDATE d SET `did`=18, `updateTime`='2016-12-07 14:01:14', `uid`=4 WHERE `did`=17 AND `updateTime`='2016-12-07 14:01:14' AND `uid`=4 LIMIT 1;
DELETE FROM c WHERE `id`=0 AND `name`='b' LIMIT 1;
DELETE FROM d WHERE `did`=18 AND `updateTime`='2016-12-07 14:01:14' AND `uid`=4 LIMIT 1;
具體參數用法

python binlog2sql.py --help

參考相關文檔
http://blog.csdn.net/jerry____wang/article/details/56285859   基於binlog恢復工具mysqlbinlog_flashback
http://www.cnblogs.com/martinzhang/p/3454358.html MySQL的binlog日誌
http://blog.csdn.net/lxpbs8851/article/details/39316589 mysqlbinlog 查看執行的sql (row模式)
https://www.ilanni.com/?p=7911 爛泥:通過binlog恢復mysql數據庫
https://yq.aliyun.com/articles/43163 學習mysql的binlog配置 
http://www.cnblogs.com/langtianya/p/5504774.html mysql中binlog_format模式與配置詳解
http://www.linuxidc.com/Linux/2014-11/108811.htm CentOS/Ubuntu下安裝Python-Pip和Fabric
https://github.com/58daojia-dba/mysqlbinlog_flashback 源碼社區
http://www.cnblogs.com/liujingyuan789/p/6674756.html binlog2sql 實戰心得
http://blog.csdn.net/shudaqi2010/article/details/54412895 原創工具binlog2sql:從MySQL binlog得到你要的SQL
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章