[{"data":1,"prerenderedAt":4461},["ShallowReactive",2],{"content:\u002F2025\u002F10\u002Fcanal":3,"surround:\u002F2025\u002F10\u002Fcanal":4451},{"id":4,"title":5,"body":6,"categories":4429,"date":4431,"description":4432,"draft":4433,"extension":4434,"image":4435,"meta":4436,"navigation":457,"path":4438,"permalink":4435,"published":4435,"readingTime":4439,"recommend":4435,"references":4435,"seo":4444,"sitemap":4445,"stem":4446,"tags":4447,"type":4448,"updated":4449,"__hash__":4450},"content\u002Fposts\u002F2025\u002F10\u002Fcanal.md","Canal 安装配置与 Go 客户端实践",{"type":7,"value":8,"toc":4404},"minimark",[9,13,18,28,35,38,41,46,59,64,71,75,86,89,92,95,111,173,176,179,251,258,266,269,272,278,351,355,358,367,372,375,402,409,416,422,428,431,600,603,610,626,629,663,667,675,681,835,847,853,860,866,869,1155,1158,1216,1219,2137,2151,2154,2167,2171,2174,2183,3894,3898,3901,3904,3906,3909,3912,3919,4032,4039,4050,4098,4107,4147,4151,4157,4389,4397,4400],[10,11,12],"p",{},"Canal 是阿里开源的一款 MySQL 数据库增量日志解析工具，提供增量数据订阅和消费。使用Canal能够实现异步更新数据，配合MQ使用可在很多业务场景下发挥巨大作用。",[14,15,17],"h2",{"id":16},"canal简介","Canal简介",[10,19,20,27],{},[21,22,26],"a",{"href":23,"rel":24},"https:\u002F\u002Fgithub.com\u002Falibaba\u002Fcanal",[25],"nofollow","canal"," 是阿里开源的一款 MySQL 数据库增量日志解析工具，提供增量数据订阅和消费。",[10,29,30],{},[31,32],"img",{"alt":33,"src":34},"","https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fcodepzj\u002Fimages@main\u002F20251028125658020.png",[10,36,37],{},"使用Canal能够实现异步更新数据，配合MQ使用可在很多业务场景下发挥巨大作用。",[14,39,40],{"id":40},"工作原理",[42,43,45],"h3",{"id":44},"mysql主备复制原理","MySQL主备复制原理",[47,48,49,53,56],"ul",{},[50,51,52],"li",{},"MySQL master 将数据变更写入二进制日志（binary log）, 日志中的记录叫做二进制日志事件（binary log events，可以通过 show binlog events 进行查看）",[50,54,55],{},"MySQL slave 将 master 的 binary log events 拷贝到它的中继日志(relay log)",[50,57,58],{},"MySQL slave 重放 relay log 中事件，将数据变更反映到它自己的数据",[10,60,61],{},[31,62],{"alt":33,"src":63},"https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fcodepzj\u002Fimages@main\u002F20251028125703255.jpeg",[10,65,66,67],{},"图片来源： ",[21,68,69],{"href":69,"rel":70},"https:\u002F\u002Favisheksharma.wordpress.com\u002F2015\u002F01\u002F07\u002Fstep-wise-guide-to-setup-mysql-replication\u002F",[25],[42,72,74],{"id":73},"canal-工作原理","Canal 工作原理",[47,76,77,80,83],{},[50,78,79],{},"Canal 模拟 MySQL slave 的交互协议，伪装自己为 MySQL slave ，向 MySQL master 发送 dump 协议",[50,81,82],{},"MySQL master 收到 dump 请求，开始推送 binary log 给 slave (即 Canal )",[50,84,85],{},"Canal 解析 binary log 对象(原始为 byte 流)",[14,87,88],{"id":88},"环境准备",[10,90,91],{},"你应该事先准备好一个MySQL环境，并按以下步骤进行设置。",[42,93,94],{"id":94},"开启binlog",[10,96,97,98,102,103,106,107,110],{},"需要先开启MySQL的 binlog 写入功能，配置 ",[99,100,101],"code",{"code":101},"binlog-format"," 为 ",[99,104,105],{"code":105},"ROW"," 模式，具体",[99,108,109],{"code":109},"my.cnf"," 中配置如下：",[112,113,117],"pre",{"className":114,"code":115,"language":116,"meta":33,"style":33},"language-ini shiki shiki-themes github-light github-dark","[mysqld]\nlog-bin=mysql-bin # 开启 binlog\nbinlog-format=ROW # 选择 ROW 模式\nserver_id=1 # 配置 MySQL replaction 需要定义，不要和 canal 的 slaveId 重复\n","ini",[99,118,119,135,150,161],{"__ignoreMap":33},[120,121,124,128,132],"span",{"class":122,"data-line":123,"line":123},"line",1,[120,125,127],{"class":126},"sSDpw","[",[120,129,131],{"class":130},"sScJk","mysqld",[120,133,134],{"class":126},"]\n",[120,136,138,142,146],{"class":122,"data-line":137,"line":137},2,[120,139,141],{"class":140},"szBVR","log-bin",[120,143,145],{"class":144},"sVt8B","=mysql-bin ",[120,147,149],{"class":148},"sJ8bj","# 开启 binlog\n",[120,151,153,155,158],{"class":122,"data-line":152,"line":152},3,[120,154,101],{"class":140},[120,156,157],{"class":144},"=ROW ",[120,159,160],{"class":148},"# 选择 ROW 模式\n",[120,162,164,167,170],{"class":122,"data-line":163,"line":163},4,[120,165,166],{"class":140},"server_id",[120,168,169],{"class":144},"=1 ",[120,171,172],{"class":148},"# 配置 MySQL replaction 需要定义，不要和 canal 的 slaveId 重复\n",[10,174,175],{},"修改配置文件之后，重启MySQL。",[10,177,178],{},"使用命令查看是否打开binlog模式，如输出以下内容则说明binlog已开启。",[112,180,184],{"className":181,"code":182,"language":183,"meta":33,"style":33},"language-sql shiki shiki-themes github-light github-dark","mysql> show variables like 'log_bin';\n+---------------+-------+\n| Variable_name | Value |\n+---------------+-------+\n| log_bin       | ON    |\n+---------------+-------+\n","sql",[99,185,186,207,215,226,232,244],{"__ignoreMap":33},[120,187,188,191,194,197,200,204],{"class":122,"data-line":123,"line":123},[120,189,190],{"class":144},"mysql",[120,192,193],{"class":140},">",[120,195,196],{"class":144}," show variables ",[120,198,199],{"class":140},"like",[120,201,203],{"class":202},"sZZnC"," 'log_bin'",[120,205,206],{"class":144},";\n",[120,208,209,212],{"class":122,"data-line":137,"line":137},[120,210,211],{"class":140},"+",[120,213,214],{"class":148},"---------------+-------+\n",[120,216,217,220,223],{"class":122,"data-line":152,"line":152},[120,218,219],{"class":144},"| Variable_name | ",[120,221,222],{"class":140},"Value",[120,224,225],{"class":144}," |\n",[120,227,228,230],{"class":122,"data-line":163,"line":163},[120,229,211],{"class":140},[120,231,214],{"class":148},[120,233,235,238,241],{"class":122,"data-line":234,"line":234},5,[120,236,237],{"class":144},"| log_bin       | ",[120,239,240],{"class":140},"ON",[120,242,243],{"class":144},"    |\n",[120,245,247,249],{"class":122,"data-line":246,"line":246},6,[120,248,211],{"class":140},[120,250,214],{"class":148},[10,252,253,254,257],{},"查看",[99,255,256],{"code":256},"binlog_format","配置是否正确。",[112,259,264],{"className":260,"code":262,"language":263,"meta":33},[261],"language-text","mysql> show variables like 'binlog_format';\n+---------------+-------+\n| Variable_name | Value |\n+---------------+-------+\n| binlog_format | ROW   |\n+---------------+-------+\n","text",[99,265,262],{"__ignoreMap":33},[42,267,268],{"id":268},"添加授权",[10,270,271],{},"Canal的原理是模拟自己为MySQL slave，所以一定要为账号授予做为MySQL slave的相关权限。",[10,273,274,275,277],{},"下面的命令是先创建一个名为",[99,276,26],{"code":26},"的账号，再对其进行授权，如果已有账户可直接 grant。",[112,279,281],{"className":181,"code":280,"language":183,"meta":33,"style":33},"CREATE USER canal IDENTIFIED BY 'canal';  \nGRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';\n-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;\nFLUSH PRIVILEGES;\n",[99,282,283,306,341,346],{"__ignoreMap":33},[120,284,285,288,291,294,297,300,303],{"class":122,"data-line":123,"line":123},[120,286,287],{"class":140},"CREATE",[120,289,290],{"class":140}," USER",[120,292,293],{"class":130}," canal",[120,295,296],{"class":144}," IDENTIFIED ",[120,298,299],{"class":140},"BY",[120,301,302],{"class":202}," 'canal'",[120,304,305],{"class":144},";  \n",[120,307,308,311,314,317,319,322,325,328,331,333,336,339],{"class":122,"data-line":137,"line":137},[120,309,310],{"class":140},"GRANT",[120,312,313],{"class":140}," SELECT",[120,315,316],{"class":144},", REPLICATION SLAVE, REPLICATION CLIENT ",[120,318,240],{"class":140},[120,320,321],{"class":140}," *",[120,323,324],{"class":144},".",[120,326,327],{"class":140},"*",[120,329,330],{"class":140}," TO",[120,332,302],{"class":202},[120,334,335],{"class":144},"@",[120,337,338],{"class":202},"'%'",[120,340,206],{"class":144},[120,342,343],{"class":122,"data-line":152,"line":152},[120,344,345],{"class":148},"-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;\n",[120,347,348],{"class":122,"data-line":163,"line":163},[120,349,350],{"class":144},"FLUSH PRIVILEGES;\n",[14,352,354],{"id":353},"安装canal","安装Canal",[42,356,357],{"id":357},"release安装",[10,359,360,361,366],{},"打开",[21,362,365],{"href":363,"rel":364},"https:\u002F\u002Fgithub.com\u002Falibaba\u002Fcanal\u002Freleases",[25],"官方release页面","，根据需要选择对应的软件包下载即可。",[10,368,369],{},[31,370],{"alt":33,"src":371},"https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fcodepzj\u002Fimages@main\u002F20251028125715992.png",[10,373,374],{},"将下载后的软件包解压，可看到以下目录。",[112,376,380],{"className":377,"code":378,"language":379,"meta":33,"style":33},"language-bash shiki shiki-themes github-light github-dark","bin\nconf\nlib\nlogs\n","bash",[99,381,382,387,392,397],{"__ignoreMap":33},[120,383,384],{"class":122,"data-line":123,"line":123},[120,385,386],{"class":130},"bin\n",[120,388,389],{"class":122,"data-line":137,"line":137},[120,390,391],{"class":130},"conf\n",[120,393,394],{"class":122,"data-line":152,"line":152},[120,395,396],{"class":130},"lib\n",[120,398,399],{"class":122,"data-line":163,"line":163},[120,400,401],{"class":130},"logs\n",[10,403,404,405,408],{},"修改配置文件：",[99,406,407],{"code":407},"canal-server\u002Fconf\u002Fexample\u002Finstance.properties","。",[10,410,411,412,415],{},"将",[99,413,414],{"code":414},"canal.instance.master.address","修改为你的MySQL地址。",[10,417,411,418,421],{},[99,419,420],{"code":420},"canal.instance.tsdb.dbUsername","修改为你上面授权的账号。",[10,423,411,424,427],{},[99,425,426],{"code":426},"canal.instance.tsdb.dbPassword","修改为你上面授权账号的密码。",[10,429,430],{},"配置示例如下：",[112,432,436],{"className":433,"code":434,"language":435,"meta":33,"style":33},"language-properties shiki shiki-themes github-light github-dark","#################################################\n## mysql serverId , v1.0.26+ will autoGen\n# canal.instance.mysql.slaveId=0\n\n# enable gtid use true\u002Ffalse\ncanal.instance.gtidon=false\n\n# position info\ncanal.instance.master.address=127.0.0.1:3306\ncanal.instance.master.journal.name=\ncanal.instance.master.position=\ncanal.instance.master.timestamp=\ncanal.instance.master.gtid=\n\n# rds oss binlog\ncanal.instance.rds.accesskey=\ncanal.instance.rds.secretkey=\ncanal.instance.rds.instanceId=\n\n# table meta tsdb info\ncanal.instance.tsdb.enable=true\n#canal.instance.tsdb.url=jdbc:mysql:\u002F\u002F127.0.0.1:3306\u002Fcanal_tsdb\ncanal.instance.tsdb.dbUsername=canal\ncanal.instance.tsdb.dbPassword=canal\n","properties",[99,437,438,443,448,453,459,464,472,477,483,491,500,508,516,524,529,535,543,551,559,564,570,579,585,593],{"__ignoreMap":33},[120,439,440],{"class":122,"data-line":123,"line":123},[120,441,442],{"class":148},"#################################################\n",[120,444,445],{"class":122,"data-line":137,"line":137},[120,446,447],{"class":148},"## mysql serverId , v1.0.26+ will autoGen\n",[120,449,450],{"class":122,"data-line":152,"line":152},[120,451,452],{"class":148},"# canal.instance.mysql.slaveId=0\n",[120,454,455],{"class":122,"data-line":163,"line":163},[120,456,458],{"emptyLinePlaceholder":457},true,"\n",[120,460,461],{"class":122,"data-line":234,"line":234},[120,462,463],{"class":148},"# enable gtid use true\u002Ffalse\n",[120,465,466,469],{"class":122,"data-line":246,"line":246},[120,467,468],{"class":140},"canal.instance.gtidon",[120,470,471],{"class":144},"=false\n",[120,473,475],{"class":122,"data-line":474,"line":474},7,[120,476,458],{"emptyLinePlaceholder":457},[120,478,480],{"class":122,"data-line":479,"line":479},8,[120,481,482],{"class":148},"# position info\n",[120,484,486,488],{"class":122,"data-line":485,"line":485},9,[120,487,414],{"class":140},[120,489,490],{"class":144},"=127.0.0.1:3306\n",[120,492,494,497],{"class":122,"data-line":493,"line":493},10,[120,495,496],{"class":140},"canal.instance.master.journal.name",[120,498,499],{"class":144},"=\n",[120,501,503,506],{"class":122,"data-line":502,"line":502},11,[120,504,505],{"class":140},"canal.instance.master.position",[120,507,499],{"class":144},[120,509,511,514],{"class":122,"data-line":510,"line":510},12,[120,512,513],{"class":140},"canal.instance.master.timestamp",[120,515,499],{"class":144},[120,517,519,522],{"class":122,"data-line":518,"line":518},13,[120,520,521],{"class":140},"canal.instance.master.gtid",[120,523,499],{"class":144},[120,525,527],{"class":122,"data-line":526,"line":526},14,[120,528,458],{"emptyLinePlaceholder":457},[120,530,532],{"class":122,"data-line":531,"line":531},15,[120,533,534],{"class":148},"# rds oss binlog\n",[120,536,538,541],{"class":122,"data-line":537,"line":537},16,[120,539,540],{"class":140},"canal.instance.rds.accesskey",[120,542,499],{"class":144},[120,544,546,549],{"class":122,"data-line":545,"line":545},17,[120,547,548],{"class":140},"canal.instance.rds.secretkey",[120,550,499],{"class":144},[120,552,554,557],{"class":122,"data-line":553,"line":553},18,[120,555,556],{"class":140},"canal.instance.rds.instanceId",[120,558,499],{"class":144},[120,560,562],{"class":122,"data-line":561,"line":561},19,[120,563,458],{"emptyLinePlaceholder":457},[120,565,567],{"class":122,"data-line":566,"line":566},20,[120,568,569],{"class":148},"# table meta tsdb info\n",[120,571,573,576],{"class":122,"data-line":572,"line":572},21,[120,574,575],{"class":140},"canal.instance.tsdb.enable",[120,577,578],{"class":144},"=true\n",[120,580,582],{"class":122,"data-line":581,"line":581},22,[120,583,584],{"class":148},"#canal.instance.tsdb.url=jdbc:mysql:\u002F\u002F127.0.0.1:3306\u002Fcanal_tsdb\n",[120,586,588,590],{"class":122,"data-line":587,"line":587},23,[120,589,420],{"class":140},[120,591,592],{"class":144},"=canal\n",[120,594,596,598],{"class":122,"data-line":595,"line":595},24,[120,597,426],{"class":140},[120,599,592],{"class":144},[10,601,602],{},"当然我还是推荐开发和测试阶段使用Docker搭建环境。",[10,604,605,606,609],{},"执行以下命令，拉取",[99,607,608],{"code":608},"canal-server","最新镜像。",[112,611,613],{"className":377,"code":612,"language":379,"meta":33,"style":33},"docker pull canal\u002Fcanal-server:latest\n",[99,614,615],{"__ignoreMap":33},[120,616,617,620,623],{"class":122,"data-line":123,"line":123},[120,618,619],{"class":130},"docker",[120,621,622],{"class":202}," pull",[120,624,625],{"class":202}," canal\u002Fcanal-server:latest\n",[10,627,628],{},"如果因网络问题无法直接拉取Docker镜像，也可以选择clone代码到本地编译。",[112,630,632],{"className":377,"code":631,"language":379,"meta":33,"style":33},"git clone git@github.com:alibaba\u002Fcanal.git\ncd canal\u002Fdocker && sh build.sh\n",[99,633,634,645],{"__ignoreMap":33},[120,635,636,639,642],{"class":122,"data-line":123,"line":123},[120,637,638],{"class":130},"git",[120,640,641],{"class":202}," clone",[120,643,644],{"class":202}," git@github.com:alibaba\u002Fcanal.git\n",[120,646,647,651,654,657,660],{"class":122,"data-line":137,"line":137},[120,648,650],{"class":649},"sj4cs","cd",[120,652,653],{"class":202}," canal\u002Fdocker",[120,655,656],{"class":144}," && ",[120,658,659],{"class":130},"sh",[120,661,662],{"class":202}," build.sh\n",[42,664,666],{"id":665},"docker-compose安装","docker compose安装",[668,669,671,672],"h4",{"id":670},"windows下安装本地测试canal开发环境","windows下安装本地测试canal",[120,673,674],{},"开发环境",[10,676,677,678],{},"配置",[99,679,680],{"code":680},"docker-compose.yaml",[112,682,686],{"className":683,"code":684,"language":685,"meta":33,"style":33},"language-yaml shiki shiki-themes github-light github-dark","version: '3.8'\nservices:\n  canal-server:\n    image: canal\u002Fcanal-server:latest\n    container_name: canal-server\n    ports:\n      - \"11111:11111\"\n    environment:\n      - canal.instance.master.address=host.docker.internal:13306\n      - canal.instance.dbUsername=root\n      - canal.instance.dbPassword=123456\n    restart: always\n","yaml",[99,687,688,700,708,718,732,746,757,771,782,795,808,821],{"__ignoreMap":33},[120,689,690,694,697],{"class":122,"data-line":123,"line":123},[120,691,693],{"class":692},"s9eBZ","version",[120,695,696],{"class":144},": ",[120,698,699],{"class":202},"'3.8'\n",[120,701,702,705],{"class":122,"data-line":137,"line":137},[120,703,704],{"class":692},"services",[120,706,707],{"class":144},":\n",[120,709,710,714,716],{"class":122,"data-line":152,"line":152},[120,711,713],{"class":712},"indent","  ",[120,715,608],{"class":692},[120,717,707],{"class":144},[120,719,720,722,724,727,729],{"class":122,"data-line":163,"line":163},[120,721,713],{"class":712},[120,723,713],{"class":712},[120,725,726],{"class":692},"image",[120,728,696],{"class":144},[120,730,731],{"class":202},"canal\u002Fcanal-server:latest\n",[120,733,734,736,738,741,743],{"class":122,"data-line":234,"line":234},[120,735,713],{"class":712},[120,737,713],{"class":712},[120,739,740],{"class":692},"container_name",[120,742,696],{"class":144},[120,744,745],{"class":202},"canal-server\n",[120,747,748,750,752,755],{"class":122,"data-line":246,"line":246},[120,749,713],{"class":712},[120,751,713],{"class":712},[120,753,754],{"class":692},"ports",[120,756,707],{"class":144},[120,758,759,761,763,765,768],{"class":122,"data-line":474,"line":474},[120,760,713],{"class":712},[120,762,713],{"class":712},[120,764,713],{"class":712},[120,766,767],{"class":144},"- ",[120,769,770],{"class":202},"\"11111:11111\"\n",[120,772,773,775,777,780],{"class":122,"data-line":479,"line":479},[120,774,713],{"class":712},[120,776,713],{"class":712},[120,778,779],{"class":692},"environment",[120,781,707],{"class":144},[120,783,784,786,788,790,792],{"class":122,"data-line":485,"line":485},[120,785,713],{"class":712},[120,787,713],{"class":712},[120,789,713],{"class":712},[120,791,767],{"class":144},[120,793,794],{"class":202},"canal.instance.master.address=host.docker.internal:13306\n",[120,796,797,799,801,803,805],{"class":122,"data-line":493,"line":493},[120,798,713],{"class":712},[120,800,713],{"class":712},[120,802,713],{"class":712},[120,804,767],{"class":144},[120,806,807],{"class":202},"canal.instance.dbUsername=root\n",[120,809,810,812,814,816,818],{"class":122,"data-line":502,"line":502},[120,811,713],{"class":712},[120,813,713],{"class":712},[120,815,713],{"class":712},[120,817,767],{"class":144},[120,819,820],{"class":202},"canal.instance.dbPassword=123456\n",[120,822,823,825,827,830,832],{"class":122,"data-line":510,"line":510},[120,824,713],{"class":712},[120,826,713],{"class":712},[120,828,829],{"class":692},"restart",[120,831,696],{"class":144},[120,833,834],{"class":202},"always\n",[10,836,837,838,843,844,408],{},"注意：如果是windows平台容器内使用",[21,839,842],{"href":840,"rel":841},"https:\u002F\u002Fdocs.docker.com\u002Fdesktop\u002Fnetworking\u002F#i-want-to-connect-from-a-container-to-a-service-on-the-host",[25],"host.docker.internal","表示",[99,845,846],{"code":846},"localhost",[10,848,849,850],{},"即：",[99,851,852],{"code":852},"canal.instance.master.address=host.docker.internal:13306",[668,854,856,857],{"id":855},"linux下部署生产环境","linux下部署",[120,858,859],{},"生产环境",[861,862,863],"blockquote",{},[10,864,865],{},"以mysql的方式持久化",[10,867,868],{},"配置docker-compose.yml",[112,870,872],{"className":683,"code":871,"language":685,"meta":33,"style":33},"version: '3.8'\nservices:\n  yabibi-canal-server:\n    image: canal\u002Fcanal-server:v1.1.8\n    container_name: yabibi-canal-server\n    ports:\n      - \"22221:11111\"\n    environment:\n      - canal.serverMode=tcp\n\n      # canal 同步的数据库\n      - canal.instance.master.address=192.168.0.1:3306\n      - canal.instance.dbUsername=canal\n      - canal.instance.dbPassword=canal\n      \n      # canal tsdb\n      - canal.instance.tsdb.enable=true\n      - canal.instance.tsdb.url=jdbc:mysql:\u002F\u002F192.168.0.1:3306\u002Fcanal_tsdb?useUnicode=true&characterEncoding=UTF-8&useSSL=false\n      - canal.instance.tsdb.dbUsername=canal\n      - canal.instance.tsdb.dbPassword=canal\n      - canal.instance.tsdb.spring.xml=classpath:spring\u002Ftsdb\u002Fmysql-tsdb.xml\n\n    volumes:\n      - .\u002Fcanal-data\u002Fcanal-log:\u002Fhome\u002Fadmin\u002Fcanal-server\u002Flogs\n\n    restart: always\n",[99,873,874,882,888,897,910,923,933,946,956,969,973,984,997,1010,1023,1033,1044,1057,1070,1083,1096,1109,1113,1124,1137,1142],{"__ignoreMap":33},[120,875,876,878,880],{"class":122,"data-line":123,"line":123},[120,877,693],{"class":692},[120,879,696],{"class":144},[120,881,699],{"class":202},[120,883,884,886],{"class":122,"data-line":137,"line":137},[120,885,704],{"class":692},[120,887,707],{"class":144},[120,889,890,892,895],{"class":122,"data-line":152,"line":152},[120,891,713],{"class":712},[120,893,894],{"class":692},"yabibi-canal-server",[120,896,707],{"class":144},[120,898,899,901,903,905,907],{"class":122,"data-line":163,"line":163},[120,900,713],{"class":712},[120,902,713],{"class":712},[120,904,726],{"class":692},[120,906,696],{"class":144},[120,908,909],{"class":202},"canal\u002Fcanal-server:v1.1.8\n",[120,911,912,914,916,918,920],{"class":122,"data-line":234,"line":234},[120,913,713],{"class":712},[120,915,713],{"class":712},[120,917,740],{"class":692},[120,919,696],{"class":144},[120,921,922],{"class":202},"yabibi-canal-server\n",[120,924,925,927,929,931],{"class":122,"data-line":246,"line":246},[120,926,713],{"class":712},[120,928,713],{"class":712},[120,930,754],{"class":692},[120,932,707],{"class":144},[120,934,935,937,939,941,943],{"class":122,"data-line":474,"line":474},[120,936,713],{"class":712},[120,938,713],{"class":712},[120,940,713],{"class":712},[120,942,767],{"class":144},[120,944,945],{"class":202},"\"22221:11111\"\n",[120,947,948,950,952,954],{"class":122,"data-line":479,"line":479},[120,949,713],{"class":712},[120,951,713],{"class":712},[120,953,779],{"class":692},[120,955,707],{"class":144},[120,957,958,960,962,964,966],{"class":122,"data-line":485,"line":485},[120,959,713],{"class":712},[120,961,713],{"class":712},[120,963,713],{"class":712},[120,965,767],{"class":144},[120,967,968],{"class":202},"canal.serverMode=tcp\n",[120,970,971],{"class":122,"data-line":493,"line":493},[120,972,458],{"emptyLinePlaceholder":457},[120,974,975,977,979,981],{"class":122,"data-line":502,"line":502},[120,976,713],{"class":712},[120,978,713],{"class":712},[120,980,713],{"class":712},[120,982,983],{"class":148},"# canal 同步的数据库\n",[120,985,986,988,990,992,994],{"class":122,"data-line":510,"line":510},[120,987,713],{"class":712},[120,989,713],{"class":712},[120,991,713],{"class":712},[120,993,767],{"class":144},[120,995,996],{"class":202},"canal.instance.master.address=192.168.0.1:3306\n",[120,998,999,1001,1003,1005,1007],{"class":122,"data-line":518,"line":518},[120,1000,713],{"class":712},[120,1002,713],{"class":712},[120,1004,713],{"class":712},[120,1006,767],{"class":144},[120,1008,1009],{"class":202},"canal.instance.dbUsername=canal\n",[120,1011,1012,1014,1016,1018,1020],{"class":122,"data-line":526,"line":526},[120,1013,713],{"class":712},[120,1015,713],{"class":712},[120,1017,713],{"class":712},[120,1019,767],{"class":144},[120,1021,1022],{"class":202},"canal.instance.dbPassword=canal\n",[120,1024,1025,1027,1029,1031],{"class":122,"data-line":531,"line":531},[120,1026,713],{"class":712},[120,1028,713],{"class":712},[120,1030,713],{"class":712},[120,1032],{"class":144},[120,1034,1035,1037,1039,1041],{"class":122,"data-line":537,"line":537},[120,1036,713],{"class":712},[120,1038,713],{"class":712},[120,1040,713],{"class":712},[120,1042,1043],{"class":148},"# canal tsdb\n",[120,1045,1046,1048,1050,1052,1054],{"class":122,"data-line":545,"line":545},[120,1047,713],{"class":712},[120,1049,713],{"class":712},[120,1051,713],{"class":712},[120,1053,767],{"class":144},[120,1055,1056],{"class":202},"canal.instance.tsdb.enable=true\n",[120,1058,1059,1061,1063,1065,1067],{"class":122,"data-line":553,"line":553},[120,1060,713],{"class":712},[120,1062,713],{"class":712},[120,1064,713],{"class":712},[120,1066,767],{"class":144},[120,1068,1069],{"class":202},"canal.instance.tsdb.url=jdbc:mysql:\u002F\u002F192.168.0.1:3306\u002Fcanal_tsdb?useUnicode=true&characterEncoding=UTF-8&useSSL=false\n",[120,1071,1072,1074,1076,1078,1080],{"class":122,"data-line":561,"line":561},[120,1073,713],{"class":712},[120,1075,713],{"class":712},[120,1077,713],{"class":712},[120,1079,767],{"class":144},[120,1081,1082],{"class":202},"canal.instance.tsdb.dbUsername=canal\n",[120,1084,1085,1087,1089,1091,1093],{"class":122,"data-line":566,"line":566},[120,1086,713],{"class":712},[120,1088,713],{"class":712},[120,1090,713],{"class":712},[120,1092,767],{"class":144},[120,1094,1095],{"class":202},"canal.instance.tsdb.dbPassword=canal\n",[120,1097,1098,1100,1102,1104,1106],{"class":122,"data-line":572,"line":572},[120,1099,713],{"class":712},[120,1101,713],{"class":712},[120,1103,713],{"class":712},[120,1105,767],{"class":144},[120,1107,1108],{"class":202},"canal.instance.tsdb.spring.xml=classpath:spring\u002Ftsdb\u002Fmysql-tsdb.xml\n",[120,1110,1111],{"class":122,"data-line":581,"line":581},[120,1112,458],{"emptyLinePlaceholder":457},[120,1114,1115,1117,1119,1122],{"class":122,"data-line":587,"line":587},[120,1116,713],{"class":712},[120,1118,713],{"class":712},[120,1120,1121],{"class":692},"volumes",[120,1123,707],{"class":144},[120,1125,1126,1128,1130,1132,1134],{"class":122,"data-line":595,"line":595},[120,1127,713],{"class":712},[120,1129,713],{"class":712},[120,1131,713],{"class":712},[120,1133,767],{"class":144},[120,1135,1136],{"class":202},".\u002Fcanal-data\u002Fcanal-log:\u002Fhome\u002Fadmin\u002Fcanal-server\u002Flogs\n",[120,1138,1140],{"class":122,"data-line":1139,"line":1139},25,[120,1141,458],{"emptyLinePlaceholder":457},[120,1143,1145,1147,1149,1151,1153],{"class":122,"data-line":1144,"line":1144},26,[120,1146,713],{"class":712},[120,1148,713],{"class":712},[120,1150,829],{"class":692},[120,1152,696],{"class":144},[120,1154,834],{"class":202},[10,1156,1157],{},"创建数据库并赋予canal用户操作权限",[112,1159,1161],{"className":181,"code":1160,"language":183,"meta":33,"style":33},"CREATE DATABASE canal_tsdb CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;\nGRANT ALL PRIVILEGES ON canal_tsdb.* TO 'canal'@'%';\nFLUSH PRIVILEGES;\n",[99,1162,1163,1188,1212],{"__ignoreMap":33},[120,1164,1165,1167,1170,1173,1176,1179,1182,1185],{"class":122,"data-line":123,"line":123},[120,1166,287],{"class":140},[120,1168,1169],{"class":140}," DATABASE",[120,1171,1172],{"class":130}," canal_tsdb",[120,1174,1175],{"class":140}," CHARACTER",[120,1177,1178],{"class":140}," SET",[120,1180,1181],{"class":144}," utf8mb4 ",[120,1183,1184],{"class":140},"COLLATE",[120,1186,1187],{"class":144}," utf8mb4_general_ci;\n",[120,1189,1190,1192,1195,1197,1200,1202,1204,1206,1208,1210],{"class":122,"data-line":137,"line":137},[120,1191,310],{"class":140},[120,1193,1194],{"class":144}," ALL PRIVILEGES ",[120,1196,240],{"class":140},[120,1198,1199],{"class":144}," canal_tsdb.",[120,1201,327],{"class":140},[120,1203,330],{"class":140},[120,1205,302],{"class":202},[120,1207,335],{"class":144},[120,1209,338],{"class":202},[120,1211,206],{"class":144},[120,1213,1214],{"class":122,"data-line":152,"line":152},[120,1215,350],{"class":144},[10,1217,1218],{},"前往数据库新建两个表:",[112,1220,1222],{"className":181,"code":1221,"language":183,"meta":33,"style":33},"CREATE TABLE IF NOT EXISTS `meta_snapshot` (\n  `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',\n  `gmt_create` DATETIME NOT NULL COMMENT '创建时间',\n  `gmt_modified` DATETIME NOT NULL COMMENT '修改时间',\n  `destination` VARCHAR(128) DEFAULT NULL COMMENT '通道名称',\n  `binlog_file` VARCHAR(64) DEFAULT NULL COMMENT 'binlog 文件名',\n  `binlog_offest` BIGINT(20) DEFAULT NULL COMMENT 'binlog 偏移量',\n  `binlog_master_id` VARCHAR(64) DEFAULT NULL COMMENT 'binlog 节点 id',\n  `binlog_timestamp` BIGINT(20) DEFAULT NULL COMMENT 'binlog 应用的时间戳',\n  `data` LONGTEXT COMMENT '表结构快照数据',\n  `extra` TEXT COMMENT '额外扩展信息',\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `binlog_file_offest` (`destination`,`binlog_master_id`,`binlog_file`,`binlog_offest`),\n  KEY `destination` (`destination`),\n  KEY `destination_timestamp` (`destination`,`binlog_timestamp`),\n  KEY `gmt_modified` (`gmt_modified`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='TSDB 表结构快照表';\n\nCREATE TABLE IF NOT EXISTS `meta_history` (\n  `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',\n  `gmt_create` DATETIME NOT NULL COMMENT '创建时间',\n  `gmt_modified` DATETIME NOT NULL COMMENT '修改时间',\n  `destination` VARCHAR(128) DEFAULT NULL COMMENT '通道名称',\n  `binlog_file` VARCHAR(64) DEFAULT NULL COMMENT 'binlog 文件名',\n  `binlog_offest` BIGINT(20) DEFAULT NULL COMMENT 'binlog 偏移量',\n  `binlog_master_id` VARCHAR(64) DEFAULT NULL COMMENT 'binlog 节点 id',\n  `binlog_timestamp` BIGINT(20) DEFAULT NULL COMMENT 'binlog 应用的时间戳',\n  `use_schema` VARCHAR(1024) DEFAULT NULL COMMENT '执行时 schema',\n  `sql_schema` VARCHAR(1024) DEFAULT NULL COMMENT '对应的 schema',\n  `sql_table` VARCHAR(1024) DEFAULT NULL COMMENT '对应的 table',\n  `sql_text` LONGTEXT COMMENT '执行的 SQL',\n  `sql_type` VARCHAR(256) DEFAULT NULL COMMENT 'SQL 类型',\n  `extra` TEXT COMMENT '额外扩展信息',\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `binlog_file_offest` (`destination`,`binlog_master_id`,`binlog_file`,`binlog_offest`),\n  KEY `destination` (`destination`),\n  KEY `destination_timestamp` (`destination`,`binlog_timestamp`),\n  KEY `gmt_modified` (`gmt_modified`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='TSDB 表结构历史变化表';\n",[99,1223,1224,1249,1284,1305,1323,1355,1384,1412,1440,1468,1483,1500,1517,1553,1573,1596,1614,1644,1648,1667,1691,1707,1723,1749,1775,1801,1827,1854,1884,1913,1942,1957,1987,2002,2019,2052,2071,2094,2111],{"__ignoreMap":33},[120,1225,1226,1228,1231,1234,1237,1240,1243,1246],{"class":122,"data-line":123,"line":123},[120,1227,287],{"class":140},[120,1229,1230],{"class":140}," TABLE",[120,1232,1233],{"class":130}," IF",[120,1235,1236],{"class":140}," NOT",[120,1238,1239],{"class":140}," EXISTS",[120,1241,1242],{"class":202}," `meta_snapshot`",[120,1244,1245],{"class":144}," ",[120,1247,1248],{"class":126},"(\n",[120,1250,1251,1253,1256,1259,1263,1266,1269,1272,1275,1278,1281],{"class":122,"data-line":137,"line":137},[120,1252,713],{"class":712},[120,1254,1255],{"class":202},"`id`",[120,1257,1258],{"class":140}," BIGINT",[120,1260,1262],{"class":1261},"sJX2D","(",[120,1264,1265],{"class":649},"20",[120,1267,1268],{"class":1261},")",[120,1270,1271],{"class":144}," UNSIGNED ",[120,1273,1274],{"class":140},"NOT NULL",[120,1276,1277],{"class":144}," AUTO_INCREMENT COMMENT ",[120,1279,1280],{"class":202},"'主键'",[120,1282,1283],{"class":144},",\n",[120,1285,1286,1288,1291,1294,1297,1300,1303],{"class":122,"data-line":152,"line":152},[120,1287,713],{"class":712},[120,1289,1290],{"class":202},"`gmt_create`",[120,1292,1293],{"class":140}," DATETIME",[120,1295,1296],{"class":140}," NOT NULL",[120,1298,1299],{"class":144}," COMMENT ",[120,1301,1302],{"class":202},"'创建时间'",[120,1304,1283],{"class":144},[120,1306,1307,1309,1312,1314,1316,1318,1321],{"class":122,"data-line":163,"line":163},[120,1308,713],{"class":712},[120,1310,1311],{"class":202},"`gmt_modified`",[120,1313,1293],{"class":140},[120,1315,1296],{"class":140},[120,1317,1299],{"class":144},[120,1319,1320],{"class":202},"'修改时间'",[120,1322,1283],{"class":144},[120,1324,1325,1327,1330,1333,1335,1338,1340,1342,1345,1348,1350,1353],{"class":122,"data-line":234,"line":234},[120,1326,713],{"class":712},[120,1328,1329],{"class":202},"`destination`",[120,1331,1332],{"class":140}," VARCHAR",[120,1334,1262],{"class":1261},[120,1336,1337],{"class":649},"128",[120,1339,1268],{"class":1261},[120,1341,1245],{"class":144},[120,1343,1344],{"class":140},"DEFAULT",[120,1346,1347],{"class":140}," NULL",[120,1349,1299],{"class":144},[120,1351,1352],{"class":202},"'通道名称'",[120,1354,1283],{"class":144},[120,1356,1357,1359,1362,1364,1366,1369,1371,1373,1375,1377,1379,1382],{"class":122,"data-line":246,"line":246},[120,1358,713],{"class":712},[120,1360,1361],{"class":202},"`binlog_file`",[120,1363,1332],{"class":140},[120,1365,1262],{"class":1261},[120,1367,1368],{"class":649},"64",[120,1370,1268],{"class":1261},[120,1372,1245],{"class":144},[120,1374,1344],{"class":140},[120,1376,1347],{"class":140},[120,1378,1299],{"class":144},[120,1380,1381],{"class":202},"'binlog 文件名'",[120,1383,1283],{"class":144},[120,1385,1386,1388,1391,1393,1395,1397,1399,1401,1403,1405,1407,1410],{"class":122,"data-line":474,"line":474},[120,1387,713],{"class":712},[120,1389,1390],{"class":202},"`binlog_offest`",[120,1392,1258],{"class":140},[120,1394,1262],{"class":1261},[120,1396,1265],{"class":649},[120,1398,1268],{"class":1261},[120,1400,1245],{"class":144},[120,1402,1344],{"class":140},[120,1404,1347],{"class":140},[120,1406,1299],{"class":144},[120,1408,1409],{"class":202},"'binlog 偏移量'",[120,1411,1283],{"class":144},[120,1413,1414,1416,1419,1421,1423,1425,1427,1429,1431,1433,1435,1438],{"class":122,"data-line":479,"line":479},[120,1415,713],{"class":712},[120,1417,1418],{"class":202},"`binlog_master_id`",[120,1420,1332],{"class":140},[120,1422,1262],{"class":1261},[120,1424,1368],{"class":649},[120,1426,1268],{"class":1261},[120,1428,1245],{"class":144},[120,1430,1344],{"class":140},[120,1432,1347],{"class":140},[120,1434,1299],{"class":144},[120,1436,1437],{"class":202},"'binlog 节点 id'",[120,1439,1283],{"class":144},[120,1441,1442,1444,1447,1449,1451,1453,1455,1457,1459,1461,1463,1466],{"class":122,"data-line":485,"line":485},[120,1443,713],{"class":712},[120,1445,1446],{"class":202},"`binlog_timestamp`",[120,1448,1258],{"class":140},[120,1450,1262],{"class":1261},[120,1452,1265],{"class":649},[120,1454,1268],{"class":1261},[120,1456,1245],{"class":144},[120,1458,1344],{"class":140},[120,1460,1347],{"class":140},[120,1462,1299],{"class":144},[120,1464,1465],{"class":202},"'binlog 应用的时间戳'",[120,1467,1283],{"class":144},[120,1469,1470,1472,1475,1478,1481],{"class":122,"data-line":493,"line":493},[120,1471,713],{"class":712},[120,1473,1474],{"class":202},"`data`",[120,1476,1477],{"class":144}," LONGTEXT COMMENT ",[120,1479,1480],{"class":202},"'表结构快照数据'",[120,1482,1283],{"class":144},[120,1484,1485,1487,1490,1493,1495,1498],{"class":122,"data-line":502,"line":502},[120,1486,713],{"class":712},[120,1488,1489],{"class":202},"`extra`",[120,1491,1492],{"class":140}," TEXT",[120,1494,1299],{"class":144},[120,1496,1497],{"class":202},"'额外扩展信息'",[120,1499,1283],{"class":144},[120,1501,1502,1504,1507,1509,1511,1513,1515],{"class":122,"data-line":510,"line":510},[120,1503,713],{"class":712},[120,1505,1506],{"class":140},"PRIMARY KEY",[120,1508,1245],{"class":144},[120,1510,1262],{"class":1261},[120,1512,1255],{"class":202},[120,1514,1268],{"class":1261},[120,1516,1283],{"class":144},[120,1518,1519,1521,1524,1527,1530,1532,1534,1536,1539,1541,1543,1545,1547,1549,1551],{"class":122,"data-line":518,"line":518},[120,1520,713],{"class":712},[120,1522,1523],{"class":140},"UNIQUE",[120,1525,1526],{"class":140}," KEY",[120,1528,1529],{"class":202}," `binlog_file_offest`",[120,1531,1245],{"class":144},[120,1533,1262],{"class":1261},[120,1535,1329],{"class":202},[120,1537,1538],{"class":144},",",[120,1540,1418],{"class":202},[120,1542,1538],{"class":144},[120,1544,1361],{"class":202},[120,1546,1538],{"class":144},[120,1548,1390],{"class":202},[120,1550,1268],{"class":1261},[120,1552,1283],{"class":144},[120,1554,1555,1557,1560,1563,1565,1567,1569,1571],{"class":122,"data-line":526,"line":526},[120,1556,713],{"class":712},[120,1558,1559],{"class":140},"KEY",[120,1561,1562],{"class":202}," `destination`",[120,1564,1245],{"class":144},[120,1566,1262],{"class":1261},[120,1568,1329],{"class":202},[120,1570,1268],{"class":1261},[120,1572,1283],{"class":144},[120,1574,1575,1577,1579,1582,1584,1586,1588,1590,1592,1594],{"class":122,"data-line":531,"line":531},[120,1576,713],{"class":712},[120,1578,1559],{"class":140},[120,1580,1581],{"class":202}," `destination_timestamp`",[120,1583,1245],{"class":144},[120,1585,1262],{"class":1261},[120,1587,1329],{"class":202},[120,1589,1538],{"class":144},[120,1591,1446],{"class":202},[120,1593,1268],{"class":1261},[120,1595,1283],{"class":144},[120,1597,1598,1600,1602,1605,1607,1609,1611],{"class":122,"data-line":537,"line":537},[120,1599,713],{"class":712},[120,1601,1559],{"class":140},[120,1603,1604],{"class":202}," `gmt_modified`",[120,1606,1245],{"class":144},[120,1608,1262],{"class":1261},[120,1610,1311],{"class":202},[120,1612,1613],{"class":1261},")\n",[120,1615,1616,1618,1621,1624,1627,1629,1632,1634,1637,1639,1642],{"class":122,"data-line":545,"line":545},[120,1617,1268],{"class":126},[120,1619,1620],{"class":144}," ENGINE",[120,1622,1623],{"class":140},"=",[120,1625,1626],{"class":144},"InnoDB ",[120,1628,1344],{"class":140},[120,1630,1631],{"class":144}," CHARSET",[120,1633,1623],{"class":140},[120,1635,1636],{"class":144},"utf8mb4 COMMENT",[120,1638,1623],{"class":140},[120,1640,1641],{"class":202},"'TSDB 表结构快照表'",[120,1643,206],{"class":144},[120,1645,1646],{"class":122,"data-line":553,"line":553},[120,1647,458],{"emptyLinePlaceholder":457},[120,1649,1650,1652,1654,1656,1658,1660,1663,1665],{"class":122,"data-line":561,"line":561},[120,1651,287],{"class":140},[120,1653,1230],{"class":140},[120,1655,1233],{"class":130},[120,1657,1236],{"class":140},[120,1659,1239],{"class":140},[120,1661,1662],{"class":202}," `meta_history`",[120,1664,1245],{"class":144},[120,1666,1248],{"class":126},[120,1668,1669,1671,1673,1675,1677,1679,1681,1683,1685,1687,1689],{"class":122,"data-line":566,"line":566},[120,1670,713],{"class":712},[120,1672,1255],{"class":202},[120,1674,1258],{"class":140},[120,1676,1262],{"class":1261},[120,1678,1265],{"class":649},[120,1680,1268],{"class":1261},[120,1682,1271],{"class":144},[120,1684,1274],{"class":140},[120,1686,1277],{"class":144},[120,1688,1280],{"class":202},[120,1690,1283],{"class":144},[120,1692,1693,1695,1697,1699,1701,1703,1705],{"class":122,"data-line":572,"line":572},[120,1694,713],{"class":712},[120,1696,1290],{"class":202},[120,1698,1293],{"class":140},[120,1700,1296],{"class":140},[120,1702,1299],{"class":144},[120,1704,1302],{"class":202},[120,1706,1283],{"class":144},[120,1708,1709,1711,1713,1715,1717,1719,1721],{"class":122,"data-line":581,"line":581},[120,1710,713],{"class":712},[120,1712,1311],{"class":202},[120,1714,1293],{"class":140},[120,1716,1296],{"class":140},[120,1718,1299],{"class":144},[120,1720,1320],{"class":202},[120,1722,1283],{"class":144},[120,1724,1725,1727,1729,1731,1733,1735,1737,1739,1741,1743,1745,1747],{"class":122,"data-line":587,"line":587},[120,1726,713],{"class":712},[120,1728,1329],{"class":202},[120,1730,1332],{"class":140},[120,1732,1262],{"class":1261},[120,1734,1337],{"class":649},[120,1736,1268],{"class":1261},[120,1738,1245],{"class":144},[120,1740,1344],{"class":140},[120,1742,1347],{"class":140},[120,1744,1299],{"class":144},[120,1746,1352],{"class":202},[120,1748,1283],{"class":144},[120,1750,1751,1753,1755,1757,1759,1761,1763,1765,1767,1769,1771,1773],{"class":122,"data-line":595,"line":595},[120,1752,713],{"class":712},[120,1754,1361],{"class":202},[120,1756,1332],{"class":140},[120,1758,1262],{"class":1261},[120,1760,1368],{"class":649},[120,1762,1268],{"class":1261},[120,1764,1245],{"class":144},[120,1766,1344],{"class":140},[120,1768,1347],{"class":140},[120,1770,1299],{"class":144},[120,1772,1381],{"class":202},[120,1774,1283],{"class":144},[120,1776,1777,1779,1781,1783,1785,1787,1789,1791,1793,1795,1797,1799],{"class":122,"data-line":1139,"line":1139},[120,1778,713],{"class":712},[120,1780,1390],{"class":202},[120,1782,1258],{"class":140},[120,1784,1262],{"class":1261},[120,1786,1265],{"class":649},[120,1788,1268],{"class":1261},[120,1790,1245],{"class":144},[120,1792,1344],{"class":140},[120,1794,1347],{"class":140},[120,1796,1299],{"class":144},[120,1798,1409],{"class":202},[120,1800,1283],{"class":144},[120,1802,1803,1805,1807,1809,1811,1813,1815,1817,1819,1821,1823,1825],{"class":122,"data-line":1144,"line":1144},[120,1804,713],{"class":712},[120,1806,1418],{"class":202},[120,1808,1332],{"class":140},[120,1810,1262],{"class":1261},[120,1812,1368],{"class":649},[120,1814,1268],{"class":1261},[120,1816,1245],{"class":144},[120,1818,1344],{"class":140},[120,1820,1347],{"class":140},[120,1822,1299],{"class":144},[120,1824,1437],{"class":202},[120,1826,1283],{"class":144},[120,1828,1830,1832,1834,1836,1838,1840,1842,1844,1846,1848,1850,1852],{"class":122,"data-line":1829,"line":1829},27,[120,1831,713],{"class":712},[120,1833,1446],{"class":202},[120,1835,1258],{"class":140},[120,1837,1262],{"class":1261},[120,1839,1265],{"class":649},[120,1841,1268],{"class":1261},[120,1843,1245],{"class":144},[120,1845,1344],{"class":140},[120,1847,1347],{"class":140},[120,1849,1299],{"class":144},[120,1851,1465],{"class":202},[120,1853,1283],{"class":144},[120,1855,1857,1859,1862,1864,1866,1869,1871,1873,1875,1877,1879,1882],{"class":122,"data-line":1856,"line":1856},28,[120,1858,713],{"class":712},[120,1860,1861],{"class":202},"`use_schema`",[120,1863,1332],{"class":140},[120,1865,1262],{"class":1261},[120,1867,1868],{"class":649},"1024",[120,1870,1268],{"class":1261},[120,1872,1245],{"class":144},[120,1874,1344],{"class":140},[120,1876,1347],{"class":140},[120,1878,1299],{"class":144},[120,1880,1881],{"class":202},"'执行时 schema'",[120,1883,1283],{"class":144},[120,1885,1887,1889,1892,1894,1896,1898,1900,1902,1904,1906,1908,1911],{"class":122,"data-line":1886,"line":1886},29,[120,1888,713],{"class":712},[120,1890,1891],{"class":202},"`sql_schema`",[120,1893,1332],{"class":140},[120,1895,1262],{"class":1261},[120,1897,1868],{"class":649},[120,1899,1268],{"class":1261},[120,1901,1245],{"class":144},[120,1903,1344],{"class":140},[120,1905,1347],{"class":140},[120,1907,1299],{"class":144},[120,1909,1910],{"class":202},"'对应的 schema'",[120,1912,1283],{"class":144},[120,1914,1916,1918,1921,1923,1925,1927,1929,1931,1933,1935,1937,1940],{"class":122,"data-line":1915,"line":1915},30,[120,1917,713],{"class":712},[120,1919,1920],{"class":202},"`sql_table`",[120,1922,1332],{"class":140},[120,1924,1262],{"class":1261},[120,1926,1868],{"class":649},[120,1928,1268],{"class":1261},[120,1930,1245],{"class":144},[120,1932,1344],{"class":140},[120,1934,1347],{"class":140},[120,1936,1299],{"class":144},[120,1938,1939],{"class":202},"'对应的 table'",[120,1941,1283],{"class":144},[120,1943,1945,1947,1950,1952,1955],{"class":122,"data-line":1944,"line":1944},31,[120,1946,713],{"class":712},[120,1948,1949],{"class":202},"`sql_text`",[120,1951,1477],{"class":144},[120,1953,1954],{"class":202},"'执行的 SQL'",[120,1956,1283],{"class":144},[120,1958,1960,1962,1965,1967,1969,1972,1974,1976,1978,1980,1982,1985],{"class":122,"data-line":1959,"line":1959},32,[120,1961,713],{"class":712},[120,1963,1964],{"class":202},"`sql_type`",[120,1966,1332],{"class":140},[120,1968,1262],{"class":1261},[120,1970,1971],{"class":649},"256",[120,1973,1268],{"class":1261},[120,1975,1245],{"class":144},[120,1977,1344],{"class":140},[120,1979,1347],{"class":140},[120,1981,1299],{"class":144},[120,1983,1984],{"class":202},"'SQL 类型'",[120,1986,1283],{"class":144},[120,1988,1990,1992,1994,1996,1998,2000],{"class":122,"data-line":1989,"line":1989},33,[120,1991,713],{"class":712},[120,1993,1489],{"class":202},[120,1995,1492],{"class":140},[120,1997,1299],{"class":144},[120,1999,1497],{"class":202},[120,2001,1283],{"class":144},[120,2003,2005,2007,2009,2011,2013,2015,2017],{"class":122,"data-line":2004,"line":2004},34,[120,2006,713],{"class":712},[120,2008,1506],{"class":140},[120,2010,1245],{"class":144},[120,2012,1262],{"class":1261},[120,2014,1255],{"class":202},[120,2016,1268],{"class":1261},[120,2018,1283],{"class":144},[120,2020,2022,2024,2026,2028,2030,2032,2034,2036,2038,2040,2042,2044,2046,2048,2050],{"class":122,"data-line":2021,"line":2021},35,[120,2023,713],{"class":712},[120,2025,1523],{"class":140},[120,2027,1526],{"class":140},[120,2029,1529],{"class":202},[120,2031,1245],{"class":144},[120,2033,1262],{"class":1261},[120,2035,1329],{"class":202},[120,2037,1538],{"class":144},[120,2039,1418],{"class":202},[120,2041,1538],{"class":144},[120,2043,1361],{"class":202},[120,2045,1538],{"class":144},[120,2047,1390],{"class":202},[120,2049,1268],{"class":1261},[120,2051,1283],{"class":144},[120,2053,2055,2057,2059,2061,2063,2065,2067,2069],{"class":122,"data-line":2054,"line":2054},36,[120,2056,713],{"class":712},[120,2058,1559],{"class":140},[120,2060,1562],{"class":202},[120,2062,1245],{"class":144},[120,2064,1262],{"class":1261},[120,2066,1329],{"class":202},[120,2068,1268],{"class":1261},[120,2070,1283],{"class":144},[120,2072,2074,2076,2078,2080,2082,2084,2086,2088,2090,2092],{"class":122,"data-line":2073,"line":2073},37,[120,2075,713],{"class":712},[120,2077,1559],{"class":140},[120,2079,1581],{"class":202},[120,2081,1245],{"class":144},[120,2083,1262],{"class":1261},[120,2085,1329],{"class":202},[120,2087,1538],{"class":144},[120,2089,1446],{"class":202},[120,2091,1268],{"class":1261},[120,2093,1283],{"class":144},[120,2095,2097,2099,2101,2103,2105,2107,2109],{"class":122,"data-line":2096,"line":2096},38,[120,2098,713],{"class":712},[120,2100,1559],{"class":140},[120,2102,1604],{"class":202},[120,2104,1245],{"class":144},[120,2106,1262],{"class":1261},[120,2108,1311],{"class":202},[120,2110,1613],{"class":1261},[120,2112,2114,2116,2118,2120,2122,2124,2126,2128,2130,2132,2135],{"class":122,"data-line":2113,"line":2113},39,[120,2115,1268],{"class":126},[120,2117,1620],{"class":144},[120,2119,1623],{"class":140},[120,2121,1626],{"class":144},[120,2123,1344],{"class":140},[120,2125,1631],{"class":144},[120,2127,1623],{"class":140},[120,2129,1636],{"class":144},[120,2131,1623],{"class":140},[120,2133,2134],{"class":202},"'TSDB 表结构历史变化表'",[120,2136,206],{"class":144},[47,2138,2139,2145],{},[50,2140,2141],{},[21,2142,2143],{"href":2143,"rel":2144},"https:\u002F\u002Fgithub.com\u002Falibaba\u002Fcanal\u002Fblob\u002Fmaster\u002Fdeployer\u002Fsrc\u002Fmain\u002Fresources\u002Fcanal.properties",[25],[50,2146,2147],{},[21,2148,2149],{"href":2149,"rel":2150},"https:\u002F\u002Fwww.cnblogs.com\u002FLQBlog\u002Fp\u002F14582469.html",[25],[10,2152,2153],{},"修改完配置后重启容器。",[112,2155,2157],{"className":377,"code":2156,"language":379,"meta":33,"style":33},"docker-compose restart\n",[99,2158,2159],{"__ignoreMap":33},[120,2160,2161,2164],{"class":122,"data-line":123,"line":123},[120,2162,2163],{"class":130},"docker-compose",[120,2165,2166],{"class":202}," restart\n",[14,2168,2170],{"id":2169},"canal-client","Canal Client",[10,2172,2173],{},"Canal 特别设计了 Client-Server 模式，交互协议使用 protobuf v3 , Client 端可采用不同语言实现不同的消费逻辑。",[10,2175,2176,2177,2182],{},"启动Canal Server之后，我们可以使用Canal客户端连接Canal进行消费，本文以Go客户端",[21,2178,2181],{"href":2179,"rel":2180},"https:\u002F\u002Fgithub.com\u002FQ1mi\u002Fcanal-go",[25],"canal-go","为例，演示如何从 canal-server 消费数据。",[112,2184,2188],{"className":2185,"code":2186,"language":2187,"meta":33,"style":33},"language-go shiki shiki-themes github-light github-dark","package main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\tpbe \"github.com\u002FQ1mi\u002Fcanal-go\u002Fprotocol\u002Fentry\"\n\n\t\"github.com\u002FQ1mi\u002Fcanal-go\u002Fclient\"\n\t\"google.golang.org\u002Fprotobuf\u002Fproto\"\n)\n\n\u002F\u002F canal-go client demo\n\nfunc main() {\n\t\u002F\u002F 连接canal-server\n\t\u002F\u002F 请修改为你的 canal-server 配置\n\tconnector := client.NewSimpleCanalConnector(\n\t\t\"127.0.0.1\", 11111, \"\", \"\", \"example\", 60000, 60*60*1000)\n\terr := connector.Connect()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\t\u002F\u002F mysql 数据解析关注的表，Perl正则表达式.\n\terr = connector.Subscribe(\".*\\\\..*\")\n\tif err != nil {\n\t\tfmt.Printf(\"connector.Subscribe failed, err:%v\\n\", err)\n\t\tpanic(err)\n\t}\n\n\t\u002F\u002F 消费消息\n\tfor {\n\t\tmessage, err := connector.Get(100, nil, nil)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"connector.Get failed, err:%v\\n\", err)\n\t\t\tcontinue\n\t\t}\n\t\tbatchId := message.Id\n\t\tif batchId == -1 || len(message.Entries) \u003C= 0 {\n\t\t\ttime.Sleep(time.Second)\n\t\t\tfmt.Println(\"===暂无数据===\")\n\t\t\tcontinue\n\t\t}\n\t\tprintEntry(message.Entries)\n\t}\n}\n\nfunc printEntry(entries []*pbe.Entry) {\n\tfor _, entry := range entries {\n\t\t\u002F\u002F 忽略事务开启和事务关闭类型\n\t\tif entry.GetEntryType() == pbe.EntryType_TRANSACTIONBEGIN ||\n\t\t\tentry.GetEntryType() == pbe.EntryType_TRANSACTIONEND {\n\t\t\tcontinue\n\t\t}\n\t\t\u002F\u002F RowChange对象，包含了一行数据变化的所有特征\n\t\trowChange := new(pbe.RowChange)\n\t\t\u002F\u002F protobuf解析\n\t\terr := proto.Unmarshal(entry.GetStoreValue(), rowChange)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"proto.Unmarshal failed, err:%v\\n\", err)\n\t\t}\n\t\tif rowChange == nil {\n\t\t\tcontinue\n\t\t}\n\t\t\u002F\u002F 获取并打印Header信息\n\t\theader := entry.GetHeader()\n\t\tfmt.Printf(\"binlog[%s : %d], name[%s,%s], eventType: %s\\n\",\n\t\t\theader.GetLogfileName(),\n\t\t\theader.GetLogfileOffset(),\n\t\t\theader.GetSchemaName(),\n\t\t\theader.GetTableName(),\n\t\t\theader.GetEventType(),\n\t\t)\n\t\t\u002F\u002F判断是否为DDL语句\n\t\tif rowChange.GetIsDdl() {\n\t\t\tfmt.Printf(\"isDdl:true, sql:%v\\n\", rowChange.GetSql())\n\t\t}\n\n\t\t\u002F\u002F 获取操作类型：insert\u002Fupdate\u002Fdelete等\n\t\teventType := rowChange.GetEventType()\n\t\tfor _, rowData := range rowChange.GetRowDatas() {\n\t\t\tif eventType == pbe.EventType_DELETE {\n\t\t\t\tprintColumn(rowData.GetBeforeColumns())\n\t\t\t} else if eventType == pbe.EventType_INSERT || eventType == pbe.EventType_UPDATE {\n\t\t\t\tprintColumn(rowData.GetAfterColumns())\n\t\t\t} else {\n\t\t\t\tfmt.Println(\"---before---\")\n\t\t\t\tprintColumn(rowData.GetBeforeColumns())\n\t\t\t\tfmt.Println(\"---after---\")\n\t\t\t\tprintColumn(rowData.GetAfterColumns())\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc printColumn(columns []*pbe.Column) {\n\tfor _, col := range columns {\n\t\tfmt.Printf(\"%s:%s  updated=%v\\n\", col.GetName(), col.GetValue(), col.GetUpdated())\n\t}\n}\n","go",[99,2189,2190,2198,2202,2211,2225,2236,2240,2254,2258,2269,2280,2284,2288,2293,2297,2314,2321,2328,2346,2396,2415,2435,2452,2461,2465,2472,2498,2514,2541,2555,2563,2567,2574,2585,2617,2635,2660,2671,2681,2695,2743,2765,2786,2797,2808,2824,2833,2838,2843,2880,2900,2910,2939,2966,2977,2988,2998,3024,3034,3067,3086,3112,3123,3143,3154,3165,3175,3196,3240,3261,3281,3301,3321,3341,3352,3362,3385,3419,3430,3435,3445,3465,3494,3515,3543,3584,3610,3631,3653,3678,3700,3725,3738,3749,3758,3763,3768,3802,3821,3880,3889],{"__ignoreMap":33},[120,2191,2192,2195],{"class":122,"data-line":123,"line":123},[120,2193,2194],{"class":140},"package",[120,2196,2197],{"class":130}," main\n",[120,2199,2200],{"class":122,"data-line":137,"line":137},[120,2201,458],{"emptyLinePlaceholder":457},[120,2203,2204,2207,2209],{"class":122,"data-line":152,"line":152},[120,2205,2206],{"class":140},"import",[120,2208,1245],{"class":144},[120,2210,1248],{"class":126},[120,2212,2213,2216,2219,2222],{"class":122,"data-line":163,"line":163},[120,2214,2215],{"class":712},"\t",[120,2217,2218],{"class":202},"\"",[120,2220,2221],{"class":130},"fmt",[120,2223,2224],{"class":202},"\"\n",[120,2226,2227,2229,2231,2234],{"class":122,"data-line":234,"line":234},[120,2228,2215],{"class":712},[120,2230,2218],{"class":202},[120,2232,2233],{"class":130},"time",[120,2235,2224],{"class":202},[120,2237,2238],{"class":122,"data-line":246,"line":246},[120,2239,458],{"emptyLinePlaceholder":457},[120,2241,2242,2244,2247,2249,2252],{"class":122,"data-line":474,"line":474},[120,2243,2215],{"class":712},[120,2245,2246],{"class":144},"pbe ",[120,2248,2218],{"class":202},[120,2250,2251],{"class":130},"github.com\u002FQ1mi\u002Fcanal-go\u002Fprotocol\u002Fentry",[120,2253,2224],{"class":202},[120,2255,2256],{"class":122,"data-line":479,"line":479},[120,2257,458],{"emptyLinePlaceholder":457},[120,2259,2260,2262,2264,2267],{"class":122,"data-line":485,"line":485},[120,2261,2215],{"class":712},[120,2263,2218],{"class":202},[120,2265,2266],{"class":130},"github.com\u002FQ1mi\u002Fcanal-go\u002Fclient",[120,2268,2224],{"class":202},[120,2270,2271,2273,2275,2278],{"class":122,"data-line":493,"line":493},[120,2272,2215],{"class":712},[120,2274,2218],{"class":202},[120,2276,2277],{"class":130},"google.golang.org\u002Fprotobuf\u002Fproto",[120,2279,2224],{"class":202},[120,2281,2282],{"class":122,"data-line":502,"line":502},[120,2283,1613],{"class":126},[120,2285,2286],{"class":122,"data-line":510,"line":510},[120,2287,458],{"emptyLinePlaceholder":457},[120,2289,2290],{"class":122,"data-line":518,"line":518},[120,2291,2292],{"class":148},"\u002F\u002F canal-go client demo\n",[120,2294,2295],{"class":122,"data-line":526,"line":526},[120,2296,458],{"emptyLinePlaceholder":457},[120,2298,2299,2302,2305,2307,2309,2311],{"class":122,"data-line":531,"line":531},[120,2300,2301],{"class":140},"func",[120,2303,2304],{"class":130}," main",[120,2306,1262],{"class":126},[120,2308,1268],{"class":126},[120,2310,1245],{"class":144},[120,2312,2313],{"class":126},"{\n",[120,2315,2316,2318],{"class":122,"data-line":537,"line":537},[120,2317,2215],{"class":712},[120,2319,2320],{"class":148},"\u002F\u002F 连接canal-server\n",[120,2322,2323,2325],{"class":122,"data-line":545,"line":545},[120,2324,2215],{"class":712},[120,2326,2327],{"class":148},"\u002F\u002F 请修改为你的 canal-server 配置\n",[120,2329,2330,2332,2335,2338,2341,2344],{"class":122,"data-line":553,"line":553},[120,2331,2215],{"class":712},[120,2333,2334],{"class":144},"connector ",[120,2336,2337],{"class":140},":=",[120,2339,2340],{"class":144}," client.",[120,2342,2343],{"class":130},"NewSimpleCanalConnector",[120,2345,1248],{"class":1261},[120,2347,2348,2350,2352,2355,2358,2361,2363,2366,2368,2370,2372,2375,2377,2380,2382,2385,2387,2389,2391,2394],{"class":122,"data-line":561,"line":561},[120,2349,2215],{"class":712},[120,2351,2215],{"class":712},[120,2353,2354],{"class":202},"\"127.0.0.1\"",[120,2356,2357],{"class":144},", ",[120,2359,2360],{"class":649},"11111",[120,2362,2357],{"class":144},[120,2364,2365],{"class":202},"\"\"",[120,2367,2357],{"class":144},[120,2369,2365],{"class":202},[120,2371,2357],{"class":144},[120,2373,2374],{"class":202},"\"example\"",[120,2376,2357],{"class":144},[120,2378,2379],{"class":649},"60000",[120,2381,2357],{"class":144},[120,2383,2384],{"class":649},"60",[120,2386,327],{"class":140},[120,2388,2384],{"class":649},[120,2390,327],{"class":140},[120,2392,2393],{"class":649},"1000",[120,2395,1613],{"class":1261},[120,2397,2398,2400,2403,2405,2408,2411,2413],{"class":122,"data-line":566,"line":566},[120,2399,2215],{"class":712},[120,2401,2402],{"class":144},"err ",[120,2404,2337],{"class":140},[120,2406,2407],{"class":144}," connector.",[120,2409,2410],{"class":130},"Connect",[120,2412,1262],{"class":1261},[120,2414,1613],{"class":1261},[120,2416,2417,2419,2422,2425,2428,2431,2433],{"class":122,"data-line":572,"line":572},[120,2418,2215],{"class":712},[120,2420,2421],{"class":140},"if",[120,2423,2424],{"class":144}," err ",[120,2426,2427],{"class":140},"!=",[120,2429,2430],{"class":649}," nil",[120,2432,1245],{"class":144},[120,2434,2313],{"class":1261},[120,2436,2437,2439,2441,2444,2447,2450],{"class":122,"data-line":581,"line":581},[120,2438,2215],{"class":712},[120,2440,2215],{"class":712},[120,2442,2443],{"class":130},"panic",[120,2445,1262],{"class":2446},"sqkie",[120,2448,2449],{"class":144},"err",[120,2451,1613],{"class":2446},[120,2453,2454,2456,2458],{"class":122,"data-line":587,"line":587},[120,2455,2215],{"class":712},[120,2457,33],{"class":144},[120,2459,2460],{"class":1261},"}\n",[120,2462,2463],{"class":122,"data-line":595,"line":595},[120,2464,458],{"emptyLinePlaceholder":457},[120,2466,2467,2469],{"class":122,"data-line":1139,"line":1139},[120,2468,2215],{"class":712},[120,2470,2471],{"class":148},"\u002F\u002F mysql 数据解析关注的表，Perl正则表达式.\n",[120,2473,2474,2476,2478,2480,2482,2485,2487,2490,2493,2496],{"class":122,"data-line":1144,"line":1144},[120,2475,2215],{"class":712},[120,2477,2402],{"class":144},[120,2479,1623],{"class":140},[120,2481,2407],{"class":144},[120,2483,2484],{"class":130},"Subscribe",[120,2486,1262],{"class":1261},[120,2488,2489],{"class":202},"\".*",[120,2491,2492],{"class":649},"\\\\",[120,2494,2495],{"class":202},"..*\"",[120,2497,1613],{"class":1261},[120,2499,2500,2502,2504,2506,2508,2510,2512],{"class":122,"data-line":1829,"line":1829},[120,2501,2215],{"class":712},[120,2503,2421],{"class":140},[120,2505,2424],{"class":144},[120,2507,2427],{"class":140},[120,2509,2430],{"class":649},[120,2511,1245],{"class":144},[120,2513,2313],{"class":1261},[120,2515,2516,2518,2520,2523,2526,2528,2531,2534,2536,2539],{"class":122,"data-line":1856,"line":1856},[120,2517,2215],{"class":712},[120,2519,2215],{"class":712},[120,2521,2522],{"class":144},"fmt.",[120,2524,2525],{"class":130},"Printf",[120,2527,1262],{"class":2446},[120,2529,2530],{"class":202},"\"connector.Subscribe failed, err:",[120,2532,2533],{"class":649},"%v\\n",[120,2535,2218],{"class":202},[120,2537,2538],{"class":144},", err",[120,2540,1613],{"class":2446},[120,2542,2543,2545,2547,2549,2551,2553],{"class":122,"data-line":1886,"line":1886},[120,2544,2215],{"class":712},[120,2546,2215],{"class":712},[120,2548,2443],{"class":130},[120,2550,1262],{"class":2446},[120,2552,2449],{"class":144},[120,2554,1613],{"class":2446},[120,2556,2557,2559,2561],{"class":122,"data-line":1915,"line":1915},[120,2558,2215],{"class":712},[120,2560,33],{"class":144},[120,2562,2460],{"class":1261},[120,2564,2565],{"class":122,"data-line":1944,"line":1944},[120,2566,458],{"emptyLinePlaceholder":457},[120,2568,2569,2571],{"class":122,"data-line":1959,"line":1959},[120,2570,2215],{"class":712},[120,2572,2573],{"class":148},"\u002F\u002F 消费消息\n",[120,2575,2576,2578,2581,2583],{"class":122,"data-line":1989,"line":1989},[120,2577,2215],{"class":712},[120,2579,2580],{"class":140},"for",[120,2582,1245],{"class":144},[120,2584,2313],{"class":1261},[120,2586,2587,2589,2591,2594,2596,2598,2601,2603,2606,2608,2611,2613,2615],{"class":122,"data-line":2004,"line":2004},[120,2588,2215],{"class":712},[120,2590,2215],{"class":712},[120,2592,2593],{"class":144},"message, err ",[120,2595,2337],{"class":140},[120,2597,2407],{"class":144},[120,2599,2600],{"class":130},"Get",[120,2602,1262],{"class":2446},[120,2604,2605],{"class":649},"100",[120,2607,2357],{"class":144},[120,2609,2610],{"class":649},"nil",[120,2612,2357],{"class":144},[120,2614,2610],{"class":649},[120,2616,1613],{"class":2446},[120,2618,2619,2621,2623,2625,2627,2629,2631,2633],{"class":122,"data-line":2021,"line":2021},[120,2620,2215],{"class":712},[120,2622,2215],{"class":712},[120,2624,2421],{"class":140},[120,2626,2424],{"class":144},[120,2628,2427],{"class":140},[120,2630,2430],{"class":649},[120,2632,1245],{"class":144},[120,2634,2313],{"class":2446},[120,2636,2637,2639,2641,2643,2645,2647,2649,2652,2654,2656,2658],{"class":122,"data-line":2054,"line":2054},[120,2638,2215],{"class":712},[120,2640,2215],{"class":712},[120,2642,2215],{"class":712},[120,2644,2522],{"class":144},[120,2646,2525],{"class":130},[120,2648,1262],{"class":126},[120,2650,2651],{"class":202},"\"connector.Get failed, err:",[120,2653,2533],{"class":649},[120,2655,2218],{"class":202},[120,2657,2538],{"class":144},[120,2659,1613],{"class":126},[120,2661,2662,2664,2666,2668],{"class":122,"data-line":2073,"line":2073},[120,2663,2215],{"class":712},[120,2665,2215],{"class":712},[120,2667,2215],{"class":712},[120,2669,2670],{"class":140},"continue\n",[120,2672,2673,2675,2677,2679],{"class":122,"data-line":2096,"line":2096},[120,2674,2215],{"class":712},[120,2676,2215],{"class":712},[120,2678,33],{"class":144},[120,2680,2460],{"class":2446},[120,2682,2683,2685,2687,2690,2692],{"class":122,"data-line":2113,"line":2113},[120,2684,2215],{"class":712},[120,2686,2215],{"class":712},[120,2688,2689],{"class":144},"batchId ",[120,2691,2337],{"class":140},[120,2693,2694],{"class":144}," message.Id\n",[120,2696,2698,2700,2702,2704,2707,2710,2713,2716,2719,2722,2724,2727,2729,2731,2734,2736,2739,2741],{"class":122,"data-line":2697,"line":2697},40,[120,2699,2215],{"class":712},[120,2701,2215],{"class":712},[120,2703,2421],{"class":140},[120,2705,2706],{"class":144}," batchId ",[120,2708,2709],{"class":140},"==",[120,2711,2712],{"class":140}," -",[120,2714,2715],{"class":649},"1",[120,2717,2718],{"class":140}," ||",[120,2720,2721],{"class":130}," len",[120,2723,1262],{"class":2446},[120,2725,2726],{"class":144},"message.Entries",[120,2728,1268],{"class":2446},[120,2730,1245],{"class":144},[120,2732,2733],{"class":140},"\u003C",[120,2735,1623],{"class":140},[120,2737,2738],{"class":649}," 0",[120,2740,1245],{"class":144},[120,2742,2313],{"class":2446},[120,2744,2746,2748,2750,2752,2755,2758,2760,2763],{"class":122,"data-line":2745,"line":2745},41,[120,2747,2215],{"class":712},[120,2749,2215],{"class":712},[120,2751,2215],{"class":712},[120,2753,2754],{"class":144},"time.",[120,2756,2757],{"class":130},"Sleep",[120,2759,1262],{"class":126},[120,2761,2762],{"class":144},"time.Second",[120,2764,1613],{"class":126},[120,2766,2768,2770,2772,2774,2776,2779,2781,2784],{"class":122,"data-line":2767,"line":2767},42,[120,2769,2215],{"class":712},[120,2771,2215],{"class":712},[120,2773,2215],{"class":712},[120,2775,2522],{"class":144},[120,2777,2778],{"class":130},"Println",[120,2780,1262],{"class":126},[120,2782,2783],{"class":202},"\"===暂无数据===\"",[120,2785,1613],{"class":126},[120,2787,2789,2791,2793,2795],{"class":122,"data-line":2788,"line":2788},43,[120,2790,2215],{"class":712},[120,2792,2215],{"class":712},[120,2794,2215],{"class":712},[120,2796,2670],{"class":140},[120,2798,2800,2802,2804,2806],{"class":122,"data-line":2799,"line":2799},44,[120,2801,2215],{"class":712},[120,2803,2215],{"class":712},[120,2805,33],{"class":144},[120,2807,2460],{"class":2446},[120,2809,2811,2813,2815,2818,2820,2822],{"class":122,"data-line":2810,"line":2810},45,[120,2812,2215],{"class":712},[120,2814,2215],{"class":712},[120,2816,2817],{"class":130},"printEntry",[120,2819,1262],{"class":2446},[120,2821,2726],{"class":144},[120,2823,1613],{"class":2446},[120,2825,2827,2829,2831],{"class":122,"data-line":2826,"line":2826},46,[120,2828,2215],{"class":712},[120,2830,33],{"class":144},[120,2832,2460],{"class":1261},[120,2834,2836],{"class":122,"data-line":2835,"line":2835},47,[120,2837,2460],{"class":126},[120,2839,2841],{"class":122,"data-line":2840,"line":2840},48,[120,2842,458],{"emptyLinePlaceholder":457},[120,2844,2846,2848,2851,2853,2857,2859,2861,2864,2866,2869,2871,2874,2876,2878],{"class":122,"data-line":2845,"line":2845},49,[120,2847,2301],{"class":140},[120,2849,2850],{"class":130}," printEntry",[120,2852,1262],{"class":126},[120,2854,2856],{"class":2855},"s4XuR","entries",[120,2858,1245],{"class":144},[120,2860,127],{"class":1261},[120,2862,2863],{"class":1261},"]",[120,2865,327],{"class":140},[120,2867,2868],{"class":130},"pbe",[120,2870,324],{"class":144},[120,2872,2873],{"class":130},"Entry",[120,2875,1268],{"class":126},[120,2877,1245],{"class":144},[120,2879,2313],{"class":126},[120,2881,2883,2885,2887,2890,2892,2895,2898],{"class":122,"data-line":2882,"line":2882},50,[120,2884,2215],{"class":712},[120,2886,2580],{"class":140},[120,2888,2889],{"class":144}," _, entry ",[120,2891,2337],{"class":140},[120,2893,2894],{"class":140}," range",[120,2896,2897],{"class":144}," entries ",[120,2899,2313],{"class":1261},[120,2901,2903,2905,2907],{"class":122,"data-line":2902,"line":2902},51,[120,2904,2215],{"class":712},[120,2906,2215],{"class":712},[120,2908,2909],{"class":148},"\u002F\u002F 忽略事务开启和事务关闭类型\n",[120,2911,2913,2915,2917,2919,2922,2925,2927,2929,2931,2933,2936],{"class":122,"data-line":2912,"line":2912},52,[120,2914,2215],{"class":712},[120,2916,2215],{"class":712},[120,2918,2421],{"class":140},[120,2920,2921],{"class":144}," entry.",[120,2923,2924],{"class":130},"GetEntryType",[120,2926,1262],{"class":2446},[120,2928,1268],{"class":2446},[120,2930,1245],{"class":144},[120,2932,2709],{"class":140},[120,2934,2935],{"class":144}," pbe.EntryType_TRANSACTIONBEGIN ",[120,2937,2938],{"class":140},"||\n",[120,2940,2942,2944,2946,2948,2951,2953,2955,2957,2959,2961,2964],{"class":122,"data-line":2941,"line":2941},53,[120,2943,2215],{"class":712},[120,2945,2215],{"class":712},[120,2947,2215],{"class":712},[120,2949,2950],{"class":144},"entry.",[120,2952,2924],{"class":130},[120,2954,1262],{"class":2446},[120,2956,1268],{"class":2446},[120,2958,1245],{"class":144},[120,2960,2709],{"class":140},[120,2962,2963],{"class":144}," pbe.EntryType_TRANSACTIONEND ",[120,2965,2313],{"class":2446},[120,2967,2969,2971,2973,2975],{"class":122,"data-line":2968,"line":2968},54,[120,2970,2215],{"class":712},[120,2972,2215],{"class":712},[120,2974,2215],{"class":712},[120,2976,2670],{"class":140},[120,2978,2980,2982,2984,2986],{"class":122,"data-line":2979,"line":2979},55,[120,2981,2215],{"class":712},[120,2983,2215],{"class":712},[120,2985,33],{"class":144},[120,2987,2460],{"class":2446},[120,2989,2991,2993,2995],{"class":122,"data-line":2990,"line":2990},56,[120,2992,2215],{"class":712},[120,2994,2215],{"class":712},[120,2996,2997],{"class":148},"\u002F\u002F RowChange对象，包含了一行数据变化的所有特征\n",[120,2999,3001,3003,3005,3008,3010,3013,3015,3017,3019,3022],{"class":122,"data-line":3000,"line":3000},57,[120,3002,2215],{"class":712},[120,3004,2215],{"class":712},[120,3006,3007],{"class":144},"rowChange ",[120,3009,2337],{"class":140},[120,3011,3012],{"class":130}," new",[120,3014,1262],{"class":2446},[120,3016,2868],{"class":130},[120,3018,324],{"class":144},[120,3020,3021],{"class":130},"RowChange",[120,3023,1613],{"class":2446},[120,3025,3027,3029,3031],{"class":122,"data-line":3026,"line":3026},58,[120,3028,2215],{"class":712},[120,3030,2215],{"class":712},[120,3032,3033],{"class":148},"\u002F\u002F protobuf解析\n",[120,3035,3037,3039,3041,3043,3045,3048,3051,3053,3055,3058,3060,3062,3065],{"class":122,"data-line":3036,"line":3036},59,[120,3038,2215],{"class":712},[120,3040,2215],{"class":712},[120,3042,2402],{"class":144},[120,3044,2337],{"class":140},[120,3046,3047],{"class":144}," proto.",[120,3049,3050],{"class":130},"Unmarshal",[120,3052,1262],{"class":2446},[120,3054,2950],{"class":144},[120,3056,3057],{"class":130},"GetStoreValue",[120,3059,1262],{"class":126},[120,3061,1268],{"class":126},[120,3063,3064],{"class":144},", rowChange",[120,3066,1613],{"class":2446},[120,3068,3070,3072,3074,3076,3078,3080,3082,3084],{"class":122,"data-line":3069,"line":3069},60,[120,3071,2215],{"class":712},[120,3073,2215],{"class":712},[120,3075,2421],{"class":140},[120,3077,2424],{"class":144},[120,3079,2427],{"class":140},[120,3081,2430],{"class":649},[120,3083,1245],{"class":144},[120,3085,2313],{"class":2446},[120,3087,3089,3091,3093,3095,3097,3099,3101,3104,3106,3108,3110],{"class":122,"data-line":3088,"line":3088},61,[120,3090,2215],{"class":712},[120,3092,2215],{"class":712},[120,3094,2215],{"class":712},[120,3096,2522],{"class":144},[120,3098,2525],{"class":130},[120,3100,1262],{"class":126},[120,3102,3103],{"class":202},"\"proto.Unmarshal failed, err:",[120,3105,2533],{"class":649},[120,3107,2218],{"class":202},[120,3109,2538],{"class":144},[120,3111,1613],{"class":126},[120,3113,3115,3117,3119,3121],{"class":122,"data-line":3114,"line":3114},62,[120,3116,2215],{"class":712},[120,3118,2215],{"class":712},[120,3120,33],{"class":144},[120,3122,2460],{"class":2446},[120,3124,3126,3128,3130,3132,3135,3137,3139,3141],{"class":122,"data-line":3125,"line":3125},63,[120,3127,2215],{"class":712},[120,3129,2215],{"class":712},[120,3131,2421],{"class":140},[120,3133,3134],{"class":144}," rowChange ",[120,3136,2709],{"class":140},[120,3138,2430],{"class":649},[120,3140,1245],{"class":144},[120,3142,2313],{"class":2446},[120,3144,3146,3148,3150,3152],{"class":122,"data-line":3145,"line":3145},64,[120,3147,2215],{"class":712},[120,3149,2215],{"class":712},[120,3151,2215],{"class":712},[120,3153,2670],{"class":140},[120,3155,3157,3159,3161,3163],{"class":122,"data-line":3156,"line":3156},65,[120,3158,2215],{"class":712},[120,3160,2215],{"class":712},[120,3162,33],{"class":144},[120,3164,2460],{"class":2446},[120,3166,3168,3170,3172],{"class":122,"data-line":3167,"line":3167},66,[120,3169,2215],{"class":712},[120,3171,2215],{"class":712},[120,3173,3174],{"class":148},"\u002F\u002F 获取并打印Header信息\n",[120,3176,3178,3180,3182,3185,3187,3189,3192,3194],{"class":122,"data-line":3177,"line":3177},67,[120,3179,2215],{"class":712},[120,3181,2215],{"class":712},[120,3183,3184],{"class":144},"header ",[120,3186,2337],{"class":140},[120,3188,2921],{"class":144},[120,3190,3191],{"class":130},"GetHeader",[120,3193,1262],{"class":2446},[120,3195,1613],{"class":2446},[120,3197,3199,3201,3203,3205,3207,3209,3212,3215,3218,3221,3224,3226,3228,3230,3233,3236,3238],{"class":122,"data-line":3198,"line":3198},68,[120,3200,2215],{"class":712},[120,3202,2215],{"class":712},[120,3204,2522],{"class":144},[120,3206,2525],{"class":130},[120,3208,1262],{"class":2446},[120,3210,3211],{"class":202},"\"binlog[",[120,3213,3214],{"class":649},"%s",[120,3216,3217],{"class":202}," : ",[120,3219,3220],{"class":649},"%d",[120,3222,3223],{"class":202},"], name[",[120,3225,3214],{"class":649},[120,3227,1538],{"class":202},[120,3229,3214],{"class":649},[120,3231,3232],{"class":202},"], eventType: ",[120,3234,3235],{"class":649},"%s\\n",[120,3237,2218],{"class":202},[120,3239,1283],{"class":144},[120,3241,3243,3245,3247,3249,3252,3255,3257,3259],{"class":122,"data-line":3242,"line":3242},69,[120,3244,2215],{"class":712},[120,3246,2215],{"class":712},[120,3248,2215],{"class":712},[120,3250,3251],{"class":144},"header.",[120,3253,3254],{"class":130},"GetLogfileName",[120,3256,1262],{"class":126},[120,3258,1268],{"class":126},[120,3260,1283],{"class":144},[120,3262,3264,3266,3268,3270,3272,3275,3277,3279],{"class":122,"data-line":3263,"line":3263},70,[120,3265,2215],{"class":712},[120,3267,2215],{"class":712},[120,3269,2215],{"class":712},[120,3271,3251],{"class":144},[120,3273,3274],{"class":130},"GetLogfileOffset",[120,3276,1262],{"class":126},[120,3278,1268],{"class":126},[120,3280,1283],{"class":144},[120,3282,3284,3286,3288,3290,3292,3295,3297,3299],{"class":122,"data-line":3283,"line":3283},71,[120,3285,2215],{"class":712},[120,3287,2215],{"class":712},[120,3289,2215],{"class":712},[120,3291,3251],{"class":144},[120,3293,3294],{"class":130},"GetSchemaName",[120,3296,1262],{"class":126},[120,3298,1268],{"class":126},[120,3300,1283],{"class":144},[120,3302,3304,3306,3308,3310,3312,3315,3317,3319],{"class":122,"data-line":3303,"line":3303},72,[120,3305,2215],{"class":712},[120,3307,2215],{"class":712},[120,3309,2215],{"class":712},[120,3311,3251],{"class":144},[120,3313,3314],{"class":130},"GetTableName",[120,3316,1262],{"class":126},[120,3318,1268],{"class":126},[120,3320,1283],{"class":144},[120,3322,3324,3326,3328,3330,3332,3335,3337,3339],{"class":122,"data-line":3323,"line":3323},73,[120,3325,2215],{"class":712},[120,3327,2215],{"class":712},[120,3329,2215],{"class":712},[120,3331,3251],{"class":144},[120,3333,3334],{"class":130},"GetEventType",[120,3336,1262],{"class":126},[120,3338,1268],{"class":126},[120,3340,1283],{"class":144},[120,3342,3344,3346,3348,3350],{"class":122,"data-line":3343,"line":3343},74,[120,3345,2215],{"class":712},[120,3347,2215],{"class":712},[120,3349,33],{"class":144},[120,3351,1613],{"class":2446},[120,3353,3355,3357,3359],{"class":122,"data-line":3354,"line":3354},75,[120,3356,2215],{"class":712},[120,3358,2215],{"class":712},[120,3360,3361],{"class":148},"\u002F\u002F判断是否为DDL语句\n",[120,3363,3365,3367,3369,3371,3374,3377,3379,3381,3383],{"class":122,"data-line":3364,"line":3364},76,[120,3366,2215],{"class":712},[120,3368,2215],{"class":712},[120,3370,2421],{"class":140},[120,3372,3373],{"class":144}," rowChange.",[120,3375,3376],{"class":130},"GetIsDdl",[120,3378,1262],{"class":2446},[120,3380,1268],{"class":2446},[120,3382,1245],{"class":144},[120,3384,2313],{"class":2446},[120,3386,3388,3390,3392,3394,3396,3398,3400,3403,3405,3407,3410,3413,3415,3417],{"class":122,"data-line":3387,"line":3387},77,[120,3389,2215],{"class":712},[120,3391,2215],{"class":712},[120,3393,2215],{"class":712},[120,3395,2522],{"class":144},[120,3397,2525],{"class":130},[120,3399,1262],{"class":126},[120,3401,3402],{"class":202},"\"isDdl:true, sql:",[120,3404,2533],{"class":649},[120,3406,2218],{"class":202},[120,3408,3409],{"class":144},", rowChange.",[120,3411,3412],{"class":130},"GetSql",[120,3414,1262],{"class":1261},[120,3416,1268],{"class":1261},[120,3418,1613],{"class":126},[120,3420,3422,3424,3426,3428],{"class":122,"data-line":3421,"line":3421},78,[120,3423,2215],{"class":712},[120,3425,2215],{"class":712},[120,3427,33],{"class":144},[120,3429,2460],{"class":2446},[120,3431,3433],{"class":122,"data-line":3432,"line":3432},79,[120,3434,458],{"emptyLinePlaceholder":457},[120,3436,3438,3440,3442],{"class":122,"data-line":3437,"line":3437},80,[120,3439,2215],{"class":712},[120,3441,2215],{"class":712},[120,3443,3444],{"class":148},"\u002F\u002F 获取操作类型：insert\u002Fupdate\u002Fdelete等\n",[120,3446,3448,3450,3452,3455,3457,3459,3461,3463],{"class":122,"data-line":3447,"line":3447},81,[120,3449,2215],{"class":712},[120,3451,2215],{"class":712},[120,3453,3454],{"class":144},"eventType ",[120,3456,2337],{"class":140},[120,3458,3373],{"class":144},[120,3460,3334],{"class":130},[120,3462,1262],{"class":2446},[120,3464,1613],{"class":2446},[120,3466,3468,3470,3472,3474,3477,3479,3481,3483,3486,3488,3490,3492],{"class":122,"data-line":3467,"line":3467},82,[120,3469,2215],{"class":712},[120,3471,2215],{"class":712},[120,3473,2580],{"class":140},[120,3475,3476],{"class":144}," _, rowData ",[120,3478,2337],{"class":140},[120,3480,2894],{"class":140},[120,3482,3373],{"class":144},[120,3484,3485],{"class":130},"GetRowDatas",[120,3487,1262],{"class":2446},[120,3489,1268],{"class":2446},[120,3491,1245],{"class":144},[120,3493,2313],{"class":2446},[120,3495,3497,3499,3501,3503,3505,3508,3510,3513],{"class":122,"data-line":3496,"line":3496},83,[120,3498,2215],{"class":712},[120,3500,2215],{"class":712},[120,3502,2215],{"class":712},[120,3504,2421],{"class":140},[120,3506,3507],{"class":144}," eventType ",[120,3509,2709],{"class":140},[120,3511,3512],{"class":144}," pbe.EventType_DELETE ",[120,3514,2313],{"class":126},[120,3516,3518,3520,3522,3524,3526,3529,3531,3534,3537,3539,3541],{"class":122,"data-line":3517,"line":3517},84,[120,3519,2215],{"class":712},[120,3521,2215],{"class":712},[120,3523,2215],{"class":712},[120,3525,2215],{"class":712},[120,3527,3528],{"class":130},"printColumn",[120,3530,1262],{"class":1261},[120,3532,3533],{"class":144},"rowData.",[120,3535,3536],{"class":130},"GetBeforeColumns",[120,3538,1262],{"class":2446},[120,3540,1268],{"class":2446},[120,3542,1613],{"class":1261},[120,3544,3546,3548,3550,3552,3554,3557,3559,3562,3565,3567,3569,3572,3575,3577,3579,3582],{"class":122,"data-line":3545,"line":3545},85,[120,3547,2215],{"class":712},[120,3549,2215],{"class":712},[120,3551,2215],{"class":712},[120,3553,33],{"class":144},[120,3555,3556],{"class":126},"}",[120,3558,1245],{"class":144},[120,3560,3561],{"class":140},"else",[120,3563,3564],{"class":140}," if",[120,3566,3507],{"class":144},[120,3568,2709],{"class":140},[120,3570,3571],{"class":144}," pbe.EventType_INSERT ",[120,3573,3574],{"class":140},"||",[120,3576,3507],{"class":144},[120,3578,2709],{"class":140},[120,3580,3581],{"class":144}," pbe.EventType_UPDATE ",[120,3583,2313],{"class":126},[120,3585,3587,3589,3591,3593,3595,3597,3599,3601,3604,3606,3608],{"class":122,"data-line":3586,"line":3586},86,[120,3588,2215],{"class":712},[120,3590,2215],{"class":712},[120,3592,2215],{"class":712},[120,3594,2215],{"class":712},[120,3596,3528],{"class":130},[120,3598,1262],{"class":1261},[120,3600,3533],{"class":144},[120,3602,3603],{"class":130},"GetAfterColumns",[120,3605,1262],{"class":2446},[120,3607,1268],{"class":2446},[120,3609,1613],{"class":1261},[120,3611,3613,3615,3617,3619,3621,3623,3625,3627,3629],{"class":122,"data-line":3612,"line":3612},87,[120,3614,2215],{"class":712},[120,3616,2215],{"class":712},[120,3618,2215],{"class":712},[120,3620,33],{"class":144},[120,3622,3556],{"class":126},[120,3624,1245],{"class":144},[120,3626,3561],{"class":140},[120,3628,1245],{"class":144},[120,3630,2313],{"class":126},[120,3632,3634,3636,3638,3640,3642,3644,3646,3648,3651],{"class":122,"data-line":3633,"line":3633},88,[120,3635,2215],{"class":712},[120,3637,2215],{"class":712},[120,3639,2215],{"class":712},[120,3641,2215],{"class":712},[120,3643,2522],{"class":144},[120,3645,2778],{"class":130},[120,3647,1262],{"class":1261},[120,3649,3650],{"class":202},"\"---before---\"",[120,3652,1613],{"class":1261},[120,3654,3656,3658,3660,3662,3664,3666,3668,3670,3672,3674,3676],{"class":122,"data-line":3655,"line":3655},89,[120,3657,2215],{"class":712},[120,3659,2215],{"class":712},[120,3661,2215],{"class":712},[120,3663,2215],{"class":712},[120,3665,3528],{"class":130},[120,3667,1262],{"class":1261},[120,3669,3533],{"class":144},[120,3671,3536],{"class":130},[120,3673,1262],{"class":2446},[120,3675,1268],{"class":2446},[120,3677,1613],{"class":1261},[120,3679,3681,3683,3685,3687,3689,3691,3693,3695,3698],{"class":122,"data-line":3680,"line":3680},90,[120,3682,2215],{"class":712},[120,3684,2215],{"class":712},[120,3686,2215],{"class":712},[120,3688,2215],{"class":712},[120,3690,2522],{"class":144},[120,3692,2778],{"class":130},[120,3694,1262],{"class":1261},[120,3696,3697],{"class":202},"\"---after---\"",[120,3699,1613],{"class":1261},[120,3701,3703,3705,3707,3709,3711,3713,3715,3717,3719,3721,3723],{"class":122,"data-line":3702,"line":3702},91,[120,3704,2215],{"class":712},[120,3706,2215],{"class":712},[120,3708,2215],{"class":712},[120,3710,2215],{"class":712},[120,3712,3528],{"class":130},[120,3714,1262],{"class":1261},[120,3716,3533],{"class":144},[120,3718,3603],{"class":130},[120,3720,1262],{"class":2446},[120,3722,1268],{"class":2446},[120,3724,1613],{"class":1261},[120,3726,3728,3730,3732,3734,3736],{"class":122,"data-line":3727,"line":3727},92,[120,3729,2215],{"class":712},[120,3731,2215],{"class":712},[120,3733,2215],{"class":712},[120,3735,33],{"class":144},[120,3737,2460],{"class":126},[120,3739,3741,3743,3745,3747],{"class":122,"data-line":3740,"line":3740},93,[120,3742,2215],{"class":712},[120,3744,2215],{"class":712},[120,3746,33],{"class":144},[120,3748,2460],{"class":2446},[120,3750,3752,3754,3756],{"class":122,"data-line":3751,"line":3751},94,[120,3753,2215],{"class":712},[120,3755,33],{"class":144},[120,3757,2460],{"class":1261},[120,3759,3761],{"class":122,"data-line":3760,"line":3760},95,[120,3762,2460],{"class":126},[120,3764,3766],{"class":122,"data-line":3765,"line":3765},96,[120,3767,458],{"emptyLinePlaceholder":457},[120,3769,3771,3773,3776,3778,3781,3783,3785,3787,3789,3791,3793,3796,3798,3800],{"class":122,"data-line":3770,"line":3770},97,[120,3772,2301],{"class":140},[120,3774,3775],{"class":130}," printColumn",[120,3777,1262],{"class":126},[120,3779,3780],{"class":2855},"columns",[120,3782,1245],{"class":144},[120,3784,127],{"class":1261},[120,3786,2863],{"class":1261},[120,3788,327],{"class":140},[120,3790,2868],{"class":130},[120,3792,324],{"class":144},[120,3794,3795],{"class":130},"Column",[120,3797,1268],{"class":126},[120,3799,1245],{"class":144},[120,3801,2313],{"class":126},[120,3803,3805,3807,3809,3812,3814,3816,3819],{"class":122,"data-line":3804,"line":3804},98,[120,3806,2215],{"class":712},[120,3808,2580],{"class":140},[120,3810,3811],{"class":144}," _, col ",[120,3813,2337],{"class":140},[120,3815,2894],{"class":140},[120,3817,3818],{"class":144}," columns ",[120,3820,2313],{"class":1261},[120,3822,3824,3826,3828,3830,3832,3834,3836,3838,3841,3843,3846,3848,3850,3853,3856,3858,3860,3862,3865,3867,3869,3871,3874,3876,3878],{"class":122,"data-line":3823,"line":3823},99,[120,3825,2215],{"class":712},[120,3827,2215],{"class":712},[120,3829,2522],{"class":144},[120,3831,2525],{"class":130},[120,3833,1262],{"class":2446},[120,3835,2218],{"class":202},[120,3837,3214],{"class":649},[120,3839,3840],{"class":202},":",[120,3842,3214],{"class":649},[120,3844,3845],{"class":202},"  updated=",[120,3847,2533],{"class":649},[120,3849,2218],{"class":202},[120,3851,3852],{"class":144},", col.",[120,3854,3855],{"class":130},"GetName",[120,3857,1262],{"class":126},[120,3859,1268],{"class":126},[120,3861,3852],{"class":144},[120,3863,3864],{"class":130},"GetValue",[120,3866,1262],{"class":126},[120,3868,1268],{"class":126},[120,3870,3852],{"class":144},[120,3872,3873],{"class":130},"GetUpdated",[120,3875,1262],{"class":126},[120,3877,1268],{"class":126},[120,3879,1613],{"class":2446},[120,3881,3883,3885,3887],{"class":122,"data-line":3882,"line":3882},100,[120,3884,2215],{"class":712},[120,3886,33],{"class":144},[120,3888,2460],{"class":1261},[120,3890,3892],{"class":122,"data-line":3891,"line":3891},101,[120,3893,2460],{"class":126},[14,3895,3897],{"id":3896},"canal-kafkaroctetmq","Canal Kafka\u002FRoctetMQ",[10,3899,3900],{},"Canal 1.1.1版本之后，默认支持将Canal Server接收到的binlog数据直接投递到MQ，目前默认支持的MQ系统有Kafka、RocketMQ、RabbitMQ、PulsarMQ。",[10,3902,3903],{},"这里以介绍使用Canal Server将binlog数据投递到Kafka为例。",[42,3905,677],{"id":677},[10,3907,3908],{},"请事先准备好Kafka环境",[668,3910,3911],{"id":3911},"修改instance配置",[10,3913,3914,3915,3918],{},"在",[99,3916,3917],{"code":3917},"instance.properties","配置文件中设置MQ相关配置。",[112,3920,3922],{"className":433,"code":3921,"language":435,"meta":33,"style":33},"#  按需修改成自己的数据库信息\n#################################################\n...\ncanal.instance.master.address=127.0.0.1:3306\n# username\u002Fpassword,数据库的用户名和密码\n...\ncanal.instance.dbUsername = canal\ncanal.instance.dbPassword = canal\n...\n# mq config\n# 设置默认的topic\ncanal.mq.topic=example\n# 针对库名或者表名发送动态topic\n#canal.mq.dynamicTopic=mytest,.*,mytest.user,mytest\\\\..*,.*\\\\..*\ncanal.mq.partition=0\n# hash partition config\n#canal.mq.partitionsNum=3\n#库名.表名: 唯一主键，多个表之间用逗号分隔\n#canal.mq.partitionHash=mytest.person:id,mytest.role:id\n#################################################\n",[99,3923,3924,3929,3933,3938,3944,3949,3953,3961,3968,3972,3977,3982,3990,3995,4000,4008,4013,4018,4023,4028],{"__ignoreMap":33},[120,3925,3926],{"class":122,"data-line":123,"line":123},[120,3927,3928],{"class":148},"#  按需修改成自己的数据库信息\n",[120,3930,3931],{"class":122,"data-line":137,"line":137},[120,3932,442],{"class":148},[120,3934,3935],{"class":122,"data-line":152,"line":152},[120,3936,3937],{"class":144},"...\n",[120,3939,3940,3942],{"class":122,"data-line":163,"line":163},[120,3941,414],{"class":140},[120,3943,490],{"class":144},[120,3945,3946],{"class":122,"data-line":234,"line":234},[120,3947,3948],{"class":148},"# username\u002Fpassword,数据库的用户名和密码\n",[120,3950,3951],{"class":122,"data-line":246,"line":246},[120,3952,3937],{"class":144},[120,3954,3955,3958],{"class":122,"data-line":474,"line":474},[120,3956,3957],{"class":140},"canal.instance.dbUsername",[120,3959,3960],{"class":144}," = canal\n",[120,3962,3963,3966],{"class":122,"data-line":479,"line":479},[120,3964,3965],{"class":140},"canal.instance.dbPassword",[120,3967,3960],{"class":144},[120,3969,3970],{"class":122,"data-line":485,"line":485},[120,3971,3937],{"class":144},[120,3973,3974],{"class":122,"data-line":493,"line":493},[120,3975,3976],{"class":148},"# mq config\n",[120,3978,3979],{"class":122,"data-line":502,"line":502},[120,3980,3981],{"class":148},"# 设置默认的topic\n",[120,3983,3984,3987],{"class":122,"data-line":510,"line":510},[120,3985,3986],{"class":140},"canal.mq.topic",[120,3988,3989],{"class":144},"=example\n",[120,3991,3992],{"class":122,"data-line":518,"line":518},[120,3993,3994],{"class":148},"# 针对库名或者表名发送动态topic\n",[120,3996,3997],{"class":122,"data-line":526,"line":526},[120,3998,3999],{"class":148},"#canal.mq.dynamicTopic=mytest,.*,mytest.user,mytest\\\\..*,.*\\\\..*\n",[120,4001,4002,4005],{"class":122,"data-line":531,"line":531},[120,4003,4004],{"class":140},"canal.mq.partition",[120,4006,4007],{"class":144},"=0\n",[120,4009,4010],{"class":122,"data-line":537,"line":537},[120,4011,4012],{"class":148},"# hash partition config\n",[120,4014,4015],{"class":122,"data-line":545,"line":545},[120,4016,4017],{"class":148},"#canal.mq.partitionsNum=3\n",[120,4019,4020],{"class":122,"data-line":553,"line":553},[120,4021,4022],{"class":148},"#库名.表名: 唯一主键，多个表之间用逗号分隔\n",[120,4024,4025],{"class":122,"data-line":561,"line":561},[120,4026,4027],{"class":148},"#canal.mq.partitionHash=mytest.person:id,mytest.role:id\n",[120,4029,4030],{"class":122,"data-line":566,"line":566},[120,4031,442],{"class":148},[10,4033,4034,4035,4038],{},"其中，",[99,4036,4037],{"code":4037},"canal.mq.dynamicTopic","配置说明。",[10,4040,4041,4042,4045,4046,4049],{},"Canal 1.1.3版本之后, 支持配置格式为：",[99,4043,4044],{"code":4044},"schema"," 或 ",[99,4047,4048],{"code":4048},"schema.table","，多个配置之间使用逗号或分号分隔。",[47,4051,4052,4059,4066,4073,4080],{},[50,4053,4054,4055,4058],{},"例子1：",[99,4056,4057],{"code":4057},"test\\\\.test"," 指定匹配的单表，发送到以test_test为名字的topic上",[50,4060,4061,4062,4065],{},"例子2：",[99,4063,4064],{"code":4064},".*\\\\..*"," 匹配所有表，则每个表都会发送到各自表名的topic上",[50,4067,4068,4069,4072],{},"例子3：",[99,4070,4071],{"code":4071},"test"," 指定匹配对应的库，一个库的所有表都会发送到库名的topic上",[50,4074,4075,4076,4079],{},"例子4：",[99,4077,4078],{"code":4078},"test\\\\..*"," 指定匹配的表达式，针对匹配的表会发送到各自表名的topic上",[50,4081,4082,4083,4086,4087,4090,4091,4094,4095,4097],{},"例子5：",[99,4084,4085],{"code":4085},"test,test1\\\\.test1","，指定多个表达式，会将test库的表都发送到test的topic上，",[99,4088,4089],{"code":4089},"test1\\\\.test1","的表发送到对应的",[99,4092,4093],{"code":4093},"test1_test1"," topic上，其余的表发送到默认的",[99,4096,3986],{"code":3986},"值",[10,4099,4100,4101,4045,4104,408],{},"为满足更大的灵活性，Canal还允许对匹配条件的规则指定发送的topic名字，配置格式：",[99,4102,4103],{"code":4103},"topicName:schema",[99,4105,4106],{"code":4106},"topicName:schema.table",[47,4108,4109,4116,4123,4130,4136],{},[50,4110,4111,4112,4115],{},"例子1: ",[99,4113,4114],{"code":4114},"test:test\\\\.test"," 指定匹配的单表，发送到以test为名字的topic上",[50,4117,4118,4119,4122],{},"例子2: ",[99,4120,4121],{"code":4121},"test:.*\\\\..*"," 匹配所有表，因为有指定topic，则每个表都会发送到test的topic下",[50,4124,4125,4126,4129],{},"例子3: ",[99,4127,4128],{"code":4128},"test:test"," 指定匹配对应的库，一个库的所有表都会发送到test的topic下",[50,4131,4075,4132,4135],{},[99,4133,4134],{"code":4134},"testA:test\\\\..*"," 指定匹配的表达式，针对匹配的表会发送到testA的topic下",[50,4137,4082,4138,4141,4142,4144,4145,4097],{},[99,4139,4140],{"code":4140},"test0:test,test1:test1\\\\.test1","，指定多个表达式，会将test库的表都发送到test0的topic下，",[99,4143,4089],{"code":4089},"的表发送到对应的test1的topic下，其余的表发送到默认的",[99,4146,3986],{"code":3986},[668,4148,4150],{"id":4149},"修改canal-配置文件","修改canal 配置文件",[10,4152,4153,4154],{},"默认配置文件路径为",[99,4155,4156],{"code":4156},"\u002Fusr\u002Flocal\u002Fcanal\u002Fconf\u002Fcanal.properties",[112,4158,4160],{"className":433,"code":4159,"language":435,"meta":33,"style":33},"# ...\n# 可选项: tcp(默认), kafka,RocketMQ,rabbitmq,pulsarmq\ncanal.serverMode = kafka\n# ...\n\n# 是否为flat json格式对象\ncanal.mq.flatMessage = true\n# Canal的batch size, 默认50K, 由于kafka最大消息体限制请勿超过1M(900K以下)\ncanal.mq.canalBatchSize = 50\n# Canal get数据的超时时间, 单位: 毫秒, 空为不限超时\ncanal.mq.canalGetTimeout = 100\ncanal.mq.accessChannel = local\n\n...\n\n##################################################\n#########                    Kafka                   #############\n##################################################\n# 此处配置修改为你的Kafka环境地址\nkafka.bootstrap.servers = 127.0.0.1:9092\nkafka.acks = all\nkafka.compression.type = none\nkafka.batch.size = 16384\nkafka.linger.ms = 1\nkafka.max.request.size = 1048576\nkafka.buffer.memory = 33554432\nkafka.max.in.flight.requests.per.connection = 1\nkafka.retries = 0\n\nkafka.kerberos.enable = false\nkafka.kerberos.krb5.file = ..\u002Fconf\u002Fkerberos\u002Fkrb5.conf\nkafka.kerberos.jaas.file = ..\u002Fconf\u002Fkerberos\u002Fjaas.conf\n\n# sasl demo\n# kafka.sasl.jaas.config = org.apache.kafka.common.security.scram.ScramLoginModule required \\\\n username=\\\"alice\\\" \\\\npassword=\"alice-secret\\\";\n# kafka.sasl.mechanism = SCRAM-SHA-512\n# kafka.security.protocol = SASL_PLAINTEXT\n",[99,4161,4162,4167,4172,4180,4184,4188,4193,4201,4206,4214,4219,4227,4235,4239,4243,4247,4252,4257,4261,4266,4274,4282,4290,4298,4306,4314,4322,4329,4337,4341,4349,4357,4365,4369,4374,4379,4384],{"__ignoreMap":33},[120,4163,4164],{"class":122,"data-line":123,"line":123},[120,4165,4166],{"class":148},"# ...\n",[120,4168,4169],{"class":122,"data-line":137,"line":137},[120,4170,4171],{"class":148},"# 可选项: tcp(默认), kafka,RocketMQ,rabbitmq,pulsarmq\n",[120,4173,4174,4177],{"class":122,"data-line":152,"line":152},[120,4175,4176],{"class":140},"canal.serverMode",[120,4178,4179],{"class":144}," = kafka\n",[120,4181,4182],{"class":122,"data-line":163,"line":163},[120,4183,4166],{"class":148},[120,4185,4186],{"class":122,"data-line":234,"line":234},[120,4187,458],{"emptyLinePlaceholder":457},[120,4189,4190],{"class":122,"data-line":246,"line":246},[120,4191,4192],{"class":148},"# 是否为flat json格式对象\n",[120,4194,4195,4198],{"class":122,"data-line":474,"line":474},[120,4196,4197],{"class":140},"canal.mq.flatMessage",[120,4199,4200],{"class":144}," = true\n",[120,4202,4203],{"class":122,"data-line":479,"line":479},[120,4204,4205],{"class":148},"# Canal的batch size, 默认50K, 由于kafka最大消息体限制请勿超过1M(900K以下)\n",[120,4207,4208,4211],{"class":122,"data-line":485,"line":485},[120,4209,4210],{"class":140},"canal.mq.canalBatchSize",[120,4212,4213],{"class":144}," = 50\n",[120,4215,4216],{"class":122,"data-line":493,"line":493},[120,4217,4218],{"class":148},"# Canal get数据的超时时间, 单位: 毫秒, 空为不限超时\n",[120,4220,4221,4224],{"class":122,"data-line":502,"line":502},[120,4222,4223],{"class":140},"canal.mq.canalGetTimeout",[120,4225,4226],{"class":144}," = 100\n",[120,4228,4229,4232],{"class":122,"data-line":510,"line":510},[120,4230,4231],{"class":140},"canal.mq.accessChannel",[120,4233,4234],{"class":144}," = local\n",[120,4236,4237],{"class":122,"data-line":518,"line":518},[120,4238,458],{"emptyLinePlaceholder":457},[120,4240,4241],{"class":122,"data-line":526,"line":526},[120,4242,3937],{"class":144},[120,4244,4245],{"class":122,"data-line":531,"line":531},[120,4246,458],{"emptyLinePlaceholder":457},[120,4248,4249],{"class":122,"data-line":537,"line":537},[120,4250,4251],{"class":148},"##################################################\n",[120,4253,4254],{"class":122,"data-line":545,"line":545},[120,4255,4256],{"class":148},"#########                    Kafka                   #############\n",[120,4258,4259],{"class":122,"data-line":553,"line":553},[120,4260,4251],{"class":148},[120,4262,4263],{"class":122,"data-line":561,"line":561},[120,4264,4265],{"class":148},"# 此处配置修改为你的Kafka环境地址\n",[120,4267,4268,4271],{"class":122,"data-line":566,"line":566},[120,4269,4270],{"class":140},"kafka.bootstrap.servers",[120,4272,4273],{"class":144}," = 127.0.0.1:9092\n",[120,4275,4276,4279],{"class":122,"data-line":572,"line":572},[120,4277,4278],{"class":140},"kafka.acks",[120,4280,4281],{"class":144}," = all\n",[120,4283,4284,4287],{"class":122,"data-line":581,"line":581},[120,4285,4286],{"class":140},"kafka.compression.type",[120,4288,4289],{"class":144}," = none\n",[120,4291,4292,4295],{"class":122,"data-line":587,"line":587},[120,4293,4294],{"class":140},"kafka.batch.size",[120,4296,4297],{"class":144}," = 16384\n",[120,4299,4300,4303],{"class":122,"data-line":595,"line":595},[120,4301,4302],{"class":140},"kafka.linger.ms",[120,4304,4305],{"class":144}," = 1\n",[120,4307,4308,4311],{"class":122,"data-line":1139,"line":1139},[120,4309,4310],{"class":140},"kafka.max.request.size",[120,4312,4313],{"class":144}," = 1048576\n",[120,4315,4316,4319],{"class":122,"data-line":1144,"line":1144},[120,4317,4318],{"class":140},"kafka.buffer.memory",[120,4320,4321],{"class":144}," = 33554432\n",[120,4323,4324,4327],{"class":122,"data-line":1829,"line":1829},[120,4325,4326],{"class":140},"kafka.max.in.flight.requests.per.connection",[120,4328,4305],{"class":144},[120,4330,4331,4334],{"class":122,"data-line":1856,"line":1856},[120,4332,4333],{"class":140},"kafka.retries",[120,4335,4336],{"class":144}," = 0\n",[120,4338,4339],{"class":122,"data-line":1886,"line":1886},[120,4340,458],{"emptyLinePlaceholder":457},[120,4342,4343,4346],{"class":122,"data-line":1915,"line":1915},[120,4344,4345],{"class":140},"kafka.kerberos.enable",[120,4347,4348],{"class":144}," = false\n",[120,4350,4351,4354],{"class":122,"data-line":1944,"line":1944},[120,4352,4353],{"class":140},"kafka.kerberos.krb5.file",[120,4355,4356],{"class":144}," = ..\u002Fconf\u002Fkerberos\u002Fkrb5.conf\n",[120,4358,4359,4362],{"class":122,"data-line":1959,"line":1959},[120,4360,4361],{"class":140},"kafka.kerberos.jaas.file",[120,4363,4364],{"class":144}," = ..\u002Fconf\u002Fkerberos\u002Fjaas.conf\n",[120,4366,4367],{"class":122,"data-line":1989,"line":1989},[120,4368,458],{"emptyLinePlaceholder":457},[120,4370,4371],{"class":122,"data-line":2004,"line":2004},[120,4372,4373],{"class":148},"# sasl demo\n",[120,4375,4376],{"class":122,"data-line":2021,"line":2021},[120,4377,4378],{"class":148},"# kafka.sasl.jaas.config = org.apache.kafka.common.security.scram.ScramLoginModule required \\\\n username=\\\"alice\\\" \\\\npassword=\"alice-secret\\\";\n",[120,4380,4381],{"class":122,"data-line":2054,"line":2054},[120,4382,4383],{"class":148},"# kafka.sasl.mechanism = SCRAM-SHA-512\n",[120,4385,4386],{"class":122,"data-line":2073,"line":2073},[120,4387,4388],{"class":148},"# kafka.security.protocol = SASL_PLAINTEXT\n",[10,4390,4391,4392,408],{},"更多详细内容请查看",[21,4393,4396],{"href":4394,"rel":4395},"https:\u002F\u002Fgithub.com\u002Falibaba\u002Fcanal\u002Fwiki\u002FCanal-Kafka-RocketMQ-QuickStart",[25],"Canal-Kafka-RocketMQ-QuickStart",[10,4398,4399],{},"按上述修改Canal配置后，重启Canal服务即可。",[4401,4402,4403],"style",{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sSDpw, html code.shiki .sSDpw{--shiki-default:#005cc5;--shiki-dark:#79b8ff}html pre.shiki code .sJX2D, html code.shiki .sJX2D{--shiki-default:#e36209;--shiki-dark:#ffab70}html pre.shiki code .sqkie, html code.shiki .sqkie{--shiki-default:#5a32a3;--shiki-dark:#b392f0}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":33,"searchDepth":163,"depth":163,"links":4405},[4406,4407,4411,4415,4422,4423],{"id":16,"depth":137,"text":17},{"id":40,"depth":137,"text":40,"children":4408},[4409,4410],{"id":44,"depth":152,"text":45},{"id":73,"depth":152,"text":74},{"id":88,"depth":137,"text":88,"children":4412},[4413,4414],{"id":94,"depth":152,"text":94},{"id":268,"depth":152,"text":268},{"id":353,"depth":137,"text":354,"children":4416},[4417,4418],{"id":357,"depth":152,"text":357},{"id":665,"depth":152,"text":666,"children":4419},[4420,4421],{"id":670,"depth":163,"text":670},{"id":855,"depth":163,"text":855},{"id":2169,"depth":137,"text":2170},{"id":3896,"depth":137,"text":3897,"children":4424},[4425],{"id":677,"depth":152,"text":677,"children":4426},[4427,4428],{"id":3911,"depth":163,"text":3911},{"id":4149,"depth":163,"text":4150},[4430],"数据库","2025-10-28","介绍 Canal 的工作原理、服务端安装配置、Docker 部署方式以及 Go 客户端订阅 Binlog 的实践。",false,"md",null,{"slots":4437},{},"\u002F2025\u002F10\u002Fcanal",{"text":4440,"minutes":4441,"time":4442,"words":4443},"12 min read",11.84,710400,2368,{"title":5,"description":4432},{"loc":4438},"posts\u002F2025\u002F10\u002Fcanal",[26],"tech","2026-01-15","Abn6qkUgMp19efK84Gxp82p1TxwjkX5a9r31V3E7vVg",[4452,4457],{"title":4453,"path":4454,"stem":4455,"date":4456,"type":4448,"children":-1},"Elasticsearch 安装与基础操作","\u002F2025\u002F10\u002Felasticsearch","posts\u002F2025\u002F10\u002Felasticsearch","2025-10-27",{"title":4458,"path":4459,"stem":4460,"date":4431,"type":4448,"children":-1},"使用 kafka-go 实现消息生产与消费","\u002F2025\u002F10\u002Fkafka-go","posts\u002F2025\u002F10\u002Fkafka-go",1786555054936]