国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Canal1--搭建Canal監(jiān)聽數(shù)據(jù)庫變化

這篇具有很好參考價(jià)值的文章主要介紹了Canal1--搭建Canal監(jiān)聽數(shù)據(jù)庫變化。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1.安裝mysql

默認(rèn)安裝了mysql(版本8.0.x);

新創(chuàng)建用戶

-- 創(chuàng)建用戶 用戶名:canal 密碼:Canal@123456
create user 'canal'@'%' identified by 'Canal@123456';

授權(quán)

grant SELECT, REPLICATION SLAVE, REPLICATION CLIENT on *.* to 'canal'@'%' with grant option;

flush privileges;

Canal1--搭建Canal監(jiān)聽數(shù)據(jù)庫變化,數(shù)據(jù)庫

查看MySQL是否開啟binlog模式

show variables like 'log_bin';

Canal1--搭建Canal監(jiān)聽數(shù)據(jù)庫變化,數(shù)據(jù)庫
查看當(dāng)前正在寫入的binlog日志:

show master status;

Canal1--搭建Canal監(jiān)聽數(shù)據(jù)庫變化,數(shù)據(jù)庫
記住文件名和偏移量

2.安裝Canal

去官網(wǎng)下載頁面進(jìn)行下載;

我這里下載的是1.1.7的版本:
Canal1--搭建Canal監(jiān)聽數(shù)據(jù)庫變化,數(shù)據(jù)庫
解壓canal.deployer-1.1.7.tar.gz,我們可以看到里面有五個(gè)文件夾:
Canal1--搭建Canal監(jiān)聽數(shù)據(jù)庫變化,數(shù)據(jù)庫
打開配置文件conf/example/instance.properties,配置信息如下:

## mysql serverId , v1.0.26+ will autoGen
## v1.0.26版本后會(huì)自動(dòng)生成slaveId,所以可以不用配置
# canal.instance.mysql.slaveId=0

# 數(shù)據(jù)庫地址
canal.instance.master.address=127.0.0.1:3306
# binlog日志名稱
canal.instance.master.journal.name=自己的日志名稱
# mysql主庫鏈接時(shí)起始的binlog偏移量
canal.instance.master.position=日志的偏移量
# mysql主庫鏈接時(shí)起始的binlog的時(shí)間戳
canal.instance.master.timestamp=
canal.instance.master.gtid=

# username/password
# 在MySQL服務(wù)器授權(quán)的賬號(hào)密碼
canal.instance.dbUsername=canal
canal.instance.dbPassword=Canal@123456
# 字符集
canal.instance.connectionCharset = UTF-8
# enable druid Decrypt database password
canal.instance.enableDruid=false

# table regex .*\\..*表示監(jiān)聽所有表 也可以寫具體的表名,用,隔開
canal.instance.filter.regex=.*\\..*
# mysql 數(shù)據(jù)解析表的黑名單,多個(gè)表用,隔開
canal.instance.filter.black.regex=

開啟Canal服務(wù)端:
進(jìn)入bin目錄

.\startup.bat

3.Java客戶端操作

首先引入maven依賴:

<!--canal客戶端-->
        <dependency>
            <groupId>com.alibaba.otter</groupId>
            <artifactId>canal.client</artifactId>
            <version>1.1.7</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.otter</groupId>
            <artifactId>canal.protocol</artifactId>
            <version>1.1.7</version>
        </dependency>

然后創(chuàng)建一個(gè)CanalClient類

import com.alibaba.otter.canal.client.*;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;
import com.alibaba.otter.canal.protocol.Message;
import com.alibaba.otter.canal.protocol.CanalEntry.*;

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

@Component
public class CanalClient implements InitializingBean {

    private final static int BATCH_SIZE = 1000;

    @Override
    public void afterPropertiesSet() throws Exception {
        // 創(chuàng)建鏈接
        CanalConnector connector = CanalConnectors.newSingleConnector(
                new InetSocketAddress("127.0.0.1", 11111),
                "example", "", "");
        try {
            //打開連接
            connector.connect();
            //訂閱數(shù)據(jù)庫表,全部表
            connector.subscribe(".*\\..*");
            //回滾到未進(jìn)行ack的地方,下次fetch的時(shí)候,可以從最后一個(gè)沒有ack的地方開始拿
            connector.rollback();
            while (true) {
                // 獲取指定數(shù)量的數(shù)據(jù)
                Message message = connector.getWithoutAck(BATCH_SIZE);
                //獲取批量ID
                long batchId = message.getId();
                //獲取批量的數(shù)量
                int size = message.getEntries().size();
                //如果沒有數(shù)據(jù)
                if (batchId == -1 || size == 0) {
                    try {
                        //線程休眠2秒
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } else {
                    //如果有數(shù)據(jù),處理數(shù)據(jù)
                    printEntry(message.getEntries());
                }
                //進(jìn)行 batch id 的確認(rèn)。確認(rèn)之后,小于等于此 batchId 的 Message 都會(huì)被確認(rèn)。
                connector.ack(batchId);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            connector.disconnect();
        }
    }

    /**
     * 打印canal server解析binlog獲得的實(shí)體類信息
     */
    private static void printEntry(List<Entry> entrys) {
        for (Entry entry : entrys) {
            if (entry.getEntryType() == EntryType.TRANSACTIONBEGIN || entry.getEntryType() == EntryType.TRANSACTIONEND) {
                //開啟/關(guān)閉事務(wù)的實(shí)體類型,跳過
                continue;
            }
            //RowChange對象,包含了一行數(shù)據(jù)變化的所有特征
            //比如isDdl 是否是ddl變更操作 sql 具體的ddl sql beforeColumns afterColumns 變更前后的數(shù)據(jù)字段等等
            RowChange rowChage;
            try {
                rowChage = RowChange.parseFrom(entry.getStoreValue());
            } catch (Exception e) {
                throw new RuntimeException("ERROR ## parser of eromanga-event has an error , data:" + entry.toString(), e);
            }
            //獲取操作類型:insert/update/delete類型
            EventType eventType = rowChage.getEventType();
            //打印Header信息
            System.out.println(String.format("================》; binlog[%s:%s] , name[%s,%s] , eventType : %s",
                    entry.getHeader().getLogfileName(), entry.getHeader().getLogfileOffset(),
                    entry.getHeader().getSchemaName(), entry.getHeader().getTableName(),
                    eventType));
            //判斷是否是DDL語句
            if (rowChage.getIsDdl()) {
                System.out.println("================》;isDdl: true,sql:" + rowChage.getSql());
            }
            //獲取RowChange對象里的每一行數(shù)據(jù),打印出來
            for (RowData rowData : rowChage.getRowDatasList()) {
                //如果是刪除語句
                if (eventType == EventType.DELETE) {
                    printColumn(rowData.getBeforeColumnsList());
                    //如果是新增語句
                } else if (eventType == EventType.INSERT) {
                    printColumn(rowData.getAfterColumnsList());
                    //如果是更新的語句
                } else {
                    //變更前的數(shù)據(jù)
                    System.out.println("------->; before");
                    printColumn(rowData.getBeforeColumnsList());
                    //變更后的數(shù)據(jù)
                    System.out.println("------->; after");
                    printColumn(rowData.getAfterColumnsList());
                }
            }
        }
    }

    private static void printColumn(List<Column> columns) {
        for (Column column : columns) {
            System.out.println(column.getName() + " : " + column.getValue() + "    update=" + column.getUpdated());
        }
    }
}

完成之后再對應(yīng)數(shù)據(jù)庫進(jìn)行操作,控制臺(tái)會(huì)打印對應(yīng)的操作,說明對數(shù)據(jù)的寫入操作進(jìn)行了有效的監(jiān)控;
注意只讀操作并不會(huì)寫入binlog也不會(huì)被Canal監(jiān)控到(也沒必要監(jiān)控讀取操作)。
Canal1--搭建Canal監(jiān)聽數(shù)據(jù)庫變化,數(shù)據(jù)庫文章來源地址http://www.zghlxwxcb.cn/news/detail-858888.html

到了這里,關(guān)于Canal1--搭建Canal監(jiān)聽數(shù)據(jù)庫變化的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C#實(shí)現(xiàn)數(shù)據(jù)庫數(shù)據(jù)變化監(jiān)測(sqlserver&mysql)

    C#實(shí)現(xiàn)數(shù)據(jù)庫數(shù)據(jù)變化監(jiān)測(sqlserver&mysql)

    監(jiān)測數(shù)據(jù)庫表數(shù)據(jù)變化,可實(shí)現(xiàn)數(shù)據(jù)庫同步(一主一從(雙機(jī)備份),一主多從(總部數(shù)據(jù)庫,工廠1,工廠2,工廠數(shù)據(jù)合并到總部數(shù)據(jù))) sqlserver 啟用數(shù)據(jù)庫監(jiān)聽服務(wù) ALTER DATABASE test SET NEW_BROKER WITH ROLLBACK IMMEDIATE; ALTER DATABASE test SET ENABLE_BROKER; SELECT is_broker_enabled FROM sys.dat

    2024年02月14日
    瀏覽(26)
  • Oracle運(yùn)維(數(shù)據(jù)庫、監(jiān)聽、重啟)

    shutdown有四個(gè)參數(shù),四個(gè)參數(shù)的含義如下: Normal 需要等待所有的用戶斷開連接 Immediate 等待用戶完成當(dāng)前的語句 Transactional 等待用戶完成當(dāng)前的事務(wù) Abort 不做任何等待,直接關(guān)閉數(shù)據(jù)庫 normal需要在所有連接用戶斷開后才執(zhí)行關(guān)閉數(shù)據(jù)庫任務(wù),所以有的時(shí)候看起來好象命令沒

    2024年02月06日
    瀏覽(90)
  • 數(shù)據(jù)庫監(jiān)聽器停止與啟動(dòng)

    切換至安裝oracle數(shù)據(jù)庫的那個(gè)用戶,一般為oracle(在root下是安裝或是啟動(dòng)不了oracle的); # su oracle 然后啟動(dòng)監(jiān)聽器 # lsnrctl start 會(huì)看到啟動(dòng)成功的界面; 停止監(jiān)聽器命令. lsnrctl stop 可以修改oracle的ora文件,對數(shù)據(jù)庫進(jìn)行配置,在opt/oracle/product/9.2.0/network/admin 目錄中,修改相應(yīng)的ora文件即

    2024年02月07日
    瀏覽(22)
  • Java 實(shí)現(xiàn)實(shí)時(shí)監(jiān)聽MySQL數(shù)據(jù)庫變更MySQLBinListener

    Java 實(shí)現(xiàn)實(shí)時(shí)監(jiān)聽MySQL數(shù)據(jù)庫變更MySQLBinListener

    目錄 1、導(dǎo)出需要的類和接口 2、 定義?MySQLBinlogListener類 3、私有方法,啟動(dòng)重連定時(shí)器 4、完整代碼 ? 編寫一個(gè)MySQL數(shù)據(jù)庫實(shí)時(shí)變更的監(jiān)聽器。 為什么要編寫這個(gè)一個(gè)監(jiān)聽器:為了實(shí)時(shí)監(jiān)測和響應(yīng)MySQL數(shù)據(jù)庫中的變更事件 實(shí)時(shí)數(shù)據(jù)同步:通過監(jiān)聽MySQL Binlog,可以捕獲數(shù)據(jù)庫的

    2024年02月16日
    瀏覽(18)
  • Linux下Oracle的數(shù)據(jù)庫和監(jiān)聽啟動(dòng)關(guān)閉命令

    Linux下Oracle的數(shù)據(jù)庫和監(jiān)聽啟動(dòng)關(guān)閉命令

    sqlplus /nolog conn /as sysdba connect sys/123456 as sysdba; (123456為用戶密碼) startup startup命令它有三種情況: 第一種:不帶參數(shù),啟動(dòng)數(shù)據(jù)庫實(shí)例并打開數(shù)據(jù)庫,以便用戶使用數(shù)據(jù)庫,在多數(shù)情況下,使用這種方式! 第二種:帶nomount參數(shù),只啟動(dòng)數(shù)據(jù)庫實(shí)例,但不打開數(shù)據(jù)庫,在你希

    2024年02月04日
    瀏覽(102)
  • SpringBoot整合Canal+RabbitMQ監(jiān)聽數(shù)據(jù)變更

    需求 步驟 環(huán)境搭建 整合SpringBoot Canal實(shí)現(xiàn)客戶端 Canal整合RabbitMQ SpringBoot整合RabbitMQ ? 我想要在SpringBoot中采用一種與業(yè)務(wù)代碼解耦合的方式,來實(shí)現(xiàn)數(shù)據(jù)的變更記錄,記錄的內(nèi)容是新數(shù)據(jù),如果是更新操作還得有舊數(shù)據(jù)內(nèi)容。 經(jīng)過調(diào)研發(fā)現(xiàn),使用Canal來監(jiān)聽MySQL的binlog變化可

    2024年02月11日
    瀏覽(16)
  • openGauss學(xué)習(xí)筆記-200 openGauss 數(shù)據(jù)庫運(yùn)維-常見故障定位案例-表文件大小無變化

    openGauss學(xué)習(xí)筆記-200 openGauss 數(shù)據(jù)庫運(yùn)維-常見故障定位案例-表文件大小無變化

    200.1 VACUUM FULL一張表后,表文件大小無變化 200.1.1 問題現(xiàn)象 使用VACUUM FULL命令對一張表進(jìn)行清理,清理完成后表大小和清理前一樣大。 200.1.2 原因分析 假定該表的名稱為table_name,對于該現(xiàn)象可能有以下兩種原因: table_name表本身沒有delete過數(shù)據(jù),使用VACUUM FULL table_name后無需清

    2024年01月18日
    瀏覽(25)
  • SpringCloud 整合 Canal+RabbitMQ+Redis 實(shí)現(xiàn)數(shù)據(jù)監(jiān)聽

    SpringCloud 整合 Canal+RabbitMQ+Redis 實(shí)現(xiàn)數(shù)據(jù)監(jiān)聽

    Canal 指的是阿里巴巴開源的數(shù)據(jù)同步工具,用于數(shù)據(jù)庫的實(shí)時(shí)增量數(shù)據(jù)訂閱和消費(fèi)。它可以針對 MySQL、MariaDB、Percona、阿里云RDS、Gtid模式下的異構(gòu)數(shù)據(jù)同步等情況進(jìn)行實(shí)時(shí)增量數(shù)據(jù)同步。 當(dāng)前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x Canal是如何同步數(shù)據(jù)庫

    2024年02月03日
    瀏覽(19)
  • Sql Server 數(shù)據(jù)庫事務(wù)與鎖,同一事務(wù)更新又查詢鎖的變化,期望大家來解惑!

    Sql Server 數(shù)據(jù)庫事務(wù)與鎖,同一事務(wù)更新又查詢鎖的變化,期望大家來解惑!

    我有一個(gè)People表,有三行數(shù)據(jù): 如果我們沒詳細(xì)了解數(shù)據(jù)庫事務(wù)執(zhí)行加鎖的過程中,會(huì)不會(huì)有這樣一個(gè)疑問:如下的這段 SQL 開啟了事務(wù),并且在事務(wù)中進(jìn)行了更新和查詢操作。 我們知道sql server數(shù)據(jù)庫的默認(rèn)事務(wù)級別是READ COMMITTED(已提交的讀?。?,我們再看一下已提交讀事

    2024年02月01日
    瀏覽(65)
  • Vue組件使用(父組件監(jiān)聽子組件數(shù)據(jù)變化,子組件使用父組件的數(shù)據(jù),并監(jiān)聽父組件的數(shù)據(jù)變化)

    Vue組件使用(父組件監(jiān)聽子組件數(shù)據(jù)變化,子組件使用父組件的數(shù)據(jù),并監(jiān)聽父組件的數(shù)據(jù)變化)

    父組件聲明變量 父組件向子組件傳遞數(shù)據(jù) Vue 數(shù)據(jù)類型 type 有以下幾種: String:字符串類型。例如:“hello world”。 Number:數(shù)字類型。例如:12,1.5。 Boolean:布爾類型。例如:true,false。 Object:對象類型。例如:{name: ‘Tom’, age: 20}。 Array:數(shù)組類型。例如:[1, 2, 3]。 Fun

    2024年02月14日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包