Mysql数据库binlog系列五-Mysql到Oracle的同步

由于某些原因(gui),很多企业都在进行去O的改造,去O是个漫长的过程,如何做到去O时的系统可用是大家头疼的问题,这个问题即数据异构的问题

下面给大家介绍几种我所了解到的方式,并着重描述我选择的方式:

停机维护

步骤很简单:

  1. 扩展应用程序,实现双写
  2. 编写全量脚本,按实际数据特点将不会变更的数据进行迁移
  3. 每天进行一次迁移,增量处理不会变更的数据
  4. 停机
  5. 实现所剩数据的增量同步
  6. 部署程序

之所以用双写,是因为很难做到针对某张表的全部修改,将查询语句留下来,不会对后续造成不可逆影响,但是双写带来的问题需要处理好

OOG

oracle官方工具,主流同步工具,亚秒级同步,继承了oracle的功能强大的特点,听起来是个完美的方案,唯一的缺陷就是收费

MySQL Migration Toolkit

mysql官方工具,支持的场景源多,可以自动创建DDL,开源免费,但是缺点太多,已经停止开发,同步时类型转换有问题,需要人工处理,只能在Windows上使用

KETTLE

开源免费,效率高,稳定,基于sql,灵活,新增数据源需要的修改少,但是基于sql,需要预设更新时间字段进行数据筛选,否则无法增量

DataX

阿里去O使用的一款平台,功能强大,插件式开发,满足更多自定义的需求,目前已经有企业级服务可以直接购买,我其实是更偏向这个插件的,但是他的mysql数据读是基于sql的,如果没有可控字段是无法处理增量同步逻辑的,所以很遗憾没有用这套方案,以后自己会注意开发规范,从自己做起

canal+otter

这是我选择的方式,该插件只专注于Mysql和Oracle的同步,而且是通过binlog的方式,可以在增量同步的同时对应用程序代码的影响达到0,而且自带的监控报警系统/UI配置界面和权限管理,对于普通需求可以达到0开发,如果有脱敏或者复杂需求,也提供了数据处理的自定义插件开发接口

讲一下我是怎么做的

安装canal

下载

1
wget "https://github.com/alibaba/canal/releases/download/canal-1.1.3-alpha-2/canal.deployer-1.1.3-SNAPSHOT.tar.gz" --no-check-certificate

解压

1
tar -zxvf canal.deployer-1.1.3-SNAPSHOT.tar.gz

配置文件修改

1
vim /usr/local/canal/conf/example/instance.properties

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#################################################
## mysql serverId , v1.0.26+ will autoGen
# canal.instance.mysql.slaveId=0

# enable gtid use true/false
canal.instance.gtidon=false

# position info
canal.instance.master.address=XX:XX:XX:XX:3306
canal.instance.master.journal.name=
canal.instance.master.position=
canal.instance.master.timestamp=
canal.instance.master.gtid=

# rds oss binlog
canal.instance.rds.accesskey=
canal.instance.rds.secretkey=
canal.instance.rds.instanceId=

# table meta tsdb info
canal.instance.tsdb.enable=true
#canal.instance.tsdb.url=jdbc:mysql://XX.X.X.X:3306/canal_tsdb
#canal.instance.tsdb.dbUsername=canal
#canal.instance.tsdb.dbPassword=canal

#canal.instance.standby.address =
#canal.instance.standby.journal.name =
#canal.instance.standby.position =
#canal.instance.standby.timestamp =
#canal.instance.standby.gtid=

# username/password
canal.instance.dbUsername=testuser
canal.instance.dbPassword=123456
canal.instance.connectionCharset = UTF-8
canal.instance.defaultDatabaseName =trade
# enable druid Decrypt database password
canal.instance.enableDruid=false
#canal.instance.pwdPublicKey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALK4BUxdDltRRE5/zXpVEVPUgunvscYFtEip3pmLlhrWpacX7y7GCMo2/JM6LeHmiiNdH1FWgGCpUfircSwlWKUCAwEAAQ==

# table regex
canal.instance.filter.regex=.*\\..*
# table black regex
canal.instance.filter.black.regex=

# mq config
canal.mq.topic=example
# dynamic topic route by table regex
#canal.mq.dynamicTopic=.*,mytest\\..*,mytest2.user
canal.mq.partition=0
# hash partition config
#canal.mq.partitionsNum=3
#canal.mq.partitionHash=test.table:id^name,.*\\..*
#################################################
安装otter

otter需要配合zk进行状态管理,zk安装不在此描述

manager(管理工具)
1
wget "https://github.com/alibaba/otter/releases/download/otter-4.2.17/manager.deployer-4.2.17.tar.gz" --no-check-certificate

解压

1
2
3
4
5
6
7
8
9
10
tar -zxvf manager.deployer-4.2.17.tar.gz
```
进入到conf文件配置好ip端口就可以通过bin下的startup.sh脚本进行运行了,但是要提前做好数据源配置
> 官方基础数据表
https://raw.githubusercontent.com/alibaba/otter/master/manager/deployer/src/main/resources/sql/otter-manager-schema.sql
###### node

下载
```text
wget "https://github.com/alibaba/otter/releases/download/otter-4.2.17/node.deployer-4.2.17.tar.gz" --no-check-certificate

解压

1
tar -zxvf node.deployer-4.2.17.tar.gz

生成序列号

1
echo 1 >node/conf/nid

配置和启用使用还是conf和bin文件夹下,只需要改数据源端口配置即可使用

Master配置

开启binlog配置

1
2
3
4
5
6
7
8
9
10
11
在my.inf文件中添加

log_bin=ON
log_bin_basename=/var/lib/mysql/mysql-bin
log_bin_index=/var/lib/mysql/mysql-bin.index

或者

log-bin=/var/lib/mysql/mysql-bin

然后重新启动

创建同步用户

1
2
3
4
5
6
7
8
-- 创建用于同步的用户
CREATE USER 'username' IDENTIFIED BY '123456';
-- 赋予同步用户SLAVE权限
GRANT REPLICATION SLAVE ON *.* TO 'username';
-- 给同步表查询权限
GRANT SELECT ON X.X TO 'username' IDENTITY BY '123456';
-- 给SLAVE状态查询权限
GRANT REPLICATION CLIENT ON *.* TO 'username';

Slave配置

使用日常使用的用户即可满足

管理界面配置
  1. 机器管理-配置ZK
  2. 机器管理-配置Node
  3. 配置数据表
  4. 配置数据源
  5. 配置Channel
  6. Channel下配置pipeline
  7. pipeline下配置任务
  8. 启动Channel