From 8a03956c4fb715d5131ce6ac35f4d5b395f1b25c Mon Sep 17 00:00:00 2001 From: caopeng Date: Wed, 24 Jul 2024 15:21:10 +0800 Subject: [PATCH] =?UTF-8?q?feat():canal-adapter=E5=90=8C=E6=AD=A5=E5=88=B0?= =?UTF-8?q?rdb=E6=97=B6=EF=BC=8CmirrorDb=E6=A8=A1=E5=BC=8F=E4=B8=8B?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=94=B9=E5=BA=93=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rdb/service/RdbMirrorDbSyncService.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/client-adapter/rdb/src/main/java/com/alibaba/otter/canal/client/adapter/rdb/service/RdbMirrorDbSyncService.java b/client-adapter/rdb/src/main/java/com/alibaba/otter/canal/client/adapter/rdb/service/RdbMirrorDbSyncService.java index 54498a7e3b..9a68689834 100644 --- a/client-adapter/rdb/src/main/java/com/alibaba/otter/canal/client/adapter/rdb/service/RdbMirrorDbSyncService.java +++ b/client-adapter/rdb/src/main/java/com/alibaba/otter/canal/client/adapter/rdb/service/RdbMirrorDbSyncService.java @@ -132,7 +132,12 @@ private void initMappingConfig(String key, MappingConfig baseConfigMap, MirrorDb mappingConfig.setDbMapping(dbMapping); dbMapping.setDatabase(dml.getDatabase()); dbMapping.setTable(dml.getTable()); - dbMapping.setTargetDb(dml.getDatabase()); + // 获取 targetDb,如果没有设置则使用 dml.getDatabase() + String targetDb = baseConfigMap.getDbMapping().getTargetDb(); + if (StringUtils.isEmpty(targetDb)) { + targetDb = dml.getDatabase(); + } + dbMapping.setTargetDb(targetDb); dbMapping.setTargetTable(dml.getTable()); dbMapping.setMapAll(true); List pkNames = dml.getPkNames(); @@ -151,8 +156,16 @@ private void initMappingConfig(String key, MappingConfig baseConfigMap, MirrorDb */ private void executeDdl(MirrorDbConfig mirrorDbConfig, Dml ddl) { try (Connection conn = dataSource.getConnection(); Statement statement = conn.createStatement()) { - // 替换反引号 + String sql = ddl.getSql(); + // 从配置中获取 targetDb,如果有则进行替换 + String targetDb = mirrorDbConfig.getMappingConfig().getDbMapping().getTargetDb(); + if (!StringUtils.isEmpty(targetDb)) { + String originalDbName = ddl.getDatabase(); + String regex = String.format("\\b%s\\b([.`])", originalDbName); + sql = sql.replaceAll(regex, targetDb + "$1"); + } + // 替换反引号 String backtick = SyncUtil.getBacktickByDbType(dataSource.getDbType()); if (!"`".equals(backtick)) { sql = sql.replaceAll("`", backtick);