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

MySQL數(shù)據(jù)變化監(jiān)聽的實現(xiàn)方案

 更新時間:2025年02月10日 10:33:31   作者:Huooya  
在高并發(fā)和大數(shù)據(jù)環(huán)境下,實時獲取MySQL數(shù)據(jù)庫的增量變化對數(shù)據(jù)同步、數(shù)據(jù)分析、緩存更新等場景至關重要,MySQL的binlog(Binary Log) 記錄了數(shù)據(jù)庫的所有變更,可以用來實現(xiàn) 增量數(shù)據(jù)監(jiān)聽,本文將介紹如何利用binlog監(jiān)聽MySQL數(shù)據(jù)增量,并提供基 Java的Canal實現(xiàn)示例

1. binlog 簡介

1.1 什么是 binlog?

binlog(Binary Log) 是 MySQL 記錄 DDL(數(shù)據(jù)定義語言,如 CREATE、ALTER)和 DML(數(shù)據(jù)操作語言,如 INSERTUPDATEDELETE)的日志文件,它用于:

  • 主從復制:MySQL 主庫將 binlog 傳輸?shù)綇膸?,實現(xiàn)數(shù)據(jù)同步。
  • 數(shù)據(jù)恢復:通過 mysqlbinlog 工具解析 binlog 恢復數(shù)據(jù)。
  • 數(shù)據(jù)同步:第三方工具(如 Canal)解析 binlog,進行數(shù)據(jù)同步。

1.2 binlog 的三種格式

binlog 格式說明
STATEMENT記錄 SQL 語句本身
ROW記錄行數(shù)據(jù)變更(推薦)
MIXED結合前兩者,MySQL 自動判斷

由于 ROW 格式能提供精確的行級別變更信息,因此推薦使用它。

2. 開啟 binlog 并配置 MySQL

2.1 檢查 binlog 是否開啟

SHOW VARIABLES LIKE 'log_bin';

如果 log_bin 值為 OFF,說明 binlog 未開啟。

2.2 修改 MySQL 配置文件(my.cnf 或 my.ini)

在 [mysqld] 部分添加以下內(nèi)容:

server-id=1
log-bin=mysql-bin
binlog-format=ROW
binlog-row-image=FULL
expire_logs_days=7

重啟 MySQL:

systemctl restart mysql  # Linux
net stop mysql && net start mysql  # Windows

2.3 驗證 binlog 配置

執(zhí)行:

SHOW BINARY LOGS;

如果有 binlog 文件,如 mysql-bin.000001,說明已開啟。

3. 使用 Java 監(jiān)聽 binlog

3.1 選擇工具:Canal

阿里巴巴開源的 Canal 可以模擬 MySQL 從庫協(xié)議,解析 binlog 并實時推送增量數(shù)據(jù)。

3.2 Java 代碼監(jiān)聽 binlog

引入 Maven 依賴

<dependencies>
    <dependency>
        <groupId>com.alibaba.otter</groupId>
        <artifactId>canal.client</artifactId>
        <version>1.1.6</version>
    </dependency>
</dependencies>

編寫 Java 代碼

import com.alibaba.otter.canal.client.CanalConnector;
import com.alibaba.otter.canal.client.CanalConnectors;
import com.alibaba.otter.canal.protocol.CanalEntry;
import com.alibaba.otter.canal.protocol.Message;

import java.net.InetSocketAddress;
import java.util.List;

public class BinlogListener {
    public static void main(String[] args) {
        // 連接 Canal
        CanalConnector connector = CanalConnectors.newSingleConnector(
                new InetSocketAddress("127.0.0.1", 11111), 
                "example", "canal", "canal");
        

        try {
            connector.connect();
            connector.subscribe(".*\\..*"); // 監(jiān)聽所有庫表
            connector.rollback();
    
            while (true) {
                Message message = connector.getWithoutAck(100); // 獲取數(shù)據(jù)
                long batchId = message.getId();
                List<CanalEntry.Entry> entries = message.getEntries();
    
                if (batchId != -1 && !entries.isEmpty()) {
                    for (CanalEntry.Entry entry : entries) {
                        if (entry.getEntryType() == CanalEntry.EntryType.ROWDATA) {
                            processEntry(entry);
                        }
                    }
                }
                connector.ack(batchId); // 確認消息
            }
        } finally {
            connector.disconnect();
        }
    }
    
    private static void processEntry(CanalEntry.Entry entry) {
        try {
            CanalEntry.RowChange rowChange = CanalEntry.RowChange.parseFrom(entry.getStoreValue());
            CanalEntry.EventType eventType = rowChange.getEventType();
    
            System.out.println("變更表:" + entry.getHeader().getTableName());
            System.out.println("變更類型:" + eventType);
    
            for (CanalEntry.RowData rowData : rowChange.getRowDatasList()) {
                if (eventType == CanalEntry.EventType.DELETE) {
                    System.out.println("刪除數(shù)據(jù):" + rowData.getBeforeColumnsList());
                } else if (eventType == CanalEntry.EventType.INSERT) {
                    System.out.println("新增數(shù)據(jù):" + rowData.getAfterColumnsList());
                } else {
                    System.out.println("更新前數(shù)據(jù):" + rowData.getBeforeColumnsList());
                    System.out.println("更新后數(shù)據(jù):" + rowData.getAfterColumnsList());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

4. 代碼解析

  • 創(chuàng)建 Canal 連接

CanalConnector connector = CanalConnectors.newSingleConnector(
    new InetSocketAddress("127.0.0.1", 11111), 
    "example", "canal", "canal");
    • 127.0.0.1:Canal 服務器地址
    • 11111:Canal 端口
    • example:Canal 實例
    • canal/canal:默認賬號密碼
  • 獲取 binlog 變更數(shù)據(jù)

Message message = connector.getWithoutAck(100);
    • getWithoutAck(100):拉取 100 條 binlog 事件。
  • 解析 binlog

for (CanalEntry.Entry entry : entries) {
    if (entry.getEntryType() == CanalEntry.EntryType.ROWDATA) {
        processEntry(entry);
    }
}
  • 僅處理 ROWDATA 類型的變更,忽略事務等其他信息。

  • 分類處理 INSERT、UPDATE、DELETE

if (eventType == CanalEntry.EventType.DELETE) {
    System.out.println("刪除數(shù)據(jù):" + rowData.getBeforeColumnsList());
} else if (eventType == CanalEntry.EventType.INSERT) {
    System.out.println("新增數(shù)據(jù):" + rowData.getAfterColumnsList());
} else {
    System.out.println("更新前數(shù)據(jù):" + rowData.getBeforeColumnsList());
    System.out.println("更新后數(shù)據(jù):" + rowData.getAfterColumnsList());
}

總結

  • MySQL binlog 記錄數(shù)據(jù)庫變更,可用于監(jiān)聽增量數(shù)據(jù)。
  • Canal 作為 MySQL 從庫解析 binlog,實現(xiàn)數(shù)據(jù)同步。
  • Java 代碼示例 展示如何用 Canal 監(jiān)聽 INSERTUPDATE、DELETE 操作,并解析變更數(shù)據(jù)。

這種方案適用于 分布式數(shù)據(jù)同步、緩存一致性數(shù)據(jù)變更通知,是實時數(shù)據(jù)處理的重要手段。

以上就是MySQL數(shù)據(jù)變化監(jiān)聽的實現(xiàn)方案的詳細內(nèi)容,更多關于MySQL數(shù)據(jù)變化監(jiān)聽的資料請關注腳本之家其它相關文章!

相關文章

  • 如何將Excel文件導入MySQL數(shù)據(jù)庫

    如何將Excel文件導入MySQL數(shù)據(jù)庫

    這篇文章主要為大家詳細介紹了Excel文件導入MySQL數(shù)據(jù)庫的具體方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • 寶塔服務器的mysql數(shù)據(jù)庫自動備份到gitee項目

    寶塔服務器的mysql數(shù)據(jù)庫自動備份到gitee項目

    文章介紹了一個開源腳本,用于自動備份寶塔服務器上的所有數(shù)據(jù)庫,并將備份文件上傳到Gitee項目中,腳本支持多服務器數(shù)據(jù)信息備份,并且可以定時執(zhí)行備份任務
    2025-12-12
  • MySQL慢查詢診斷與SQL注入防御詳解

    MySQL慢查詢診斷與SQL注入防御詳解

    本文介紹MySQL慢查詢診斷與SQL注入防御的相關知識,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2026-04-04
  • MySQL數(shù)據(jù)類型和表的操作方法

    MySQL數(shù)據(jù)類型和表的操作方法

    文章系統(tǒng)介紹了SQL常用數(shù)據(jù)類型(數(shù)值、字符串、日期)及表操作(創(chuàng)建、修改、刪除),涵蓋BIT、TINYINT、VARCHAR、ENUM等類型定義,以及SHOW TABLES、CREATE TABLE、ALTER TABLE等語句用法,強調(diào)數(shù)據(jù)類型選擇與表結構管理的關鍵性,感興趣的朋友跟隨小編一起看看吧
    2025-10-10
  • Mysql索引類型與基本用法實例分析

    Mysql索引類型與基本用法實例分析

    這篇文章主要介紹了Mysql索引類型與基本用法,結合實例形式分析了Mysql索引類型中普通索引、唯一索引、主鍵索引、組合索引、全文索引基本概念、原理與使用方法,需要的朋友可以參考下
    2020-06-06
  • Windows平臺下MySQL安裝與配置方法與注意事項

    Windows平臺下MySQL安裝與配置方法與注意事項

    這篇文章主要介紹了Windows平臺下MySQL安裝與配置方法與注意事項,需要的朋友可以參考下
    2017-04-04
  • mysql中的int類型對應于java中的Long類型詳解

    mysql中的int類型對應于java中的Long類型詳解

    這篇文章主要介紹了mysql中的int類型對應于java中的Long類型,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • JDBC探索之SQLException解析

    JDBC探索之SQLException解析

    這篇文章主要介紹了JDBC探索之SQLException解析,具有一定參考價值,需要的朋友可以了解下。
    2017-10-10
  • mysql索引簡介及explain使用詳解

    mysql索引簡介及explain使用詳解

    這篇文章詳細介紹了MySQL的三層邏輯架構,介紹了SQL優(yōu)化的基本概念、執(zhí)行過程以及如何使用索引優(yōu)化查詢,最后,通過分析執(zhí)行計劃(EXPLAIN)來理解SQL的執(zhí)行情況,感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • MySQL入門教程(五)之表的創(chuàng)建、修改和刪除

    MySQL入門教程(五)之表的創(chuàng)建、修改和刪除

    MySQL 為關系型數(shù)據(jù)庫(Relational Database Management System), 本文給大家介紹MySQL入門教程(五)之表的創(chuàng)建、修改和刪除,需要的朋友一起學習吧
    2016-04-04

最新評論

泗阳县| 高碑店市| 大连市| 呼图壁县| 南靖县| 镇赉县| 阜新市| 垣曲县| 特克斯县| 三穗县| 德保县| 玉山县| 定陶县| 闵行区| 阿瓦提县| 桂东县| 香港| 从江县| 中方县| 吉木乃县| 三明市| 闻喜县| 靖安县| 中西区| 绥滨县| 新密市| 合江县| 申扎县| 沈阳市| 普陀区| 嘉祥县| 湘乡市| 谷城县| 博白县| 溆浦县| 扶绥县| 龙州县| 崇州市| 比如县| 咸宁市| 光泽县|