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

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

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

1. binlog 簡(jiǎn)介

1.1 什么是 binlog?

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

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

1.2 binlog 的三種格式

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

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

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 驗(yàn)證 binlog 配置

執(zhí)行:

SHOW BINARY LOGS;

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

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

3.1 選擇工具:Canal

阿里巴巴開源的 Canal 可以模擬 MySQL 從庫(kù)協(xié)議,解析 binlog 并實(shí)時(shí)推送增量數(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)聽所有庫(kù)表
            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); // 確認(rèn)消息
            }
        } 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 服務(wù)器地址
    • 11111:Canal 端口
    • example:Canal 實(shí)例
    • canal/canal:默認(rèn)賬號(hào)密碼
  • 獲取 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 類型的變更,忽略事務(wù)等其他信息。

  • 分類處理 INSERTUPDATE、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());
}

總結(jié)

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

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

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

相關(guān)文章

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

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

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

    寶塔服務(wù)器的mysql數(shù)據(jù)庫(kù)自動(dòng)備份到gitee項(xiàng)目

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

    MySQL慢查詢?cè)\斷與SQL注入防御詳解

    本文介紹MySQL慢查詢?cè)\斷與SQL注入防御的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    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等語(yǔ)句用法,強(qiáng)調(diào)數(shù)據(jù)類型選擇與表結(jié)構(gòu)管理的關(guān)鍵性,感興趣的朋友跟隨小編一起看看吧
    2025-10-10
  • Mysql索引類型與基本用法實(shí)例分析

    Mysql索引類型與基本用法實(shí)例分析

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

    Windows平臺(tái)下MySQL安裝與配置方法與注意事項(xiàng)

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

    mysql中的int類型對(duì)應(yīng)于java中的Long類型詳解

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

    JDBC探索之SQLException解析

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

    mysql索引簡(jiǎn)介及explain使用詳解

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

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

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

最新評(píng)論

左权县| 涪陵区| 渝北区| 水富县| 盐边县| 项城市| 丹东市| 黄冈市| 鄢陵县| 河间市| 凤凰县| 抚松县| 虞城县| 承德市| 万荣县| 阿拉善右旗| 夏邑县| 筠连县| 贵阳市| 剑阁县| 西藏| 茌平县| 泾阳县| 青浦区| 昌黎县| 内丘县| 库尔勒市| 噶尔县| 中江县| 正阳县| 临桂县| 自治县| 盈江县| 磐安县| 昌宁县| 政和县| 荥阳市| 台北县| 上思县| 分宜县| 玉屏|