背景

canal 1.1.1版本之后, 内置增加客户端数据同步功能, Client适配器整体介绍: [[ClientAdapter]]

RDB适配器

RDB adapter 用于适配mysql到任意关系型数据库(需支持jdbc)的数据同步及导入 测试支持的数据库列表:

  1. MySQL
  2. Oracle
  3. Postgress
  4. SQLServer
  5. …

1 修改启动器配置: application.yml, 这里以oracle目标库为例

1. canal.conf:
2. canalServerHost: 127.0.0.1:11111
3. batchSize: 500
4. syncBatchSize: 1000
5. retries: 0
6. timeout:
7. mode: tcp # kafka rocketMQ
8. srcDataSources:
9. defaultDS:
10. url: jdbc:mysql://127.0.0.1:3306/mytest?useUnicode=true
11. username: root
12. password: 121212
13. canalAdapters:
14. - instance: example # canal instance Name or mq topic name
15. groups:
16. - groupId: g1
17. outerAdapters:
18. - name: rdb                                               # 指定为rdb类型同步
19. key: oracle1                                            # 指定adapter的唯一key, 与表映射配置中outerAdapterKey对应
20. properties:
21. jdbc.driverClassName: oracle.jdbc.OracleDriver        # jdbc驱动名, 部分jdbc的jar包需要自行放致lib目录下
22. jdbc.url: jdbc:oracle:thin:@localhost:49161:XE        # jdbc url
23. jdbc.username: mytest                                 # jdbc username
24. jdbc.password: m121212                                # jdbc password
25. threads: 5                                            # 并行执行的线程数, 默认为1

注意点:

  1. 其中 outAdapter 的配置: name统一为rdb, key为对应的数据源的唯一标识需和下面的表映射文件中的outerAdapterKey对应, properties为目标库jdb的相关参数
  2. adapter将会自动加载 conf/rdb 下的所有.yml结尾的表映射配置文件

2 RDB表映射文件

修改 conf/rdb/mytest_user.yml文件:

1. dataSourceKey: defaultDS        # 源数据源的key, 对应上面配置的srcDataSources中的值
2. destination: example            # cannal的instance或者MQ的topic
3. groupId:                        # 对应MQ模式下的groupId, 只会同步对应groupId的数据
4. outerAdapterKey: oracle1        # adapter key, 对应上面配置outAdapters中的key
5. concurrent: true                # 是否按主键hash并行同步, 并行同步的表必须保证主键不会更改及主键不能为其他同步表的外键!!
6. dbMapping:
7. database: mytest              # 源数据源的database/shcema
8. table: user                   # 源数据源表名
9. targetTable: mytest.tb_user   # 目标数据源的库名.表名
10. targetPk:                     # 主键映射
11. id: id                      # 如果是复合主键可以换行映射多个
12. #  mapAll: true                 # 是否整表映射, 要求源表和目标表字段名一模一样 (如果targetColumns也配置了映射,则以targetColumns配置为准)
13. targetColumns:                # 字段映射, 格式: 目标表字段: 源表字段, 如果字段名一样源表字段名可不填
14. id:
15. name:
16. role_id:
17. c_time:
18. test1:

导入的类型以目标表的元类型为准, 将自动进行类型转换

3 Mysql 库间镜像schema DDL DML同步

修改 application.yml:

1. canalAdapters:
2. - instance: example # canal instance Name or mq topic name
3. groups:
4. - groupId: g1
5. outerAdapters:
6. - name: rdb
7. key: mysql1
8. properties:
9. jdbc.driverClassName: com.mysql.jdbc.Driver
10. jdbc.url: jdbc:mysql://192.168.0.36/mytest?useUnicode=true
11. jdbc.username: root
12. jdbc.password: 121212

修改 conf/rdb/mytest_user.yml文件:

1. dataSourceKey: defaultDS
2. destination: example
3. outerAdapterKey: mysql1
4. concurrent: true
5. dbMapping:
6. mirrorDb: true
7. database: mytest

其中dbMapping.database的值代表源库和目标库的schema名称,即两库的schema要一模一样

4 RDB启动

  • 将目标库的jdbc jar包放入lib文件夹, 这里放入ojdbc6.jar (如果是其他数据库则放入对应的驱动)
  • 启动canal-adapter启动器

1. bin/startup.sh - 验证 修改mysql mytest.user表的数据, 将会自动同步到Oracle的MYTEST.TB_USER表下面, 并会打出DML的log