{"record":{"id":"f02bcd312161eb41","repo":"apache/seatunnel","slug":"skip-failed-jdbc-source-table-in-discovery","errorCode":null,"errorMessage":"Skip failed JDBC source table in discovery: {}","messagePattern":"Skip failed JDBC source table in discovery: (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/utils/JdbcCatalogUtils.java","lineNumber":213,"sourceCode":"                    } else {\n                        throw wrapThrowable(e);\n                    }\n                }\n            }\n            log.info(\n                    \"Loaded {} catalog tables for jdbc : {}\",\n                    tables.size(),\n                    jdbcConnectionConfig.getUrl());\n            return tables;\n        }\n    }\n\n    private static void logSkipFailedTable(String tablePath, String pluginName, Throwable error) {\n        MultiTableFailedTable failedTable =\n                MultiTableFailureHelper.buildFailedTable(\n                        tablePath, MultiTableFailurePhase.DISCOVERY, pluginName, error);\n        MultiTableFailureHelper.recordFailedTable(failedTable);\n        log.warn(\n                \"Skip failed JDBC source table in discovery: {}\",\n                MultiTableFailureHelper.formatFailedTableLine(failedTable),\n                error);\n    }\n\n    private static RuntimeException wrapThrowable(Throwable error)\n            throws SQLException, ClassNotFoundException {\n        if (error instanceof SQLException) {\n            throw (SQLException) error;\n        }\n        if (error instanceof ClassNotFoundException) {\n            throw (ClassNotFoundException) error;\n        }\n        if (error instanceof RuntimeException) {\n            return (RuntimeException) error;\n        }\n        return new RuntimeException(error);\n    }","sourceCodeStart":195,"sourceCodeEnd":231,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/utils/JdbcCatalogUtils.java#L195-L231","documentation":"During multi-table JDBC discovery, JdbcCatalogUtils logs a warning and skips a table that could not be loaded, instead of failing the whole job. The table path, plugin name, and error are recorded via MultiTableFailureHelper so the failure is reported at the end of discovery.","triggerScenarios":"getTables() iterates configured table paths; metadata retrieval for one table (e.g. jdbcCatalog.getTable) throws, so logSkipFailedTable records the table as MultiTableFailurePhase.DISCOVERY and continues with the remaining tables.","commonSituations":"A table in the table-list was dropped or renamed; user lacks SELECT/DESC privileges on one table; wrong database name in a path; connectivity issues to one host of a cluster; case-mismatched schema/table names.","solutions":["Check the recorded failed-table line for the exact table path and root cause exception","Verify the table exists in the target database (SHOW TABLES / \\dt) and correct the table-list entry","Confirm the JDBC user has privileges to describe/read the table","Remove the broken table from the config or fix case sensitivity of database/table names"],"exampleFix":"// before\ntable_list = [\"db.orders\", \"db.oders\"]   // typo\n// after\ntable_list = [\"db.orders\", \"db.users\"]","handlingStrategy":"validation","validationCode":"// Before submitting, verify every table in table_list exists and is accessible\nfor (String path : tableList) {\n    TablePath tp = TablePath.parse(path);\n    if (!catalog.tableExists(tp.getDatabaseName(), tp.getTableName())) {\n        throw new IllegalArgumentException(\"Table missing or inaccessible: \" + path);\n    }\n}","typeGuard":null,"tryCatchPattern":"// Discovery itself never throws for one bad table; collect failed tables after job config build\nList<CatalogTable> tables = JdbcCatalogUtils.getTables(...);\n// compare against expected table list to detect silently skipped entries","preventionTips":["Validate table_list entries against the database before submission","Grant the JDBC user DESCRIBE/SELECT on all configured tables","Keep table names case-consistent with the catalog"],"tags":["jdbc","discovery","multi-table"],"backgroundTag":"table-discovery-failed","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}