欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Canal進(jìn)行MySQL到MySQL數(shù)據(jù)庫全量+增量同步踩坑指南

 更新時間:2023年10月02日 08:09:58   投稿:wdc  
這篇文章主要介紹了使用Canal作為遷移工具,將數(shù)據(jù)庫從A服務(wù)器遷移至B服務(wù)器,為了盡量減少遷移導(dǎo)致的停機(jī)時間,考慮使用全量遷移+增量同步的方式

背景

最近工作中遇到一個遷移數(shù)據(jù)庫的需求,需要將數(shù)據(jù)庫從A服務(wù)器遷移至B服務(wù)器,為了盡量減少遷移導(dǎo)致的停機(jī)時間,考慮使用全量遷移+增量同步的方式,最終選擇使用Canal作為遷移工具

準(zhǔn)備工作

1. 數(shù)據(jù)庫

兩臺服務(wù)器的數(shù)據(jù)庫都需要提前準(zhǔn)備好數(shù)據(jù)庫賬號,用于Canal進(jìn)行數(shù)據(jù)庫連接,因為Canal是偽裝成從庫讀取源數(shù)據(jù)的,所以需要對源庫進(jìn)行一些配置,比如賬號需要授予從庫權(quán)限(如果給的是最高權(quán)限賬號,那基本不用擔(dān)心這個)、保證Canal部署的程序與數(shù)據(jù)庫網(wǎng)絡(luò)互通、以及最重要的!開啟ROW格式的Binlog,這個非常重要!

2.Canal安裝

使用Canal進(jìn)行全量和增量同步需要用到兩個組件,Canal adapter、Canal deployer,可自行前往github倉庫下載。

Canal配置啟動增量同步和全量同步

1.deployer配置

將下載的兩個組件解壓,首先配置deployer

主要關(guān)注conf目錄

進(jìn)入example目錄,編輯instance.properties文件:

重點(diǎn)關(guān)注這幾個參數(shù):canal.instance.master.addresscanal.instance.dbUsername,canal.instance.dbPassword,canal.instance.filter.regex(重要)

這樣就配置好了deployer,回到deployer的bin目錄,執(zhí)行startup.sh即可啟動deployer程序(此時還未同步)

#################################################
## 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=這里填寫源數(shù)據(jù)庫的ip:端口
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=填寫源數(shù)據(jù)庫用戶名,例:root
canal.instance.dbPassword=填寫源數(shù)據(jù)庫密碼,例:root
canal.instance.connectionCharset = UTF-8
# enable druid Decrypt database password
canal.instance.enableDruid=false
#canal.instance.pwdPublicKey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALK4BUxdDltRRE5/zXpVEVPUgunvscYFtEip3pmLlhrWpacX7y7GCMo2/JM6LeHmiiNdH1FWgGCpUfircSwlWKUCAwEAAQ==
# table regex
canal.instance.filter.regex=這里填寫需要進(jìn)行同步的數(shù)據(jù)庫表名,格式:數(shù)據(jù)庫名.表名,多個表用逗號分分隔,例如:testdb.user,testdb.role,testdb.menu
# table black regex
canal.instance.filter.black.regex=mysql\\.slave_.*
# table field filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2)
#canal.instance.filter.field=test1.t_product:id/subject/keywords,test2.t_company:id/name/contact/ch
# table field black filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2)
#canal.instance.filter.black.field=test1.t_product:subject/product_image,test2.t_company:id/name/contact/ch
# table field black filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2)
#canal.instance.filter.black.field=test1.t_product:subject/product_image,test2.t_company:id/name/contact/ch
# mq config
canal.mq.topic=example
# dynamic topic route by schema or table regex
#canal.mq.dynamicTopic=mytest1.user,topic2:mytest2\\..*,.*\\..*
canal.mq.partition=0
# hash partition config
#canal.mq.enableDynamicQueuePartition=false
#canal.mq.partitionsNum=3
#canal.mq.dynamicTopicPartitionNum=test.*:4,mycanal:6
#canal.mq.partitionHash=test.table:id^name,.*\\..*
#################################################

2.adapter配置

同樣,進(jìn)入conf目錄

首先編輯bootstrap.yml文件,將里面的配置全部注釋,因為我們沒有用上admin的服務(wù),不需要連Canal自身的數(shù)據(jù)庫

#canal:
#  manager:
#    jdbc:
#      url: jdbc:mysql://127.0.0.1:3306/canal_manager?useUnicode=true&characterEncoding=UTF-8
#      username: canal
#      password: canal

接著編輯application.yml文件

主要關(guān)注canal.conf.srcDataSources和canal.conf.canalAdapters下的配置

srcDataSources:
  defaultDS:
    url: 這里填源數(shù)據(jù)庫的jdbc連接信息,例:jdbc:mysql://127.0.0.1:3306/testdb
    username: 數(shù)據(jù)庫賬號,例:root
    password: 數(shù)據(jù)庫密碼,例:root
    maxActive: 100 #額外增加這一行,默認(rèn)的連接數(shù)只有3,會導(dǎo)致全量同步出現(xiàn)異常,導(dǎo)致全量同步數(shù)據(jù)缺失,最好改大一點(diǎn)
canalAdapters:
- instance: example #這里就保留叫example,只是個命名
  groups:
  - groupId: g1
    outerAdapters:
    - name: logger
    - name: rdb
      key: mysql1 # 這里保持默認(rèn)即可
      properties:
        jdbc.driverClassName: com.mysql.jdbc.Driver #數(shù)據(jù)庫驅(qū)動就保持這個驅(qū)動,不要修改為帶cj的那個驅(qū)動,如果這個驅(qū)動有問題,再考慮更換驅(qū)動
        jdbc.url: 這里填寫需要同步接收方的數(shù)據(jù)庫鏈接,例:jdbc:mysql://192.168.1.2:3309/testdb?useUnicode=true
        jdbc.username: root
        jdbc.password: 123456
        druid.stat.enable: false
        druid.stat.slowSqlMillis: 1000

修改好文件后保存

增量同步配置

由于本文場景是從mysql同步到另一個mysql,如果需要同步到es或者其他系統(tǒng),請參考github內(nèi)的教程

同步到mysql(或是其他關(guān)系型數(shù)據(jù)庫)則接著進(jìn)入到rdb目錄

該文件夾內(nèi),里面已經(jīng)有一個示例yml文件,一個yml文件一般配置一個同步表,如果有多個表需要同步,則復(fù)制多個yml副本,將文件名修改為庫名_表名.yml,方便歸類,本文由于只有一個庫,就直接命名為表名.yml

以本文為例,復(fù)制默認(rèn)yml文件3份,分別命名為user.yml、role.yml、menu.yml,代表三個表,接下來以user.yml配置為例

dataSourceKey: defaultDS #無需修改
destination: example #這個對應(yīng)application.yml文件中的
groupId: g1
outerAdapterKey: mysql1
concurrent: true
dbMapping:
  database: epidemic #需要同步的數(shù)據(jù)庫名,兩臺服務(wù)器的數(shù)據(jù)庫名最好命名成一樣的,不然可能有各種意外情況發(fā)生
  table: user #需要同步的表名
  targetTable: user #同步到目標(biāo)服務(wù)器對應(yīng)的表名
  targetPk: 
    id: id # 主鍵,格式為, 源表主鍵名:目標(biāo)表主鍵名
  mapAll: true # 映射所有字段,這里改為true的話,下面的targetColumns就可以不用改了,除非兩邊的數(shù)據(jù)結(jié)構(gòu)不一樣
#  targetColumns:
#    id:
#    name:
#    role_id:
#    c_time:
#    test1:
#  etlCondition: "where c_time>={}"
  commitBatch: 3000 # 批量提交的大小,保持不動即可

其他幾個表的yml文件填寫方式類似

修改好配置文件后,回到adapter的bin目錄內(nèi),執(zhí)行startup.sh,啟動adapter,此時可以查看adapter/logs/adapter/adapter.log,如果里面開始有輸出DML語句則代表增量同步已經(jīng)開始了

3.全量同步

使用命令行執(zhí)行如下命令,即可啟動全量同步:
curl http://canal部署的ip:8081/etl/rdb/mysql1/rdb目錄內(nèi)對應(yīng)表的文件名.yml -X POST例如:
curl http://127.0.0.1:8081/etl/rdb/mysql1/user.yml -X POST依然查看adapter/logs/adapter/adapter.log日志即可看到全量同步的輸出

完成

至此,增量同步和全量同步都完成了

到此這篇關(guān)于Canal進(jìn)行MySQL到MySQL數(shù)據(jù)庫全量+增量同步踩坑指南的文章就介紹到這了,更多相關(guān)Canal進(jìn)行MySQL到MySQL數(shù)據(jù)庫全量+增量同步踩坑指南內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL ddl語句的使用

    MySQL ddl語句的使用

    這篇文章主要介紹了MySQL ddl語句的使用,幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下
    2020-11-11
  • MySQL中BETWEEN子句的用法詳解

    MySQL中BETWEEN子句的用法詳解

    這篇文章主要介紹了MySQL中BETWEEN子句的用法詳解,是MySQL入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-05-05
  • mysql中between的用法及說明

    mysql中between的用法及說明

    這篇文章主要介紹了mysql中between的用法及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • mysql根據(jù)json字段內(nèi)容作為查詢條件(包括json數(shù)組)檢索數(shù)據(jù)

    mysql根據(jù)json字段內(nèi)容作為查詢條件(包括json數(shù)組)檢索數(shù)據(jù)

    本文主要介紹了mysql根據(jù)json字段內(nèi)容作為查詢條件(包括json數(shù)組)檢索數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • mysql 數(shù)據(jù)插入優(yōu)化方法

    mysql 數(shù)據(jù)插入優(yōu)化方法

    當(dāng)一個線程對一個表執(zhí)行一個DELAYED語句時,如果不存在這樣的處理程序,一個處理器線程被創(chuàng)建以處理對于該表的所有DELAYED語句。
    2010-12-12
  • MySQL設(shè)置管理員密碼無法生效的問題解析

    MySQL設(shè)置管理員密碼無法生效的問題解析

    這篇文章主要介紹了MySQL設(shè)置管理員密碼無法生效的問題解析,一般在遇到?MySQL?問題時,建議對?MySQL?系統(tǒng)函數(shù)、數(shù)據(jù)庫內(nèi)部對象等進(jìn)行檢索而不是直接打印字符串,有時候可能對快速定位問題原因有幫助,需要的朋友可以參考下
    2022-06-06
  • MySQL樂觀鎖和悲觀鎖具體實現(xiàn)

    MySQL樂觀鎖和悲觀鎖具體實現(xiàn)

    這篇文章主要介紹了MySQL樂觀鎖和悲觀鎖具體實現(xiàn),文章圍繞主題展開詳細(xì)的內(nèi)容戒殺,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • MySql中的json_extract函數(shù)處理json字段詳情

    MySql中的json_extract函數(shù)處理json字段詳情

    這篇文章主要介紹了MySql中的json_extract函數(shù)處理json字段詳情,利用json_extract函數(shù)可以通過key查詢value值的一個介紹展開相關(guān)內(nèi)容,需要的小伙伴可以參考一下
    2022-06-06
  • 找到一種不錯的從SQLServer轉(zhuǎn)成Mysql數(shù)據(jù)庫的方法

    找到一種不錯的從SQLServer轉(zhuǎn)成Mysql數(shù)據(jù)庫的方法

    找到一種不錯的從SQLServer轉(zhuǎn)成Mysql數(shù)據(jù)庫的方法...
    2007-07-07
  • MySQL group by和order by如何一起使用

    MySQL group by和order by如何一起使用

    這篇文章主要介紹了MySQL group by和order by如何一起使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10

最新評論