全部產品
Search
文件中心

Elasticsearch:通過Canal將MySQL資料同步到阿里雲ES

更新時間:Aug 20, 2026

如果您需要將MySQL中的增量資料即時同步至Elasticsearch(簡稱ES)執行個體,且您對資料同步的即時性要求較高,可以通過Canal來實現。

背景資訊

Canal是阿里巴巴集團提供的一個開源產品,能夠通過解析資料庫的增量日誌,提供增量資料的訂閱和消費功能。Canal的功能原理及詳細說明請參見Canal。使用Canal類比成MySQL的Slave,即時接收MySQL的增量資料binlog,然後通過RESTful API將資料寫入到阿里雲ES執行個體中,適用於對資料同步的即時性要求較高的情境。

前提條件

已建立RDS MySQL執行個體、阿里雲ES執行個體、阿里雲ECS執行個體。建議您在同一專用網路下建立相關執行個體。

使用限制

  • 本方案僅支援將MySQL增量資料同步至阿里雲ES。

  • 安裝的JDK版本必須大於等於1.8.0。

  • Canal 1.1.4版本不支援ES 7.x版本。

    ES 7.x版本的資料寫入需使用Canal 1.1.5版本,ES 8.x版本請選擇1.1.7版本。您也可以通過其他方式(例如Logstash、DTS)實現MySQL資料同步。

  • 在進行資料同步時支援自訂索引Mapping,但需保證Mapping中定義的欄位(名稱+類型)與MySQL中一致。

  • 本方案需要您自行保證Canal的可用性,避免出現業務不可用或故障。例如:當出現ECS重啟,Canal異常退出等情境時如何繼續同步資料等。

  • Canal Adapter不支援使用HTTPS協議串連阿里雲ES執行個體。

操作步驟

步驟一:準備MySQL資料來源

進入RDS控制台,建立RDS MySQL資料庫和表。具體操作請參見RDS MySQL快速入門。本文使用的建表語句如下。

-- create table
CREATE TABLE `es_test` (
    `id` bigint(32) NOT NULL,
    `name` text NOT NULL,
    `count` text NOT NULL,
    `color` text NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8;

步驟二:建立索引

  1. 登入目標阿里雲ES執行個體的Kibana控制台,具體操作請參見登入Kibana控制台。

    說明

    本文以阿里雲ES 6.7.0版本為例,其他版本操作可能略有差別,請以實際介面為準。

  2. 在左側導覽列,單擊Dev Tools。

  3. 在Console中,執行以下命令建立索引。

    以下樣本建立的索引名稱為es_test,包含count、id、name和color欄位。

    重要

    mappings中的欄位需要與步驟一:準備MySQL資料來源中建立的欄位(名稱和類型)保持一致。

    PUT es_test?include_type_name=true
    {
    
        "settings" : {
          "index" : {
            "number_of_shards" : "5",
            "number_of_replicas" : "1"
          }
        },
        "mappings" : {
            "_doc" : {
                "properties" : {
                  "count": {          
                       "type": "text"       
                   },
                  "id": {
                       "type": "integer"
                   },
                   "name": {
                        "type" : "text",
                        "analyzer": "ik_smart"                   
                    },
                    "color" : {
                        "type" : "text"                    
                    }
                }
            }
        }
    }

    建立成功後,返回如下結果。

    {
      "acknowledged" : true,
      "shards_acknowledged" : true,
      "index" : "es_test"
    }

步驟三:安裝JDK

  1. 串連ECS執行個體。

    具體操作請參見使用Workbench登入Linux執行個體。

    說明

    本文檔以普通使用者權限為例。

  2. 查看可用的JDK軟體包列表。

    sudo yum search java | grep -i --color JDK
  3. 選擇合適的版本,安裝JDK。

    本文選擇java-1.8.0-openjdk-devel.x86_64。

    sudo yum install java-1.8.0-openjdk-devel.x86_64
  4. 配置環境變數。

    1. 開啟etc檔案夾下的profile檔案。

      vim ~/.bash_profile
    2. 在檔案內添加如下的環境變數。

      export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.362.b08-1.el7_9.x86_64
      export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
      export PATH=$PATH:$JAVA_HOME/bin
      重要

      JAVA_HOME需要替換為您JDK的安裝路徑,可通過find / -name 'java'命令查看。

    3. 按下Esc鍵,然後使用:wq儲存檔案並退出vi模式,隨後執行以下命令使配置生效。

      source ~/.bash_profile
  5. 執行以下命令,驗證JDK是否安裝成功。

    java -version

    顯示如下結果說明JDK安裝成功。

    openjdk version "1.8.0_362"
    OpenJDK Runtime Environment (build 1.8.0_362-b08)
    OpenJDK 64-Bit Server VM (build 25.362-b08, mixed mode)

步驟四:安裝並啟動Canal-server

  1. 下載Canal-server。

    本文使用1.1.4版本。

    wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.deployer-1.1.4.tar.gz
    說明
    • 目前Canal 1.1.5版本已支援ES 7.0版本,如果您使用的是ES 7.0,需要下載Canal 1.1.5版本。詳細資料請參見Canal release note。

    • 下載Canal-server和Canal-adapter需要串連公網,請確保ECS執行個體可以訪問公網。

  2. 解壓。

    tar -zxvf canal.deployer-1.1.4.tar.gz
  3. 修改conf/example/instance.properties檔案。

    vi conf/example/instance.properties
    #################################################
    ## mysql serverId , v1.0.26+ will autoGen
    # canal.instance.mysql.slaveId=0
    
    # enable gtid use true/false
    canal.instance.gtidon=false
    
    # position info
    canal.instance.master.address=rm-bpxxxd6ph.mysql.rds.aliyuncs.com:3306
    canal.instance.master.journal.name=
    canal.instance.master.position=
    canal.instance.master.timestamp=
    canal.instance.master.gtid=
    
    # rds oss binlog
    canal.instance.rds.accesskey=
    canal.instance.rds.secretkey=
    canal.instance.rds.instanceId=
    
    # table meta tsdb info
    canal.instance.tsdb.enable=true
    #canal.instance.tsdb.url=jdbc:mysql://127.0.0.1:3306/canal_tsdb
    #canal.instance.tsdb.dbUsername=canal
    #canal.instance.tsdb.dbPassword=canal
    
    #canal.instance.standby.address =
    #canal.instance.standby.journal.name =
    #canal.instance.standby.position =
    #canal.instance.standby.timestamp =
    #canal.instance.standby.gtid=
    
    # username/password
    canal.instance.dbUsername=xxx
    canal.instance.dbPassword=xxx
    canal.instance.connectionCharset = UTF-8
    # enable druid Decrypt database password
    canal.instance.enableDruid=false

    配置項

    說明

    canal.instance.master.address

    需要設定為<RDS MySQL資料庫的內網地址>:<內網連接埠>,相關資訊可在RDS MySQL執行個體的基本資料頁面擷取。例如rm-bp1u1xxxxxxxxx6ph.mysql.rds.aliyuncs.com:3306。

    canal.instance.dbUsername

    RDS MySQL資料庫的帳號名稱,可在執行個體的帳號管理頁面擷取。

    canal.instance.dbPassword

    RDS MySQL資料庫的密碼。

  4. 按下Esc鍵,然後使用:wq命令儲存檔案並退出vi模式。

  5. 啟動Canal-server,並查看日誌。

    ./bin/startup.sh
    cat logs/canal/canal.log

    預期輸出如下:

    [root@VM01 ~]# ./bin/startup.sh
    cd to /root/bin for workaround relative path
    LOG CONFIGURATION : /root/bin/../conf/logback.xml
    canal conf : /root/bin/../conf/canal.properties
    CLASSPATH :/root/bin/../conf:/root/bin/../lib/zookeeper-3.4.5.jar:/root/bin/../lib/zkclient-0.10.jar:/root/bin/../lib/spring-tx-3.2.18.RELEASE.jar:/root/bin/../lib/spring-orm-3.2.18.RELEASE.jar:/root/bin/../lib/spring-jdbc-3.2.18.RELEASE.jar:/root/bin/../lib/spring-expression-3.2.18.RELEASE.jar:/root/bin/../lib/spring-core-3.2.18.RELEASE.jar:/root/bin/../lib/spring-context-3.2.18.RELEASE.jar:/root/bin/../lib/spring-beans-3.2.18.RELEASE.jar:/root/bin/../lib/spring-aop-3.2.18.RELEASE.jar:/root/bin/../lib/snakeyaml-1.19.jar:/root/bin/../lib/slf4j-api-1.7.12.jar:/root/bin/../lib/simpleclient_pushgateway-0.4.0.jar:/root/bin/../lib/simpleclient_httpserver-0.4.0.jar:/root/bin/../lib/simpleclient_hotspot-0.4.0.jar:/root/bin/../lib/simpleclient_common-0.4.0.jar:/root/bin/../lib/simpleclient-0.4.0.jar:/root/bin/../lib/scala-reflect-2.11.12.jar:/root/bin/../lib/scala-logging_2.11-3.8.0.jar:/root/bin/../lib/scala-library-2.11.12.jar:/root/bin/../lib/rocketmq-srvutil-4.5.2.jar:/root/bin/../lib/rocketmq-remoting-4.5.2.jar:/root/bin/../lib/rocketmq-logging-4.5.2.jar:/root/bin/../lib/rocketmq-common-4.5.2.jar:/root/bin/../lib/rocketmq-client-4.5.2.jar:/root/bin/../lib/rocketmq-acl-4.5.2.jar:/root/bin/../lib/protobuf-java-3.6.1.jar:/root/bin/../lib/oro-2.0.8.jar:/root/bin/../lib/netty-tcnative-boringssl-static-1.1.33.Fork26.jar:/root/bin/../lib/netty-all-4.1.6.Final.jar:/root/bin/../lib/netty-3.2.2.Final.jar:/root/bin/../lib/mysql-connector-java-5.1.47.jar:/root/bin/../lib/metrics-core-2.2.0.jar:/root/bin/../lib/lz4-java-1.4.1.jar:/root/bin/../lib/logback-core-1.1.3.jar:/root/bin/../lib/logback-classic-1.1.3.jar:/root/bin/../lib/kafka-clients-1.1.1.jar:/root/bin/../lib/kafka_2.11-1.1.1.jar:/root/bin/../lib/jsr305-3.0.2.jar:/root/bin/../lib/jopt-simple-5.0.4.jar:/root/bin/../lib/jctools-core-2.1.2.jar:/root/bin/../lib/jcl-over-slf4j-1.7.12.jar:/root/bin/../lib/jackson-databind-2.9.6.jar:/root/bin/../lib/jackson-core-2.9.6.jar:/root/bin/../lib/jackson-annotations-2.9.0.jar:/root/bin/../lib/ibatis-sqlmap-2.3.4.726.jar:/root/bin/../lib/httpcore-4.4.3.jar:/root/bin/../lib/httpclient-4.5.1.jar:/root/bin/../lib/h2-1.4.196.jar:/root/bin/../lib/guava-18.0.jar:/root/bin/../lib/fastsql-2.0.0_preview_97.jar:/root/bin/../lib/fastson-1.2.58.jar:/root/bin/../lib/druid-1.1.9.jar:/root/bin/../lib/disruptor-3.4.2.jar:/root/bin/../lib/commons-logging-1.1.3.jar:/root/bin/../lib/commons-lang3-3.4.jar:/root/bin/../lib/commons-lang-2.6.jar:/root/bin/../lib/commons-io-2.4.jar:/root/bin/../lib/commons-compress-1.9.jar:/root/bin/../lib/commons-codec-1.9.jar:/root/bin/../lib/commons-cli-1.2.jar:/root/bin/../lib/commons-beanutils-1.8.2.jar:/root/bin/../lib/canal.store-1.1.4.jar:/root/bin/../lib/canal.sink-1.1.4.jar:/root/bin/../lib/canal.server-1.1.4.jar:/root/bin/../lib/canal.protocol-1.1.4.jar:/root/bin/../lib/canal.prometheus-1.1.4.jar:/root/bin/../lib/canal.parse.driver-1.1.4.jar:/root/bin/../lib/canal.parse.dbsync-1.1.4.jar:/root/bin/../lib/canal.parse-1.1.4.jar:/root/bin/../lib/canal.meta-1.1.4.jar:/root/bin/../lib/canal.instance.spring-1.1.4.jar:/root/bin/../lib/canal.instance.manager-1.1.4.jar:/root/bin/../lib/canal.instance.core-1.1.4.jar:/root/bin/../lib/canal.filter-1.1.4.jar:/root/bin/../lib/canal.deployer-1.1.4.jar:/root/bin/../lib/canal.common-1.1.4.jar:/root/bin/../lib/aviator-2.2.1.jar:/root/bin/../lib/aopalliance-1.0.jar::/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.71-2.b15.el7_2.x86_64/jre/lib/rt.jar:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.71-2.b15.el7_2.x86_64/lib/dt.jar:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.71-2.b15.el7_2.x86_64/lib/tools.jar
    acd to /root for continue
    [root@VM01 ~]# cat logs/canal/canal.log
    2019-09-05 14:57:57.654 [main] INFO  com.alibaba.otter.canal.deployer.CanalLauncher - ## set default uncaught exception handler
    2019-09-05 14:57:57.688 [main] INFO  com.alibaba.otter.canal.deployer.CanalLauncher - ## load canal configurations
    2019-09-05 14:57:57.698 [main] INFO  com.alibaba.otter.canal.deployer.CanalStarter - ## start the canal server.
    2019-09-05 14:57:57.732 [main] INFO  com.alibaba.otter.canal.deployer.CanalController - ## start the canal server[192.   4.192      234):11111]
    2019-09-05 14:57:58.726 [main] INFO  com.alibaba.otter.canal.deployer.CanalStarter - ## the canal server is running now ......
    [root@VM01 ~]#

步驟五:安裝並啟動Canal-adapter

  1. 下載Canal-adapter。

    本文使用1.1.4版本。

    wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.adapter-1.1.4.tar.gz
    說明
    • 目前Canal 1.1.5版本已支援ES 7.0版本,如果您使用的是ES 7.0,需要下載Canal 1.1.5版本。詳細資料請參見Canal release note。

    • 下載Canal-server和Canal-adapter需要串連公網,請確保ECS執行個體可以訪問公網。

  2. 解壓。

    tar -zxvf canal.adapter-1.1.4.tar.gz
  3. 修改conf/application.yml檔案。

    vi conf/application.yml
    server:
      port: 8081
    spring:
      jackson:
        date-format: yyyy-MM-dd HH:mm:ss
        time-zone: GMT+8
        default-property-inclusion: non_null
    
    canal.conf:
      mode: tcp # kafka rocketMQ
      canalServerHost: 127.0.0.1:11111
      batchSize: 500
      syncBatchSize: 1000
      retries: 0
      timeout:
      accessKey:
      secretKey:
      srcDataSources:
        defaultDS:
          url: jdbc:mysql://rm-******.mysql.rds.aliyuncs.com:3306/elasticsearch?useUnicode=true
          username: root
          password: ******
      canalAdapters:
      - instance: example
        groups:
        - groupId: g1
          outerAdapters:
          - name: logger
          - name: es
            hosts: es-cn-******.elasticsearch.aliyuncs.com:9200
            properties:
                mode: rest
                security.auth: elastic:******
                cluster.name: es-cn-******

    配置項

    說明

    canal.conf.canalServerHost

    canalDeployer訪問地址。保持預設(127.0.0.1:11111)即可。

    canal.conf.srcDataSources.defaultDS.url

    需要設定為jdbc:mysql://<RDS MySQL內網地址>:<內網連接埠>/<資料庫名稱>?useUnicode=true,相關資訊可在RDS MySQL執行個體的基本資料頁面擷取。例如jdbc:mysql://rm-bp1xxxxxxxxxnd6ph.mysql.rds.aliyuncs.com:3306/elasticsearch?useUnicode=true。

    canal.conf.srcDataSources.defaultDS.username

    RDS MySQL資料庫的帳號名稱,可在RDS MySQL執行個體的帳號管理頁面擷取。

    canal.conf.srcDataSources.defaultDS.password

    RDS MySQL資料庫的密碼。

    canal.conf.canalAdapters.groups.outerAdapters.hosts

    定位到name:es的位置,將hosts替換為<ES執行個體的內網地址>:<內網連接埠>,相關資訊可在ES執行個體的基本資料頁面擷取。例如,es-cn-v64xxxxxxxxx3medp.elasticsearch.aliyuncs.com:9200。

    canal.conf.canalAdapters.groups.outerAdapters.mode

    必須設定為rest。

    canal.conf.canalAdapters.groups.outerAdapters.properties.security.auth

    需要設定為<ES執行個體的帳號>:<密碼>。例如elastic:es_password。

    canal.conf.canalAdapters.groups.outerAdapters.properties.cluster.name

    ES執行個體的ID,可在ES執行個體的基本資料頁面擷取。例如es-cn-v64xxxxxxxxx3medp。

  4. 按下Esc鍵,然後使用:wq命令儲存檔案並退出vi模式。

  5. 同樣的方式,修改conf/es/*.yml檔案,定義MySQL資料到ES資料的映射欄位。

    dataSourceKey: defaultDS
    destination: example
    groupId: g1
    esMapping:
      _index: es_test
      _type: _doc
      _id: _id
      #pk: id
      sql: "select t.id as _id,t.id,t.count,t.name,t.color from es_test t"
      commitBatch: 3000

    配置項

    說明

    esMapping._index

    步驟二:建立索引章節中,在ES執行個體中所建立的索引的名稱。本文使用es_test。

    esMapping._type

    步驟二:建立索引章節中,在ES執行個體中所建立的索引的類型。本文使用_doc。

    esMapping._id

    需要同步到ES執行個體的文檔的id,可自訂。本文使用_id。

    esMapping.sql

    SQL語句,用來查詢需要同步到ES中的欄位。本文使用select t.id as _id,t.id,t.count,t.name,t.color from es_test t。

  6. 啟動Canal-adapter服務,並查看日誌。

    ./bin/startup.sh
    cat logs/adapter/adapter.log
    說明

    本文以MySQL 5.7版本為例,如果您使用的是MySQL其它版本,需要將MySQL磁碟機替換為相應的版本,否則可能會導致啟動失敗,詳細資料請參見常見問題。

    日誌中出現 ## ES mapping config loaded 和 ## the canal client adapters are running now ...... 表示 Canal adapter 啟動成功,預期日誌輸出:

    2019-09-05 20:16:22.918 [Thread-2] INFO  com.alibaba.druid.pool.DruidDataSource - {dataSource-2} inited
    2019-09-05 20:16:24.928 [Thread-2] INFO  c.a.o.canal.adapter.launcher.loader.CanalAdapterService - ## start the canal client adapters.
    2019-09-05 20:16:24.929 [Thread-2] INFO  c.a.o.canal.adapter.launcher.loader.CanalAdapterLoader - Load canal adapter: logger succeed
    2019-09-05 20:16:24.929 [Thread-2] INFO  c.a.o.canal.client.adapter.es.config.ESSyncConfigLoader - ## Start loading es mapping config ...
    2019-09-05 20:16:24.943 [Thread-2] INFO  c.a.o.canal.client.adapter.es.config.ESSyncConfigLoader - ## ES mapping config loaded
    2019-09-05 20:16:25.182 [Thread-2] INFO  c.a.o.canal.adapter.launcher.loader.CanalAdapterLoader - Load canal adapter: es succeed
    2019-09-05 20:16:25.185 [Thread-2] INFO  c.a.o.canal.adapter.launcher.loader.CanalAdapterLoader - Start adapter for canal instance: example succeed
    2019-09-05 20:16:25.185 [Thread-2] INFO  c.a.o.canal.adapter.launcher.loader.CanalAdapterService - ## the canal client adapters are running now ......
    2019-09-05 20:16:25.185 [Thread-2] INFO  c.a.o.c.a.launcher.monitor.ApplicationConfigMonitor - ## adapter application config reloaded.
    2019-09-05 20:16:25.186 [Thread-8] INFO  c.a.o.canal.adapter.launcher.loader.CanalAdapterWorker - =============> Start to connect destination: example <=============
    2019-09-05 20:16:25.186 [Thread-8] INFO  c.a.o.canal.adapter.launcher.loader.CanalAdapterWorker - =============> Start to subscribe destination: example <=============
    2019-09-05 20:16:25.232 [Thread-8] INFO  c.a.o.canal.adapter.launcher.loader.CanalAdapterWorker - =============> Subscribe destination: example succeed <=============
    2019-09-05 20:16:27.432 [pool-5-thread-1] INFO  c.a.o.canal.client.adapter.logger.LoggerAdapterExample - DML: {"data":null,"type":"mysql","destination":"example","es":1,"sql":"/* rds internal mark */ CREATE TABLE IF NOT EXISTS mysql.ha_health_check (\n  id   BIGINT  DEFAULT 0,\n  type CHAR(1) DEFAULT '0',\n  PRIMARY KEY (type)\n)\n/*CREATE*/"}

步驟六:驗證增量資料同步

  1. 在RDS MySQL資料庫中,新增、修改或刪除資料庫中es_test表的資料。

    insert `ES`.`es_test`(`count`,`id`,`name`,`color`) values('11',2,'canal_test2','red');
  2. 登入目標阿里雲ES執行個體的Kibana控制台,具體操作請參見登入Kibana控制台。

  3. 在左側導覽列,單擊Dev Tools。

  4. 在Console中,執行以下命令查詢同步成功的資料。

    GET /es_test/_search

    預期結果如下。

    GET /es_test/_search
    
    {
      "took" : 1,
      "timed_out" : false,
      "_shards" : {
        "total" : 5,
        "successful" : 5,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : 1,
        "max_score" : 1.0,
        "hits" : [
          {
            "_index" : "es_test",
            "_type" : "_doc",
            "_id" : "2",
            "_score" : 1.0,
            "_source" : {
              "id" : 2,
              "count" : "11",
              "name" : "canal_test2",
              "color" : "red"
            }
          }
        ]
      }
    }
    重要

    Canal同步的是增量資料,不會同步之前的存量資料。

常見問題

Q:啟動Canal-adapter時,adapter.log日誌顯示異常,如何解決?錯誤記錄檔為:java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ClassCastException: com.alibaba.druid.pool.DruidDataSource cannot be cast to com.alibaba.druid.pool.DruidDataSource

at com.alibaba.otter.canal.client.adapter.es7x.ES7xAdapter.init(ES7xAdapter.java:54) ~[client-adapter.es7x-1.1.5-jar-with-dependencies.jar:na]

A:將canal.adapter-1.1.5\plugin下的client-adapter.es7x-1.1.5-jar-with-dependencies.jar替換為canal-1.1.5-alpha-2版本下的對應檔案。

說明

您可以參考Canal的issues解決,請參見Canal issues

以root許可權使用者為例,操作步驟如下:

  1. 下載canal-1.1.5-alpha-2版本。詳細資料請參見Canal release note。

    wget https://github.com/alibaba/canal/releases/download/canal-1.1.5-alpha-2/canal.adapter-1.1.5-SNAPSHOT.tar.gz
  2. 解壓檔案。

    tar -zxvf canal.adapter-1.1.5-SNAPSHOT.tar.gz
  3. 拷貝canal-1.1.5-alpha-2 版本中plugin下的client-adapter.es7x-1.1.5-SNAPSHOT-jar-with-dependencies.jar放到canal.adapter-1.1.5\plugin目錄下。

    說明

    實際拷貝檔案的目錄需根據您建立的目錄結構來。

    cp canal.adapter-1.1.5-SNAPSHOT/plugin/client-adapter.es7x-1.1.5-SNAPSHOT-jar-with-dependencies.jar canal/canal.adapter/plugin
  4. 刪除canal.adapter-1.1.5\plugin下的client-adapter.es7x-1.1.5-jar-with-dependencies.jar。

    rm -rf client-adapter.es7x-1.1.5-jar-with-dependencies.jar
  5. 修改名字。

    mv client-adapter.es7x-1.1.5-SNAPSHOT-jar-with-dependencies.jar client-adapter.es7x-1.1.5-jar-with-dependencies.jar 

Q:啟動Canal-adapter時,adapter.log日誌顯示異常,如何解決?錯誤記錄檔為java.sql.SQLException: Unknown system variable 'query_cache_size'

A:可能是由於Canal-adapter中內建的MySQL驅動版本與串連的MySQL資料庫版本不一致導致,例如:使用的canal.adapter-1.1.4時,其內建的MySQL磁碟機為mysql-connector-java-5.1.40.jar,在串連MySQL8時就會出現如上所述的異常資訊。可更換Canal-adapter中的MySQL磁碟機版本進行解決。

Q:使用Canal同步MySQL 8.0版本的資料,如何將MySQL磁碟機版本替換成8.0?

A:以下操作步驟以root許可權使用者為例。

  1. 下載8.0版本的MySQL磁碟機。

    wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.29.zip
  2. 解壓。

    unzip mysql-connector-java-8.0.29.zip
  3. 拷貝檔案到Canal-adapter的lib目錄下。

    mv mysql-connector-java-8.0.29/mysql-connector-java-8.0.29.jar lib/
  4. 添加許可權。

    chmod 777 lib/mysql-connector-java-8.0.29.jar
    chmod +st lib/mysql-connector-java-8.0.29.jar
  5. 刪除5.x版本的磁碟機。

    rm -rf lib/mysql-connector-java-5.1.40.jar

相關文檔