{"record":{"id":"acc535a0541d1590","repo":"alibaba/canal","slug":"not-found-in-db-pls-check-acc535","errorCode":null,"errorMessage":"not found [{}.{}] in db , pls check!","messagePattern":"not found \\[(.+?)\\.(.+?)\\] in db , pls check!","errorType":"exception","errorClass":"CanalParseException","httpStatus":null,"severity":"error","filePath":"parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/dbsync/LogEventConvert.java","lineNumber":651,"sourceCode":"                        && columnInfo[columnInfo.length - 1].type == LogEvent.MYSQL_TYPE_LONGLONG) {\n                        existRDSNoPrimaryKey = true;\n                    }\n                }\n            }\n\n            EntryPosition position = createPosition(event.getHeader());\n            if (!existRDSNoPrimaryKey) {\n                // online ddl增加字段操作步骤：\n                // 1. 新增一张临时表，将需要做ddl表的数据全量导入\n                // 2. 在老表上建立I/U/D的trigger，增量的将数据插入到临时表\n                // 3. 锁住应用请求，将临时表rename为老表的名字，完成增加字段的操作\n                // 尝试做一次reload，可能因为ddl没有正确解析，或者使用了类似online ddl的操作\n                // 因为online ddl没有对应表名的alter语法，所以不会有clear cache的操作\n                tableMeta = getTableMeta(event.getTable().getDbName(), event.getTable().getTableName(), false, position);// 强制重新获取一次\n                if (tableMeta == null) {\n                    tableError = true;\n                    if (!filterTableError) {\n                        throw new CanalParseException(\"not found [\" + event.getTable().getDbName() + \".\"\n                                                      + event.getTable().getTableName() + \"] in db , pls check!\");\n                    }\n                }\n\n                // 在做一次判断\n                if (tableMeta != null && columnInfo.length > tableMeta.getFields().size()) {\n                    tableError = true;\n                    if (!filterTableError) {\n                        throw new CanalParseException(\"column size is not match for table:\" + tableMeta.getFullName()\n                                                      + \",\" + columnInfo.length + \" vs \" + tableMeta.getFields().size());\n                    }\n                }\n                // } else {\n                // logger.warn(\"[\" + event.getTable().getDbName() + \".\" +\n                // event.getTable().getTableName()\n                // + \"] is no primary key , skip alibaba_rds_row_id column\");\n            }\n        }","sourceCodeStart":633,"sourceCodeEnd":669,"githubUrl":"https://github.com/alibaba/canal/blob/87be50e87686a3e8af08c368d0e1ffd1f59eb04a/parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/dbsync/LogEventConvert.java#L633-L669","documentation":"Thrown from parseOneRow() when a forced table-meta reload returns null during row parsing. This is the second-chance path: Canal detected a possible online-DDL scenario and called getTableMeta with useCache=false to force a fresh DB lookup, but the table still cannot be found. Unless filterTableError is true, the exception aborts parsing.","triggerScenarios":"Inside parseOneRow(), after detecting a column mismatch or RDS no-primary-key scenario, Canal calls getTableMeta(dbName, tableName, false, position) to force-refresh metadata. If this returns null (table not found via 'show create table' / 'desc'), the exception fires. This typically means the table was dropped or renamed between the binlog event timestamp and the current processing time.","commonSituations":"An online DDL migration tool (e.g. pt-online-schema-change, gh-ost) created temporary tables that were already cleaned up by the time Canal processes the row events. The table was dropped after the binlog event but before Canal caught up. A schema rename happened and the old table name no longer resolves.","solutions":["Set canal.instance.filter.table.error = true to continue processing past missing tables.","Enable TSDB (canal.instance.tsdb.enable=true) so Canal maintains historical DDL snapshots for dropped/renamed tables.","Verify the canal user has SELECT privileges on all replicated schemas.","If using gh-ost/pt-osc, configure Canal's nameFilter to exclude the temporary *_ghost_* / *_new tables."],"exampleFix":"# before\ncanal.instance.filter.table.error=false\ncanal.instance.tsdb.enable=false\n\n# after\ncanal.instance.filter.table.error=true\ncanal.instance.tsdb.enable=true\ncanal.instance.filter.black.regex=.*\\\\..*_ghc$,.*\\\\..*_ghost_\\\\d+$","handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n    // parseOneRow is internal, but the outer pattern is:\n    TableMeta meta = parseRowsEventForTableMeta(event);\n} catch (CanalParseException e) {\n    if (e.getMessage().contains(\"not found\") && filterTableError) {\n        logger.warn(\"Table not found during row parse, skipping: {}\", fullname);\n        tableError = true;\n        // Continue processing — row data will be in error state\n    }\n}","preventionTips":["Set canal.instance.filter.table.error=true to avoid aborting on missing tables during online DDL.","Enable TSDB so historical table metadata persists for dropped/renamed tables.","Filter out temporary tables created by gh-ost/pt-osc via canal.instance.filter.black.regex."],"tags":["mysql","table-meta","online-ddl","missing-table","row-parsing"],"backgroundTag":null,"analyzedSha":"87be50e87686a3e8af08c368d0e1ffd1f59eb04a","analyzedAt":"2026-08-14T04:30:11.918Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}