最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL使用binlog2sql工具實(shí)現(xiàn)在線恢復(fù)數(shù)據(jù)功能

 更新時間:2025年03月21日 11:05:51   作者:夢想歌  
binlog2sql 是大眾點(diǎn)評開源的一款用于解析 MySQL binlog 的工具,根據(jù)不同選項(xiàng),可以得到原始SQL、回滾SQL等,下面我們就來看看如何使用binlog2sql實(shí)現(xiàn)在線恢復(fù)數(shù)據(jù)功能吧

背景

生產(chǎn)數(shù)據(jù)庫執(zhí)行 SQL 腳本,一般會經(jīng)過正規(guī)的審批流程才能運(yùn)行。但有些情況是例外的,業(yè)務(wù)部門在提出一些刪除數(shù)據(jù)的需求后打算撤回,或者在運(yùn)營后臺不小心刪除了一些數(shù)據(jù),然后找到 DBA 團(tuán)隊(duì)協(xié)助,希望能恢復(fù)數(shù)據(jù)。

經(jīng)調(diào)研,binlog2sql 是大眾點(diǎn)評開源的一款用于解析 MySQL binlog 的工具,根據(jù)不同選項(xiàng),可以得到原始SQL、回滾SQL、去除主鍵的INSERT SQL 等,適用于數(shù)據(jù)快速回滾(閃回)和主從切換后新 Master 丟數(shù)據(jù)的修復(fù)工作。

目標(biāo)

驗(yàn)證 binlog2sql 工具是否可以快速恢復(fù)數(shù)據(jù)。

步驟

準(zhǔn)備工作

安裝 binlog2sql 工具。

> git clone https://github.com/danfengcao/binlog2sql.git && cd binlog2sql

# > yum install python3-pip
# > whereis pip
# > pip3.6 install -r requirements.txt
> pip install -r requirements.txt

MySQL 服務(wù)端配置以下參數(shù),請注意,binlog2sql 僅支持 row 格式。

[mysqld]
server_id = 1
log_bin = /var/log/mysql/mysql-bin.log
max_binlog_size = 1G
binlog_format = row
binlog_row_image = full

指定執(zhí)行腳本的數(shù)據(jù)庫用戶授權(quán)。

-- SELECT 權(quán)限:查詢 information_schema.COLUMNS
-- REPLICATION SLAVE:通過 BINLOG_DUMP 協(xié)議獲取 binlog 內(nèi)容
-- REPLICATION CLIENT:執(zhí)行 SHOW MASTER STATUS 獲取 binlog 信息
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO user

準(zhǔn)備一張用戶表 user,并填充 1W 條數(shù)據(jù)。

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) DEFAULT NULL,
  `gmt_create` date DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4

DELIMITER $$

CREATE PROCEDURE InsertRandomData()
BEGIN
    DECLARE i INT DEFAULT 1;
    DECLARE randomName CHAR(10);
    DECLARE randomDate DATE;

    WHILE i <= 10000 DO
        -- 生成隨機(jī) name (隨機(jī)字符串)
        SET randomName = CONCAT(
            CHAR(FLOOR(RAND() * 26) + 65), 
            CHAR(FLOOR(RAND() * 26) + 65), 
            CHAR(FLOOR(RAND() * 26) + 65), 
            CHAR(FLOOR(RAND() * 26) + 65), 
            CHAR(FLOOR(RAND() * 26) + 65)
        );

        -- 生成隨機(jī)日期 (2013-11-11 起始,隨機(jī)范圍約為一年內(nèi))
        SET randomDate = DATE_ADD('2023-01-01', INTERVAL FLOOR(RAND() * 365) DAY);

        -- 插入數(shù)據(jù)
        INSERT INTO `user` (`name`, `gmt_create`) VALUES (randomName, randomDate);

        SET i = i + 1;
    END WHILE;
END$$

DELIMITER ;

-- 調(diào)用存儲過程
CALL InsertRandomData();

查看大于 11 月份的數(shù)據(jù)總數(shù),共 363 條。

mysql > SELECT count(*) FROM user WHERE gmt_create > '2023-11-01 00:00:00';

+----------+
| count(*) |
+----------+
|      363 |
+----------+

模擬誤刪除,假設(shè)在 15:30 左右刪除了 11 月份之后的數(shù)據(jù)。

mysql > DELETE FROM user WHERE gmt_create > '2023-11-01 00:00:00';

恢復(fù)數(shù)據(jù)

查看主庫 binlog 狀態(tài),最新的文件為 mysql-bin.000003。

-- 低版本使用 SHOW MASTER STATUS;
mysql > SHOW BINARY LOGS;
+------------------+-----------+-----------+
| Log_name         | File_size | Encrypted |
+------------------+-----------+-----------+
| mysql-bin.000001 |      1871 | No        |
| mysql-bin.000002 |       181 | No        |
| mysql-bin.000003 |    917878 | No        |
+------------------+-----------+-----------+
3 rows in set (0.04 sec)

篩選出需要回滾的SQL,誤操作人一般知道大致的誤操作時間,我們首先根據(jù)時間做一次過濾。

shell> python binlog2sql/binlog2sql.py -h地址 -P端口 -u用戶 -p'密碼' -d庫民 -t表名 --start-file='mysql-bin.000003' --start-datetime='2023-11-02 15:00:00' --stop-datetime='2023-11-02 16:00:00' > /tmp/raw.sql

raw.sql輸出:
DELETE FROM `test`.`user` WHERE `gmt_create`='2023-11-01 00:00:00' AND `id`=1351 AND `name`='TPUDJ' LIMIT 1; #start 105311 end 262311 time 2023-11-02 15:31:10
DELETE FROM `test`.`user` WHERE `gmt_create`='2023-11-01 00:00:00' AND `id`=1352 AND `name`='YKIIS' LIMIT 1; #start 105311 end 262311 time 2023-11-02 15:31:10
...
DELETE FROM `test`.`user` WHERE `gmt_create`='2023-12-31 00:00:00' AND `id`=1714 AND `name`='SHKBC' LIMIT 1; #start 105311 end 265754 time 2023-11-02 15:31:10

根據(jù) raw.sql 的位置信息,可以判斷誤操作的 SQL 來自同一個事務(wù),準(zhǔn)確位置在 105311-265754 之間,根據(jù)位置過濾,使用 -B 選項(xiàng)生成回滾 SQL。

shell> python binlog2sql/binlog2sql.py -h地址 -P端口 -u用戶 -p'密碼' -d庫民 -t表名 --start-file='mysql-bin.000003' --start-position=105311 --stop-position=265754 -B > /tmp/rollback.sql

rollback.sql輸出:
INSERT INTO `test`.`user`(`gmt_create`, `id`, `name`) VALUES ('2023-11-01 00:00:00', 1351, 'TPUDJ'); #start 105311 end 262311 time 2023-11-02 15:31:10
INSERT INTO `test`.`user`(`gmt_create`, `id`, `name`) VALUES ('2023-11-01 00:00:00', 1352, 'YKIIS'); #start 105311 end 262311 time 2023-11-02 15:31:10
...
INSERT INTO `test`.`user`(`gmt_create`, `id`, `name`) VALUES ('2023-12-31 00:00:00', 1714, 'SHKBC'); #start 105311 end 265754 time 2023-11-02 15:31:10

結(jié)果驗(yàn)證

確認(rèn)回滾 SQL 總行數(shù)是否對應(yīng)誤刪除的 363 條。

shell> wc -l /tmp/rollback.sql

363 /tmp/rollback.sql

與業(yè)務(wù)方確認(rèn)回滾 SQL 沒問題,執(zhí)行回滾語句。登錄 MySQL,確認(rèn)回滾成功。

shell> mysql -h地址 -P端口 -u用戶 -p'密碼' < /tmp/rollback.sql

mysql> SELECT count(*) FROM user WHERE gmt_create > '2023-11-01 00:00:00';
+----------+
| count(*) |
+----------+
|    363   |
+----------+

結(jié)論

binlog2sql 適用于在線恢復(fù)誤操作的數(shù)據(jù),但不適用于以下情況:

  • 數(shù)據(jù)恢復(fù)建議控制在 50W 以內(nèi),數(shù)據(jù)量越大,逆向生成的語句越多,超過這個數(shù)值,恢復(fù)時間可能會超過 15 分鐘。
  • 不支持 DDL 恢復(fù)操作。因?yàn)榧词乖?row 模式下,binlog對于 DDL 操作不會記錄每行數(shù)據(jù)的變化。要實(shí)現(xiàn) DDL 快速回滾,必須修改 MySQL 源碼,使得在執(zhí)行 DDL 前先備份老數(shù)據(jù)。阿里林曉斌團(tuán)隊(duì)提交了 patch 給 MySQL 官方,相關(guān)實(shí)現(xiàn)方案可以查閱 MySQL閃回方案討論及實(shí)現(xiàn)
  • 根據(jù)官方說法,在線召回數(shù)據(jù)推薦使用 binlog2sql 工具,離線解析使用 mysqlbinlog 工具,MySQL 閃回特性最早由阿里彭立勛開發(fā)。

到此這篇關(guān)于MySQL使用binlog2sql工具實(shí)現(xiàn)在線恢復(fù)數(shù)據(jù)功能的文章就介紹到這了,更多相關(guān)MySQL binlog2sql恢復(fù)數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SQL刪除重復(fù)數(shù)據(jù)的實(shí)例教程

    SQL刪除重復(fù)數(shù)據(jù)的實(shí)例教程

    在使用SQL提數(shù)的時候,常會遇到表內(nèi)有重復(fù)值的時候,下面這篇文章主要給大家介紹了關(guān)于SQL刪除重復(fù)數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • MySQL 審計級別配置實(shí)現(xiàn)步驟

    MySQL 審計級別配置實(shí)現(xiàn)步驟

    本文主要介紹了MySQL 審計級別配置,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-03-03
  • Mysql實(shí)現(xiàn)模糊查詢的兩種方式(like子句?、正則表達(dá)式)

    Mysql實(shí)現(xiàn)模糊查詢的兩種方式(like子句?、正則表達(dá)式)

    通配符是一種特殊語句,主要用來模糊查詢,下面這篇文章主要給大家介紹了關(guān)于給Mysql實(shí)現(xiàn)模糊查詢的兩種方式,分別是like子句?、正則表達(dá)式,需要的朋友可以參考下
    2022-09-09
  • 碰到MySQL無法啟動1067錯誤問題解決方法

    碰到MySQL無法啟動1067錯誤問題解決方法

    創(chuàng)建primay key過程中發(fā)生了斷電,當(dāng)電腦再次啟動時候,發(fā)現(xiàn)mysql 服務(wù)無法啟動,使用 net start 提示 1067錯誤;后來只能通過手工刪除數(shù)據(jù)文件,日志文件,再啟動服務(wù),然后導(dǎo)入數(shù)據(jù)來完成
    2013-01-01
  • Mysql字段為null的加減乘除運(yùn)算方式

    Mysql字段為null的加減乘除運(yùn)算方式

    這篇文章主要介紹了Mysql字段為null的加減乘除運(yùn)算方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • MySQL最常問的十道面試題(2023年最新詳解版)

    MySQL最常問的十道面試題(2023年最新詳解版)

    MySQL是一個關(guān)系型數(shù)據(jù)庫管理系統(tǒng),這是學(xué)習(xí)Java必學(xué)的知識點(diǎn),也是面試java崗位必考的題目,所以大家要有所重視,這篇文章主要給大家介紹了關(guān)于MySQL最常問的十道面試題,是2023年最新詳細(xì)整理的,需要的朋友可以參考下
    2023-10-10
  • MySQL實(shí)現(xiàn)免密登錄的三種配置方式

    MySQL實(shí)現(xiàn)免密登錄的三種配置方式

    我們登錄MySQL的時候有時候會忘記root密碼,這時我們需要免密登錄,所以這篇文章給大家介紹了MySQL免密登錄的三種方式,文章通過是示例代碼給出了詳細(xì)的配置方案,需要的朋友可以參考下
    2024-03-03
  • MySQL數(shù)據(jù)庫中如何查詢近一年的數(shù)據(jù)

    MySQL數(shù)據(jù)庫中如何查詢近一年的數(shù)據(jù)

    最近碰到一個需求是統(tǒng)計某張表的數(shù)據(jù),統(tǒng)計時間維度為近一年,下面這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫中如何查詢近一年的數(shù)據(jù)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • CentOs7安裝部署Sonar環(huán)境的詳細(xì)過程(JDK1.8+MySql5.7+sonarqube7.8)

    CentOs7安裝部署Sonar環(huán)境的詳細(xì)過程(JDK1.8+MySql5.7+sonarqube7.8)

    這篇文章主要介紹了CentOs7安裝部署Sonar環(huán)境(JDK1.8+MySql5.7+sonarqube7.8),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • windows server2014 安裝 Mysql Applying Security出錯的完美解決方法

    windows server2014 安裝 Mysql Applying Security出錯的完美解決方法

    這篇文章給大家介紹了windows server2014 安裝 Mysql Applying Security出錯的完美解決方法,造成這種問題的主要原因是因?yàn)榘惭b一遍之后沒有卸載干凈,要解決這個問題需要注意以下幾點(diǎn),具體解決方法,大家參考下本文
    2017-07-07

最新評論

东辽县| 平谷区| 陇西县| 威远县| 洪泽县| 修武县| 当雄县| 涡阳县| 呼图壁县| 抚顺市| 郧西县| 南溪县| 乐都县| 金平| 泾源县| 梁河县| 水富县| 临漳县| 安泽县| 石柱| 嘉黎县| 道孚县| 鄄城县| 长兴县| 晋城| 剑川县| 乐昌市| 安泽县| 理塘县| 五台县| 仁寿县| 通州市| 读书| 嘉鱼县| 穆棱市| 城市| 灌云县| 盐津县| 兴城市| 鱼台县| 芮城县|