1 概述
AnalyticDB和taurusdb都是高度兼容mysql协议的数据库,从现有的AnalyticDB官方数据同步方案来看,只有FlinkSQL合适。
同步方案官方文档:
https://help.aliyun.com/zh/analyticdb/analyticdb-for-mysql/user-guide/flink-subscribes-binlog
2 数据同步方案
2.1 架构

2.2 限制条件
AnalyticDB for MySQL产品系列为企业版、基础版、湖仓版和数仓版弹性模式。
AnalyticDB for MySQL集群的内核版本需为3.2.1.0及以上版本。
Flink实时计算引擎需为VVR 8.0.4及以上版本。
XUANWU_V2表不支持开启Binlog,因此不能通过订阅Binlog实现AnalyticDB for MySQL集群XUANWU_V2表的数据同步和流式计算。
Flink仅支持处理AnalyticDB for MySQL Binlog中的所有基础数据类型和复杂数据类型JSON。
Flink不会处理AnalyticDB for MySQL Binlog中的DDL操作记录和分区表自动分区删除的操作记录。
2.3 操作步骤
2.3.1 步骤1:在AnalyticDB中初始化一张示例源表
CREATE DATABASE demo;
use demo;
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL
);
INSERT INTO users (username, email) VALUES ('user1', 'user1@example.com');
INSERT INTO users (username, email) VALUES ('user2', 'user2@example.com');
INSERT INTO users (username, email) VALUES ('user3', 'user3@example.com');

2.3.2 步骤2:为AnalyticDB的示例源表开启binlog
binlog开启仅支持表级别,需要为每一张表开启binlog。例如,为users表开启binglog,命令如下:
ALTER TABLE users BINLOG=true;
ALTER TABLE users binlog_ttl='3d';

2.3.3 步骤3:在目标数据库mysql创建表结构
CREATE DATABASE demo;
use demo;
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL
);
2.3.4 步骤4:在阿里云实时计算平台新建自定义连接器
参考官方文档,执行如下步骤:
1)下载连接器。
2)登录实时计算控制台。在Flink全托管页签,单击目标工作空间操作列下的控制台。
3)在左侧导航栏,单击数据连接。
4)在数据连接页面,单击创建自定义连接器。上传步骤1下载的连接器。上传完成后,单击下一步,单击完成。创建完成的自定义连接器会出现在连接器列表中。

2.3.5 步骤5:在阿里云实时计算平台创建ETL任务
点击ETL左侧菜单,新建流作业,FlinkSQL如下:
CREATE TEMPORARY TABLE adb_source_users (
id INT,
username VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`) NOT ENFORCED
) WITH (
'connector' = 'adb-mysql-cdc',
'hostname' = '你的AnalyticDB',
'username' = 'dba',
'password' = '你的密码',
'database-name' = 'demo',
'table-name' = 'users'
);
CREATE TEMPORARY TABLE adb_sink_users (
id INT,
username VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`) NOT ENFORCED
) WITH (
'connector' = 'mysql',
'hostname' = '你的mysql',
'port' = '3306',
'username' = 'root',
'password' = '你的密码',
'database-name' = 'demo',
'table-name' = 'users'
);
INSERT INTO adb_sink_users
SELECT * FROM adb_source_users;
对ETL作业进行部署:
在目标数据库查询数据,发现源表的存量数据 已自动同步:
2.3.6 步骤6:测试增量数据同步
在源表插入一条新数据,SQL如下:
INSERT INTO users (id, username, email) VALUES (4, 'user4', 'user4@example.com');

在目标数据库查询数据,发现源表的增量数据 已自动同步: