Mysql閃回工具之binlog2sql的原理及其使用

?

生產上誤刪數據、誤改數據的現象也是時常發生的現象,作為運維這時候就需要出來補鍋了,最開始的做法是恢復備份,然后從中找到需要的數據再進行修復,但是這個時間太長了,對于大表少數數據的修復來講,動作太大,成本也大。

當然還有其他的一些操作方法,我們今天有主角。

?

MySQL 閃回工具 --?? binlog2sql

用途

  • 數據回滾
  • 主從切換后數據不一致的修復
  • 從 binlog 生成標準 SQL,帶來的衍生功能

?

閃回原理簡析

開始之前,先說說閃回。我們都知道 MySQL binlog 以 event 為單位,記錄數據庫的變更信息,這些信息能夠幫助我們重現這之間的所有變化,也就是所謂的閃回。

binlog 有三種可選的格式:

  • statement:基于 SQL 語句的模式,binlog 數據量小,但是某些語句和函數在復制過程可能導致數據不一致甚至出錯;
  • mixed:混合模式,根據語句來選用是 statement 還是 row 模式;
  • row:基于行的模式,記錄的是行的完整變化。安全,但 binlog 會比其他兩種模式大很多;

利用 binlog 做閃回,需要將 binlog 格式設置為 row,因為我們需要最詳盡的信息來確定操作之后數據不會出錯。

既然 binlog 以 event 形式記錄了所有的變更信息,那么我們把需要回滾的 event,從后往前回滾回去即可。

回滾操作:對于 delete 操作,我們從 binlog 提取出 delete 信息,反向生成 insert 回滾語句;
對于 insert 操作,反向生成 delete 回滾語句;
對于 update 操作,根據信息生成反向的 update 語句;

?

竟然這么厲害??

?

來實例演習下

主要測試 DML,也就是 delete、update、insert 等操作的閃回效果。

但是,DDL 語句,比如drop,truncate 在整個使用中都是無法被回滾的,這種情況,只能用最近的備份數據+二進制日志恢復

本次實驗,更改一條數據,并刪除一條數據,然后從解析 binlog 信息,到使用 binlog2sql 工具來生成標準和回滾 SQL,來剖析整個運行過程。

?

一、準備工作

1.確定版本信息和binlog格式

? mysql版本:5.7.12

?

? ?查看binlog格式的命令

mysql> show variables like 'binlog_format';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+

?

2.安裝binlog2sql工具? ? ?#(隨便安裝在合適的服務器即可,比如我在內網15安裝了一個)

? ?安裝參考鏈接:http://note.youdao.com/noteshare?id=85a90269a21d877962bfce0dfa40a90b&sub=71CD3E637F534AA1AFF129563F6A064E

?

3.在mysql的主服務器上,創建閃回操作賬號的權限?

mysql>   GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'glon'@'%'  identified by '123456';
mysql
> show grants for 'glon'@'%'; +--------------------------------------------------------------------------+ | Grants for glon@% | +--------------------------------------------------------------------------+ | GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'glon'@'%' | +--------------------------------------------------------------------------+ 1 row in set (0.00 sec)

?

?

4.初始化數據? ??

CREATE TABLE `edai_binlog2sql` (`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`create_time` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8insert into edai_binlog2sql (name,create_time) values ('Glon Ho','2012-10-1'),('Eason Chan', '2016-05-02'),('Jacky Cheung', '2015-05-02');mysql> select * from edai_binlog2sql;
+----+--------------+---------------------+
| id | name | create_time |
+----+--------------+---------------------+
| 4 | Glon Ho | 2012-10-01 00:00:00 |
| 5 | Eason Chan | 2016-05-02 00:00:00 |
| 6 | Jacky Cheung | 2015-05-02 00:00:00 |
+----+--------------+---------------------+
3 rows in set (0.00 sec)

?

  • 進行 update 和 delete 操作
mysql> update edai_binlog2sql set create_time = '2017-05-12' where name = 'Glon Ho';
Query OK, 1 row affected (0.05 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from edai_binlog2sql;
+----+--------------+---------------------+
| id | name | create_time |
+----+--------------+---------------------+
| 4 | Glon Ho | 2017-05-12 00:00:00 |
| 5 | Eason Chan | 2016-05-02 00:00:00 |
| 6 | Jacky Cheung | 2015-05-02 00:00:00 |
+----+--------------+---------------------+
3 rows in set (0.00 sec)mysql> delete from edai_binlog2sql where name = 'Jacky Cheung';
Query OK, 1 row affected (0.09 sec)mysql> select * from edai_binlog2sql;
+----+------------+---------------------+
| id | name | create_time |
+----+------------+---------------------+
| 4 | Glon Ho | 2017-05-12 00:00:00 |
| 5 | Eason Chan | 2016-05-02 00:00:00 |
+----+------------+---------------------+
2 rows in set (0.00 sec)


操作時候,Glon Ho 的時間改變了,而 Jacky Cheung 也被刪除了。

我們來看下mysql的binlog文件位置

mysql> show master status;

+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 6159854 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

?

?

好的,接下來使用binlog2sql工具? ?#這個工具我們安裝在15服務器上的,我們去15上操作

1)解析出標準的SQL

python binlog2sql.py -h192.168.1.21 -P30136 -uglon -p'123456' -d xcrm -t edai_binlog2sql? --start-file=mysql-bin.000001 > edai_binlog2sql.sql

參數解釋:
-h:數據庫服務地址
-u:連接用戶名 -p:密碼
-P:端口
-d:數據庫名 -t:表名
?--start-file: 通俗的來講就是,要解析sql的所在的binglog文件
--flashback: 閃回,逆向解析sql語句

?

cat?edai_binlog2sql.sql

?

?

可以看到,幾乎完美重現了我們上面執行過的 SQL,而且生成的每個 SQL 后面都帶有該語句在 binlog 中的 position 信息和該語句的執行時間

?

2)解析想要回滾的SQL

比如,我想回滾剛剛操作的,edai_binlog2sql 后面兩個update和DELETE操作

找到的時間節點就是:start 6159262? ?end 6159823? ? #分析最好用pos分析,這個可以更準確的定位到想要的

?python binlog2sql.py? --flashback? -h192.168.1.21 -P30136 -uglon -p'123456' -dxcrm -tedai_binlog2sql --start-file=mysql-bin.000001 --start-position=6159262? ? --stop-pos=6159823 > edai_binlog2sql-new.sql?

?

[root@soft binlog2sql]# cat edai_binlog2sql-new.sql 
INSERT INTO `xcrm`.`edai_binlog2sql`(`create_time`, `id`, `name`) VALUES ('2015-05-02 00:00:00', 6, 'Jacky Cheung'); #start 6159565 end 6159823 time 2018-11-22 15:16:30
UPDATE `xcrm`.`edai_binlog2sql` SET `create_time`='2012-10-01 00:00:00', `id`=4, `name`='Glon Ho' WHERE `create_time`='2017-05-12 00:00:00' AND `id`=4 AND `name`='Glon Ho' LIMIT 1; #start 6159262 end 6159534 time 2018-11-22 15:15:46

?

可以看到,我們剛剛的delete語句,被反轉為insert語句,update 修改為原來的時間

拿到了具體的恢復語句

那我們拿去數據庫執行吧

?

好了,完美搞定?

?

轉載于:https://www.cnblogs.com/tianfen/p/10001807.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537466.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537466.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537466.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

禪道11.0windows本機安裝

為了驗證禪道的某個功能,需要用到生產上的數據,又不能在生產上進行。只能在本地搭建一套禪道,還原生產的數據到本地。 1.下載禪道 生產上用的是禪道11.0,數據庫是11.0版本的數據庫,為了更好兼容,下載禪道…

createtrackbar函數_【3】OpenCV圖像處理模塊(10)inRange函數實現閾值化,HSV圖像分割...

本節使用inRange函數來實現閾值化。跟前面的閾值化方法一樣,只不過在實現時用閾值范圍來替代固定閾值。本節還提供了一種物體檢測的手段,用基于像素值范圍的方法,在HSV色彩空間檢測物體。HSV色彩空間HSV(hue,saturatio…

PPT取消自動播放

選中PPT頁面,點擊“切換”,檢查下“設置自動換片時間”,如果勾選了,則去掉。

軟件研發成本估算過程之估算軟件規模概述

通常情況下,規模估算是軟件成本估算過程的起點。估算規模是后續計算軟件項目的工作量、成本和進度的主要輸入,是項目范圍管理的關鍵,因此,在條件允許的情況下,應進行規模估算。在規模估算過程中,需要注意以…

自動駕駛芯片_盤點全球自動駕駛芯片“戰場”參與者

據了解,目前出貨量最大的駕駛輔助芯片廠商Mobileye、Nvidia形成“雙雄爭霸”局面,Xilinx則在FPGA的路線上進軍,Google、地平線、寒武紀向專用領域AI芯片發力,國內四維圖新、全志科技、森國科(國科微)在自動駕駛芯片領域積極布局。…

word文檔頁碼不連續怎么弄

頁碼不連續是因為在不連續頁碼的兩頁之間有分隔符。 第一步:搜索分節符 第二步:看頁碼與頁面是否一致 wps的左下角 如果不一致,則第三步 第三步:設置頁碼:“繼續上一頁編碼”

看完動畫你還敢說不會 快速排序

前言 由于LeetCode上的算法題很多涉及到一些基礎的數據結構,為了更好的理解后續更新的一些復雜題目的動畫,推出一個新系列 -----《圖解數據結構》,主要使用動畫來描述常見的數據結構和算法。本系列包括十大排序、堆、隊列、樹、并查集、圖等等…

java多張圖片合成一張_1分鐘學會“全景照片”拍攝技巧,從單反拍攝到PS合成,收藏備用...

作為一名攝影愛好者,您知道如何才能快速拍出一張全景照片,同時保證高畫質和照片不畸變?比如下面的2張圖片:要想得到這樣的全景照片,千萬不要通過后期裁剪,否則清晰度肯定會大打折扣!其實&#x…

Chrome查看cookie

不同版本的Chrome查看cookie的入口位置不同,這里介紹個通用的方法。 1.進入設置頁 2.搜索cookie 3.進入“cookie....”,選擇“查看所有......”

console 速查手冊

// 用于輸出一個 js 對象列表* console.log(obj1 [, obj2, ..., objN); // // 一個 js 字符串,其中包含0或多個不同類型的替代字符串 // console.log(String: %s, Int: %d,Float: %f, Object: %o, str, ints, // floats, obj) // // 也支持模板字符串 // console.lo…

nginx 帶寬_Nginx的Gzip功能

程序員自由之路 | 作者urlify.cn/eyuUVr | 來源什么是HTTP壓縮有時候客戶端和服務器之間會傳輸比較大的報文數據,這時候就占用較大的網絡帶寬和時長。為了節省帶寬,加速報文的響應速速,可以將傳輸的報文數據先進行壓縮,然后再進行…

分享朋友圈QQ空間需要哪些參數

shareTitle(分享標題 , shareDes(分享描述 , shareImg(分享圖片地址, shareUrl(分享地址, shareType(分享類型,微信朋友:WEIXIN、微信朋友圈:WEIXIN_CIRCLE、QQ:QQ)

【今日頭條】【抖音火山】前端開發實習生

今日頭條成立于2012年,致力于成為最懂你的信息平臺,連接人與信息,促進內容的創作和交流。通過技術,來改變整個內容生產、消費領域。 5年的時間內,我們已經成為了一個估值過百億美元,用戶數億,DA…

程序員真的是吃青春飯的嗎?(獻給即將進入職場的程序員們)

又有學生問我:程序員真的是吃青春飯的嗎?我是不是做到三十歲就該考慮轉型了? 我告訴他們: 這是中國的記者們用統計數字造下的一個彌天大謊,當我們看到微軟集團內的許多白發程序員在兢兢業業地工作的時候,我…

這一年多來,阿里Blink測試體系如何從0走向成熟?

2019獨角獸企業重金招聘Python工程師標準>>> 摘要: 引言 Apache Flink是面向數據流處理和批處理的分布式開源計算框架,2016年阿里巴巴引入Flink框架,改造為Blink。2017年,阿里整合了所有流計算產品,決定以B…

numpy中一些常見計算

文章目錄 numpy中的一些常見計算代碼方差標準差參考文獻numpy中的一些常見計算 代碼 import numpy as np from scipy import stats# 示例數據 data = np.array([1, 2,

system函數_自學C++基礎教程【函數】

函數的概念一個函數由:函數的返回值類型、函數名、參數表、函數體 這4個部分組成。int Add( int _a , int _b ) {return _a _b; }該函數 Add 完成對兩個整型數據的求和功能。函數的調用方式: 函數名(參數表);…

寧波政務云資源的介紹與申請

介紹 如圖所示: 寧波政務云分公共服務區與資源共享區。 公共服務區 公共服務區,一般部署允許互聯網訪問的系統,數據不敏感,不重要的,可對外開發的系統。 該區允許互聯網訪問,不允許訪問資源共享區&…

redis查數據

1 連接服務 12345[rootredis1-20 ~]# telnet 127.0.0.1 6380Trying 127.0.0.1...Connected to 127.0.0.1.Escape character is ^].#用telnet也能登錄,但是無法查看key的value12[rootredis1-20 src]# ./redis-cli -p 6380#redis可能有好幾個服務,要指定端…

python幫助文檔在哪_python文檔在哪里

對于Python中一些不清楚的模塊,可以通過文檔學習如何使用,但是python文檔在哪里呢?這個問題我們可以使用Python命令進行查看。方法一 在python命令行輸入以下內容help(time) # 很詳細的模塊文檔 help(time.localtime()) # 很詳細的函數文檔 h…