From 119af9fca1126a8210c012b967b4998985ffe62d Mon Sep 17 00:00:00 2001 From: jiawei Date: Wed, 15 Jul 2015 19:20:30 +0800 Subject: [PATCH 1/2] change rename operate --- .../inbound/mysql/dbsync/LogEventConvert.java | 22 +++++++--- .../inbound/mysql/dbsync/SimpleDdlParser.java | 41 ++++++++++++++++++- 2 files changed, 55 insertions(+), 8 deletions(-) diff --git a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/dbsync/LogEventConvert.java b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/dbsync/LogEventConvert.java index 14fd3498..a02c65d2 100644 --- a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/dbsync/LogEventConvert.java +++ b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/dbsync/LogEventConvert.java @@ -215,12 +215,22 @@ public class LogEventConvert extends AbstractCanalLifeCycle implements BinlogPar // 更新下table meta cache if (tableMetaCache != null && (result.getType() == EventType.ALTER || result.getType() == EventType.ERASE || result.getType() == EventType.RENAME)) { - if (StringUtils.isNotEmpty(tableName)) { - // 如果解析到了正确的表信息,则根据全名进行清除 - tableMetaCache.clearTableMeta(schemaName, tableName); - } else { - // 如果无法解析正确的表信息,则根据schema进行清除 - tableMetaCache.clearTableMetaWithSchemaName(schemaName); + + for( ;result!=null; result = result.getRenameTableResult()) { + schemaName = event.getDbName(); + if (StringUtils.isNotEmpty(result.getSchemaName())) { + schemaName = result.getSchemaName(); + } + + tableName = result.getTableName(); + + if (StringUtils.isNotEmpty(tableName)) { + // 如果解析到了正确的表信息,则根据全名进行清除 + tableMetaCache.clearTableMeta(schemaName, tableName); + } else { + // 如果无法解析正确的表信息,则根据schema进行清除 + tableMetaCache.clearTableMetaWithSchemaName(schemaName); + } } } diff --git a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/dbsync/SimpleDdlParser.java b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/dbsync/SimpleDdlParser.java index 52e213e4..bbae9f47 100644 --- a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/dbsync/SimpleDdlParser.java +++ b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/dbsync/SimpleDdlParser.java @@ -32,6 +32,7 @@ public class SimpleDdlParser { public static final String UPDATE_PATTERN = "^\\s*UPDATE(.*)$"; public static final String DELETE_PATTERN = "^\\s*DELETE(.*)$"; public static final String RENAME_PATTERN = "^\\s*RENAME\\s*TABLE\\s*(.*?)\\s*TO\\s*(.*?)$"; + public static final String RENAME_REMNANT_PATTERN = "^\\s*(.*?)\\s*TO\\s*(.*?)$"; /** *
      * CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
@@ -74,6 +75,18 @@ public class SimpleDdlParser {
         result = parseRename(queryString, schmeaName, RENAME_PATTERN);
         if (result != null) {
             result.setType(EventType.RENAME);
+
+            String[] renameStrings =  queryString.split(",");
+            if (renameStrings.length > 1){
+                DdlResult lastResult = result;
+                for (int i=1; i
Date: Thu, 16 Jul 2015 19:25:46 +0800
Subject: [PATCH 2/2] change result reference

---
 .../inbound/mysql/dbsync/LogEventConvert.java      | 14 +++++++-------
 .../inbound/mysql/dbsync/SimpleDdlParser.java      |  7 +++----
 2 files changed, 10 insertions(+), 11 deletions(-)

diff --git a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/dbsync/LogEventConvert.java b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/dbsync/LogEventConvert.java
index a02c65d2..07728001 100644
--- a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/dbsync/LogEventConvert.java
+++ b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/dbsync/LogEventConvert.java
@@ -216,20 +216,20 @@ public class LogEventConvert extends AbstractCanalLifeCycle implements BinlogPar
             if (tableMetaCache != null
                 && (result.getType() == EventType.ALTER || result.getType() == EventType.ERASE || result.getType() == EventType.RENAME)) {
 
-                for( ;result!=null; result = result.getRenameTableResult()) {
-                    schemaName = event.getDbName();
-                    if (StringUtils.isNotEmpty(result.getSchemaName())) {
-                        schemaName = result.getSchemaName();
+                for(DdlResult renameResult=result ;renameResult!=null; renameResult = renameResult.getRenameTableResult()) {
+                    String schemaName0 = event.getDbName();  //防止 rename语句后产生 schema变更带来影响
+                    if (StringUtils.isNotEmpty(renameResult.getSchemaName())) {
+                        schemaName0 = renameResult.getSchemaName();
                     }
 
-                    tableName = result.getTableName();
+                    tableName = renameResult.getTableName();
 
                     if (StringUtils.isNotEmpty(tableName)) {
                         // 如果解析到了正确的表信息,则根据全名进行清除
-                        tableMetaCache.clearTableMeta(schemaName, tableName);
+                        tableMetaCache.clearTableMeta(schemaName0, tableName);
                     } else {
                         // 如果无法解析正确的表信息,则根据schema进行清除
-                        tableMetaCache.clearTableMetaWithSchemaName(schemaName);
+                        tableMetaCache.clearTableMetaWithSchemaName(schemaName0);
                     }
                 }
             }
diff --git a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/dbsync/SimpleDdlParser.java b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/dbsync/SimpleDdlParser.java
index bbae9f47..a2eee362 100644
--- a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/dbsync/SimpleDdlParser.java
+++ b/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/dbsync/SimpleDdlParser.java
@@ -299,11 +299,10 @@ public class SimpleDdlParser {
             DdlResult ddlResult = this;
             StringBuffer sb = new StringBuffer();
             do{
-                String.format("DdlResult [schemaName=%s , tableName=%s , oriSchemaName=%s , oriTableName=%s , type=%s ;",
-                        ddlResult.schemaName, ddlResult.tableName, ddlResult.oriSchemaName, ddlResult.oriTableName, ddlResult.type);
+                sb.append(String.format("DdlResult [schemaName=%s , tableName=%s , oriSchemaName=%s , oriTableName=%s , type=%s ];",
+                        ddlResult.schemaName, ddlResult.tableName, ddlResult.oriSchemaName, ddlResult.oriTableName, ddlResult.type));
                 ddlResult = ddlResult.renameTableResult;
-            }while (ddlResult.renameTableResult!=null);
-            sb.append("]");
+            }while (ddlResult!=null);
 
             return sb.toString();
         }