锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
1.閰嶇疆.gitignore鏂囦歡(鏂板緩/緙栬緫錛?/p>
2.灝?gitignore鏂囦歡涓婁紶鍒拌繙紼嬩粨搴?/p>
3.鍒犻櫎git鐨?idea鏂囦歡
4.鍚屾鍒拌繙紼嬩粨搴?/p>
瀹屾垚涔嬪悗灝卞彲浠ュ彂鐜癵it浠撳簱涓殑.idea鏂囦歡宸茬粡琚垹闄わ紝鑰屼笖涔嬪悗push浠g爜涔熶笉浼氬啀鎶?idea鏂囦歡涓婁紶銆?/p>
PS錛氭垜鍦ㄤ嬌鐢≒yCharm緙栧啓python浠g爜錛屼竴鑸槸閫氳繃new -> .ignore file -> .gitignore file
鑷姩鐢熸垚.gitignore鏂囦歡銆?br style="box-sizing: border-box; outline: 0px;" />涓嬮潰鏄垜鑷繁姣旇緝甯哥敤鐨?gitignore鏂囦歡綆鐭厤緗細
棣栧厛浣跨敤canal闇瑕佷慨鏀規暟鎹簱閰嶇疆
[mysqld]
log-bin=mysql-bin # 寮鍚?br /> binlog binlog-format=ROW # 閫夋嫨 ROW 妯″紡
server_id=1 # 閰嶇疆 MySQL replaction 闇瑕佸畾涔夛紝涓嶈鍜?canal 鐨?slaveId 閲嶅
鍒涘緩canal鏁版嵁搴撶敤鎴?/p>
CREATE USER canal IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;
2銆佸畨瑁卌anal
涓嬭澆錛?a style="margin: 0px; padding: 0px; color: #2d8cf0; text-decoration-line: none; transition: all 0.3s ease 0s;">https://github.com/alibaba/canal/releases
瑙e帇錛堜慨鏀圭増鏈彿錛夛細tar zxvf canal.deployer-1.1.4.tar.gz -C ./canal
閰嶇疆寮鏀炬湇鍔″櫒绔彛錛?1110銆?1111銆?1112
淇敼canal閰嶇疆鏂囦歡錛堣繖閲岃緗簡涓や釜instance錛屽嵆涓や釜鏁版嵁搴擄級錛?/p>
vi canal/conf/canal.properties
canal.destinations = example1,example2
閰嶇疆instance錛?/p>
cp -R canal/conf/example conf/example1
mv conf/example conf/example2
絎竴涓暟鎹簱閰嶇疆
vi canal/conf/example1/instance.properties
canal.instance.master.address=32.1.2.140:3306
絎簩涓暟鎹簱閰嶇疆
vi canal/conf/example2/instance.properties
canal.instance.master.address=32.1.2.140:3307
#濡傛灉闇瑕佹柊澧炰竴涓猧nstance錛屽彧闇瑕佷慨鏀筩anal.properties鏂囦歡錛屽茍鏂板涓涓猧nstance閰嶇疆鍗沖彲錛屾棤闇閲嶅惎canal銆?/p>
榪愯錛?/p>
sh canal/bin/startup.sh # 鏌ョ湅鏃ュ織
cat canal/logs/canal/canal
3銆丣ava浣跨敤鏍蜂緥
寮曞叆pom渚濊禆錛岄渶瑕佷笌瀹夎鐨刢anal鐗堟湰涓鑷?/p>
<dependencies> <dependency> <groupId>com.alibaba.otter</groupId> <artifactId>canal.client</artifactId> <version>1.1.4</version> </dependency> </dependencies>
紺轟緥浠g爜錛堝紓姝ユ墦鍗頒袱涓暟鎹簱鐨勪慨鏀瑰唴瀹癸級錛?/p>
package cn.spicybar.dblog; import com.alibaba.otter.canal.client.CanalConnector; import com.alibaba.otter.canal.client.CanalConnectors; import com.alibaba.otter.canal.protocol.CanalEntry.Entry; import com.alibaba.otter.canal.protocol.CanalEntry.EntryType; import com.alibaba.otter.canal.protocol.CanalEntry.RowChange; import com.alibaba.otter.canal.protocol.Message; import java.net.InetSocketAddress; import java.util.List; public class CanalClient { public static void main(String[] args) { new Thread(() -> initConnector("example1")).start(); new Thread(() -> initConnector("example2")).start(); } private static void initConnector(String destination) { CanalConnector connector = CanalConnectors.newSingleConnector(new InetSocketAddress("32.1.0.237", 11111), destination, "", ""); try { connector.connect(); connector.subscribe(".*\\..*"); connector.rollback(); while (true) { Message message = connector.getWithoutAck(1000); if (message.getId() != -1 && message.getEntries().size() > 0) { printEntry(message.getEntries()); } connector.ack(message.getId()); } } finally { connector.disconnect(); } } private static void printEntry(List<Entry> entries) { for (Entry entry : entries) { if (entry.getEntryType() == EntryType.TRANSACTIONBEGIN || entry.getEntryType() == EntryType.TRANSACTIONEND) { continue; } try { RowChange rowChange = RowChange.parseFrom(entry.getStoreValue()); System.out.println(rowChange.getSql()); } catch (Exception e) { throw new RuntimeException("ERROR ## parser error, data:" + entry.toString(), e); } } }