下面详细介绍“MySQL 到Oracle 实时数据同步”的攻略和示例。
准备工作
实现过程
1. Canal 工具实现 MySQL 到 Oracle 的数据同步
Canal 是阿里巴巴开源的一款基于 MySQL 数据库的增量数据订阅&消费组件。通过 Canal,我们可以将 MySQL 的数据变更同步到指定的目标数据库(包括 MySQL、Oracle、Redis 等)。
Canal 提供了两种模式进行数据同步:
- 基于抓取的数据同步:即 Canal 客户端连接到 MySQL 数据库获取 binlog 日志,解析 binlog 日志并将变更数据推送到消费端;
- 基于主备复制协议的数据同步:即 Canal 客户端连接到 MySQL 数据库以通过 MySQL 主从复制通道获取数据同步数据。
基于抓取的数据同步一般比基于主备复制协议的数据同步效率高,因此我们这里以基于抓取的数据同步为例。下面是实现过程:
-
启动 Canal 服务,在配置文件
conf/canal.properties
中添加 Canal Server 的监听端口,以及 MySQL 数据库的 IP、端口、账号、密码等信息; -
在服务器上安装 Java,将 Canal 客户端的 jar 包添加到 CLASSPATH 环境变量中,然后启动 Canal 客户端,指定 Canal Server 的 IP 和端口等信息。示例命令如下:
bash
java -jar canal.adapter-1.1.2-SNAPSHOT.jar \
-f instance-mysql-oracle.properties
其中 instance-mysql-oracle.properties
文件包含 MySQL 数据库的配置信息。
-
创建数据同步任务描述文件,包括 MySQL 数据库信息、表信息、同步规则等;
-
在 Oracle 数据库中创建数据表,用于保存同步数据;
-
编写 Java 程序,实现消费端的数据处理逻辑,并将数据写入 Oracle 数据库。
2. DataX 工具实现 Oracle 数据库的数据同步
DataX 是阿里巴巴开源的一款多源数据同步工具,支持 MySQL、Oracle、SQL Server、HDFS、Hive 等多种数据源。DataX 可以将数据从源数据库同步到目标数据库、数据仓库等。
下面介绍使用 DataX 工具实现 Oracle 数据库的数据同步的步骤:
-
安装配置 DataX 工具,详见官方文档。
-
创建数据同步任务描述文件,包括源数据库和目标数据库的配置信息、同步任务等。
-
运行 DataX 工具的命令行程序,指定数据同步任务描述文件,启动数据同步任务。
bash
python datax.py myjob.json
其中 myjob.json
是数据同步任务描述文件名。
示例说明
以将 MySQL 数据库中的学生表同步到 Oracle 数据库中为例,在 Canl 工具和 DataX 工具中的操作如下:
示例一:Canal 同步数据
- 在 MySQL 数据库中创建学生表。
sql
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`age` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci;
- 在 Oracle 数据库中创建用于存储学生表的数据表。
sql
CREATE TABLE `student` (
`id` NUMBER(10) NOT NULL,
`name` VARCHAR2(255) NULL,
`age` VARCHAR2(255) NULL,
PRIMARY KEY (`id`)
);
-
配置 Canal 服务,在配置文件
conf/canal.properties
中添加 MySQL 数据库的连接信息和 Oracle 数据库的连接信息,并启动 Canal 服务。 -
在 Canal 客户端中创建数据同步任务描述文件
conf/example.yml
。其中包括 MySql 数据库的信息、MySQL 数据表student
的名称、Oracle 数据库的信息和数据表student
的名称、同步数据的规则等。示例如下:
```yaml
name: example
groupId: 1
outerAdapterKey: example
pauseTime: 1000
memoryStorageSize: 1000
desc:
Owner: Yasson
Description:
src 数据变更同步到 dst
Version: 1.0.0
dataSource:
-
name: mysql
driver: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8
username: root
password: 123456
-
name: oracle
driver: oracle.jdbc.OracleDriver
url: jdbc:oracle:thin:@localhost:1521:xe
username: system
password: 123456
hsHa:
false
automaticSkip:
false
skipConnectionError:
false
skipDataError:
false
skipDdlError:
false
filters: ignore
schemaMapping:
test: []
tables:
-
name: student
srcDataSource: mysql
dstDataSource: oracle
src: 'test.student'
dst: 'test.student'
srcTableSchema: "test
"
dstTableSchema: "test
"
srcPkList: ["id"]
srcPkListString: "id
"
dstPkList: ["id"]
dstPkListString: "ID"
nullMode: "skip"
```
- 启动 Canal 客户端,通过下面的命令行启动数据同步服务。
bash
java -jar canal.adapter-1.1.2-SNAPSHOT.jar \
-f example.yml
- 在 MySQL 数据库中插入一条学生记录。
sql
INSERT INTO `test`.`student`(`name`, `age`) VALUES("张三", "18");
- 在 Oracle 数据库中查询同步记录。
sql
SELECT * FROM `test`.`student`;
示例二:DataX 同步数据
- 在 Oracle 数据库中创建数据表用于存储学生表的数据。
sql
CREATE TABLE `student` (
`id` NUMBER(10) NOT NULL,
`name` VARCHAR2(255) NULL,
`age` VARCHAR2(255) NULL,
PRIMARY KEY (`id`)
);
- 创建 DataX 的数据同步任务描述文件
conf/myjob.json
,指定从 MySQL 数据库同步数据到 Oracle 数据库。文件内容示例如下:
json
{
"job": {
"setting": {
"speed": {
"channel": 3
}
},
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "root",
"password": "123456",
"splitPk": "",
"column": [
"id",
"name",
"age"
],
"connection": [
{
"table": [
"student"
],
"jdbcUrl": [
"jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8"
]
}
]
}
},
"writer": {
"name": "oraclewriter",
"parameter": {
"username": "system",
"password": "123456",
"column": [
"id",
"name",
"age"
],
"preSql": [
""
],
"connection": [
{
"table": [
"student"
],
"jdbcUrl": [
"jdbc:oracle:thin:@//localhost:1521/orcl"
]
}
]
}
}
}
]
}
}
- 启动数据同步任务,运行如下命令:
bash
python datax.py myjob.json
数据同步完成后,即可在 Oracle 数据库中查询到同步的数据。
这样,就实现了 MySQL 向 Oracle 的实时数据同步。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL 到Oracle 实时数据同步 - Python技术站