为什么我的canal连接上了2025-06-11 05:24:32.953 [main] INFO c.a.otter.canal.instance.spring.CanalInstanceWithSpring - start CannalInstance for 1-example 2025-06-11 05:24:33.417 [main] WARN c.a.o.canal.parse.inbound.mysql.dbsync.LogEventConvert - --> init table filter : ^.*\..*$ 2025-06-11 05:24:33.418 [main] WARN c.a.o.canal.parse.inbound.mysql.dbsync.LogEventConvert - --> init table black filter : ^mysql\.slave_.*$ 2025-06-11 05:24:33.424 [main] INFO c.a.otter.canal.instance.core.AbstractCanalInstance - start successful.... 2025-06-11 05:24:33.475 [destination = example , address = host.docker.internal/192.168.65.254:3306 , EventParser] WARN c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - ---> begin to find start position, it will be long time for reset or first position 2025-06-11 05:24:33.476 [destination = example , address = host.docker.internal/192.168.65.254:3306 , EventParser] WARN c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - prepare to find start position just show master status 2025-06-11 05:24:33.869 [destination = example , address = host.docker.internal/192.168.65.254:3306 , EventParser] WARN c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - ---> find start position successfully, EntryPosition[included=false,journalName=mysql-bin.000004,position=2635,serverId=1001,gtid=,timestamp=1749619033000] cost : 389ms , the next step is binlog dump 但是却同步不出新的binlog记录呢

时间: 2025-08-03 14:11:00 AIGC 浏览: 30
<think>根据用户描述和提供的引用内容,可以分析Canal连接成功后无法同步新binlog记录的几种可能原因。以下是系统化的排查流程:---###**一、核心问题定位:binlog位置失效**引用[1]明确指出:>canal再次启动时,从meta.dat获取binlog位置,但此时获取到的binlog信息在mysql中已经被删除**根本原因**:MySQL的binlog文件具有**保留期限**(由`expire_logs_days`参数控制),当Canal停机时间超过保留期限后,所需的binlog文件已被物理删除。---###**二、排查流程图**```mermaidgraphTDA[Canal启动失败]-->B{检查日志错误类型}B-->|RdsBinlogEventParserProxy报错|C[确认binlog位置有效性]B-->|Communicationslinkfailure|D[检查网络连接]C-->E[检查MySQLbinlog保留策略]D-->F[验证防火墙/端口连通性]```---###**三、分步解决方案**####步骤1:**验证binlog文件是否存在**在MySQL执行:```sqlSHOWBINARYLOGS;--查看现存binlog文件列表```对比Canal日志中记录的binlog文件名(如`mysql-bin.000123`),若不存在于列表中则需重置位置。####步骤2:**调整binlog保留策略(临时)**```sql--紧急恢复:临时扩大保留空间(默认7天)SETGLOBALexpire_logs_days=30;--立即清理过期文件(触发新文件保留)PURGEBINARYLOGSBEFORENOW()-INTERVAL7DAY;```####步骤3:**重置Canal消费位置**1.**删除meta.dat文件**:```bashrm-fconf/example/meta.dat#example替换为实际instance名称```2.重启Canal服务:```bashbin/stop.sh&&bin/start.sh```*此时Canal会从MySQL**当前最新的binlog位置**开始同步*---###**四、预防措施**|风险点|优化方案||-----------------------|--------------------------------------------------------------------------||binlog过期时间过短|设置`expire_logs_days=30`(生产环境建议15天以上)||Canal元数据未持久化|定期备份`meta.dat`文件或启用CanalServer的**集群模式**[^1]||大流量场景binlog超期|监控binlog生成速度:<br>`SHOWGLOBALSTATUSLIKE'Binlog_bytes_written'`|---###**五、高级调试技巧**如果问题仍存续,在Canal日志中启用**DEBUG模式**:1.修改`conf/logback.xml`:```xml<loggername="com.alibaba.otter.canal.parse"level="DEBUG"/>```2.关键日志解读:```logDEBUG-findstartposition:PositionRange[start=...,end=...]```*若`start`指向不存在的文件,证明位置失效需重置*---###**典型错误对照表**|日志关键词|含义|解决方案||-------------------------------------|-------------------------------|------------------------------||`hasbeenpurged`|binlog文件已被删除|重置meta.dat||`Communicationslinkfailure`|网络连接中断(引用[3])|检查MySQL服务状态||`caching_sha2_passwordplugin`|MySQL8.0认证插件问题|创建用户时指定`mysql_native_password`|---###**附加网络检查**引用[3]中的网络错误需排查:```bashtelnetmysql_server3306#验证端口连通性nc-zvmysql_server3306#若telnet不可用```*若不通,需检查:*-MySQL的`bind-address`配置是否为`0.0.0.0`-云服务器的安全组规则---§§相关问题§§1.如何监控MySQLbinlog的过期风险?2.Canal集群模式如何配置元数据高可用?3.MySQL8.0认证插件导致连接失败怎么办?4.如何计算binlog保留所需的磁盘空间?[^1]:[Canal高可用设计文档](https://github.com/alibaba/canal/wiki/Canal-Kubernetes-Design)[^2]:[MySQL官方Binlog管理手册](https://dev.mysql.com/doc/refman/8.0/en/purge-binary-logs.html)</think> ### Canal连接成功但无法同步新binlog记录的原因分析与解决 根据您提供的日志和引用内容,核心问题在于 **binlog位置失效** 导致同步中断。以下是系统性排查和解决方案: --- #### 一、关键错误分析(引用日志说明) 1. **meta.dat记录的binlog位置失效** ```log WARN: begin to find start position, it will be long time for reset or first position ERROR: dump address /192.168.0.105:3306 has an error, retrying. ``` - **根本原因**:Canal重启时读取`meta.dat`中记录的binlog位置(如`mysql-bin.000023`),但该文件在MySQL中已被自动清理 - **触发场景**:Canal停机时间 > MySQL的`expire_logs_days`设置(默认7天)[^1] 2. **通信异常干扰(引用[3])** ```log CommunicationsException: Communications link failure ``` 表明存在**网络波动**或**MySQL连接中断**,可能导致binlog位置记录不准确 --- #### 二、根本原因图解 ```mermaid graph LR A[Canal停机] --> B{MySQL持续运行} B --> C[binlog文件滚动更新] C --> D[旧binlog被自动删除] D --> E[meta.dat记录的位置失效] E --> F[Canal启动时找不到指定binlog文件] F --> G[同步中断] ``` --- #### 三、分步解决方案 ##### ▶ 步骤1:检查MySQL当前binlog状态 ```sql -- 连接MySQL执行: SHOW BINARY LOGS; -- 查看现存binlog文件列表 SHOW VARIABLES LIKE 'expire_logs_days'; -- 检查保留天数 ``` - **关键指标**:若`meta.dat`中的文件名(如`mysql-bin.000023`)不在`SHOW BINARY LOGS`结果中,说明文件已删除 ##### ▶ 步骤2:重置Canal消费位点(两种方法) **方法一:强制重置到最新位置(推荐)** ```bash # 删除meta.dat文件 rm ./conf/example/meta.dat # example替换为实际instance名称 # 重启Canal bin/stop.sh && bin/startup.sh ``` *此时Canal会从MySQL当前最新的binlog文件开始同步* **方法二:手动指定安全位点(精确控制)** ```sql -- 在MySQL查找到现存最早的binlog文件 SHOW BINARY LOGS; -- 记录第一个文件名(如mysql-bin.000030) -- 在Canal修改conf/example/instance.properties canal.instance.master.journal.name=mysql-bin.000030 # 指定文件名 canal.instance.master.position=4 # 起始位置设为文件头部 ``` ##### ▶ 步骤3:预防机制配置 1. **延长binlog保留时间** ```sql -- MySQL执行 (单位:天) SET GLOBAL expire_logs_days = 15; ``` 2. **添加Canal监控告警** ```bash # 监控binlog文件更新延迟 canalAdm monitor -e binlog_lag -w 60s ``` --- #### 四、补充排查点 1. **网络连接验证** ```bash # 测试MySQL端口连通性 telnet 192.168.0.105 3306 # 替换实际IP ``` - 若不通需检查: - MySQL的`bind-address`是否为`0.0.0.0` - 防火墙规则(尤其云服务器安全组) 2. **权限二次确认** ```sql -- 检查Canal账号权限 SHOW GRANTS FOR 'canal'@'%'; ``` 需包含: `SELECT, REPLICATION CLIENT, REPLICATION SLAVE` --- #### 五、操作后验证 ```log # 正常启动日志应包含: INFO: ---> find start position successfully INFO: prepare to start binlog dump ``` ---
阅读全文

相关推荐

2025-06-11 11:54:40.062 | DOCKER_DEPLOY_TYPE=VM 2025-06-11 11:54:40.066 | ==> INIT /alidata/init/02init-sshd.sh 2025-06-11 11:54:40.072 | ==> EXIT CODE: 0 2025-06-11 11:54:40.072 | ==> INIT /alidata/init/fix-hosts.py 2025-06-11 11:54:40.103 | ==> EXIT CODE: 0 2025-06-11 11:54:40.103 | ==> INIT DEFAULT 2025-06-11 11:54:40.105 | Failed to get D-Bus connection: Operation not permitted 2025-06-11 11:54:40.106 | ==> INIT DONE 2025-06-11 11:54:40.106 | ==> RUN /bin/sh -c # 确保目录结构完整 2025-06-11 11:54:40.106 | mkdir -p /home/admin/canal-server/logs; 2025-06-11 11:54:40.106 | cd /home/admin/canal-server; 2025-06-11 11:54:40.106 | 2025-06-11 11:54:40.106 | # 打印关键配置 2025-06-11 11:54:40.106 | echo "===== 有效配置 ====="; 2025-06-11 11:54:40.106 | echo "canal.properties:"; 2025-06-11 11:54:40.106 | cat conf/canal.properties; 2025-06-11 11:54:40.106 | echo "instance.properties:"; 2025-06-11 11:54:40.106 | cat conf/example/instance.properties; 2025-06-11 11:54:40.106 | echo "===================="; 2025-06-11 11:54:40.106 | 2025-06-11 11:54:40.106 | # 启动 Canal 服务器 2025-06-11 11:54:40.106 | exec java ${JAVA_OPTS} -cp "conf:lib/*" \ 2025-06-11 11:54:40.106 | com.alibaba.otter.canal.deployer.CanalLauncher 2025-06-11 11:54:40.106 | 2025-06-11 11:54:40.106 | Failed to get D-Bus connection: Operation not permitted 2025-06-11 11:54:40.108 | ===== 有效配置 ===== 2025-06-11 11:54:40.108 | canal.properties: 2025-06-11 11:54:40.110 | canal.id = 1001 2025-06-11 11:54:40.110 | canal.port = 11111 2025-06-11 11:54:40.110 | canal.destinations = example 2025-06-11 11:54:40.110 | canal.zookeeper.switch = false 2025-06-11 11:54:40.110 | canal.instance.global.spring.xml = classpath:spring/default-instance.xmlinstance.properties: 2025-06-11 11:54:40.113 | canal.instance.mysql.slaveId = 1234 2025-06-11 11:54:40.113 | canal.instance.master.address = host.docker.internal:3306 2025-06-11 11:54:40.113 | canal.instance.dbUsername = canal 2025-06-11 11:54:40.113 | canal.instance.dbPassword = tx123456 2025-06-11 11:54:40.113 | canal.instance.connectionCharset = UTF-8 2025-06-11 11:54:40.113 | canal.instance.filter.regex = .*\\..*==================== 2025-06-11 11:54:40.323 | 03:54:40,213 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml] 2025-06-11 11:54:40.323 | 03:54:40,213 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy] 2025-06-11 11:54:40.323 | 03:54:40,214 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/home/admin/canal-server/conf/logback.xml] 2025-06-11 11:54:40.324 | 03:54:40,324 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender] 2025-06-11 11:54:40.330 | 03:54:40,330 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT] 2025-06-11 11:54:40.337 | 03:54:40,337 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property 2025-06-11 11:54:40.372 | 03:54:40,372 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to DEBUG 2025-06-11 11:54:40.372 | 03:54:40,372 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[ROOT] 2025-06-11 11:54:40.372 | 03:54:40,372 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration. 2025-06-11 11:54:40.374 | 03:54:40,373 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@47fd17e3 - Registering current configuration as safe fallback point 2025-06-11 11:54:40.410 | 2025-06-11 03:54:40.406 [main] INFO c.a.o.canal.deployer.CanalLauncher - ## set default uncaught exception handler 2025-06-11 11:54:40.410 | 2025-06-11 03:54:40.410 [main] INFO c.a.o.canal.deployer.CanalLauncher - ## load canal configurations 2025-06-11 11:54:40.434 | 2025-06-11 03:54:40.433 [main] ERROR c.a.o.canal.deployer.CanalLauncher - ## Something goes wrong when starting up the canal Server: 2025-06-11 11:54:40.434 | java.lang.NullPointerException: null 2025-06-11 11:54:40.434 | at com.alibaba.otter.canal.deployer.CanalStarter.start(CanalStarter.java:69) 2025-06-11 11:54:40.434 | at com.alibaba.otter.canal.deployer.CanalLauncher.main(CanalLauncher.java:124)

2025-06-11 05:42:05.177 [main] INFO c.a.otter.canal.instance.core.AbstractCanalInstance - start successful.... 2025-06-11 05:42:05.302 [destination = example , address = host.docker.internal/192.168.65.254:3306 , EventParser] WARN c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - ---> begin to find start position, it will be long time for reset or first position 2025-06-11 05:42:05.306 [destination = example , address = host.docker.internal/192.168.65.254:3306 , EventParser] ERROR c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - dump address host.docker.internal/192.168.65.254:3306 has an error, retrying. caused by com.alibaba.otter.canal.parse.exception.CanalParseException: use gtid and TableMeta TSDB should be config timestamp > 0 2025-06-11 05:42:05.308 [destination = example , address = host.docker.internal/192.168.65.254:3306 , EventParser] ERROR com.alibaba.otter.canal.common.alarm.LogAlarmHandler - destination:example[com.alibaba.otter.canal.parse.exception.CanalParseException: use gtid and TableMeta TSDB should be config timestamp > 0 ] 2025-06-11 05:42:23.263 [destination = example , address = host.docker.internal/192.168.65.254:3306 , EventParser] WARN c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - ---> begin to find start position, it will be long time for reset or first position 2025-06-11 05:42:23.371 [destination = example , address = host.docker.internal/192.168.65.254:3306 , EventParser] WARN c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - prepare to find start position mysql-bin.000004:4:1749605335000 2025-06-11 05:42:24.294 [destination = example , address = host.docker.internal/192.168.65.254:3306 , EventParser] WARN c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - ---> find start position successfully, EntryPosition[included=false,journalName=mysql-bin.000004,position=4,serverId=1001,gtid=<null>,timestamp=1749605335000] cost : 991ms , the next step is binlog dump

2025-06-11 06:18:08.494 [destination = example , address = host.docker.internal/192.168.65.254:3306 , EventParser] WARN c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - ---> find start position successfully, EntryPosition[included=false,journalName=mysql-bin.000007,position=196,serverId=<null>,gtid=<null>,timestamp=<null>] cost : 2ms , the next step is binlog dump 2025-06-11 06:18:08.494 [destination = example , address = host.docker.internal/192.168.65.254:3306 , EventParser] INFO c.alibaba.otter.canal.parse.driver.mysql.MysqlConnector - disConnect MysqlConnection to host.docker.internal/192.168.65.254:3306... 2025-06-11 06:18:08.496 [destination = example , address = host.docker.internal/192.168.65.254:3306 , EventParser] INFO c.alibaba.otter.canal.parse.driver.mysql.MysqlConnector - connect MysqlConnection to host.docker.internal/192.168.65.254:3306... 2025-06-11 06:18:08.497 [destination = example , address = host.docker.internal/192.168.65.254:3306 , EventParser] INFO c.alibaba.otter.canal.parse.driver.mysql.MysqlConnector - handshake initialization packet received, prepare the client authentication packet to send 2025-06-11 06:18:08.498 [destination = example , address = host.docker.internal/192.168.65.254:3306 , EventParser] INFO c.alibaba.otter.canal.parse.driver.mysql.MysqlConnector - client authentication packet is sent out. 2025-06-11 06:18:08.500 [destination = example , address = host.docker.internal/192.168.65.254:3306 , EventParser] DEBUG c.a.otter.canal.parse.driver.mysql.MysqlUpdateExecutor - read update result... 2025-06-11 06:18:08.501 [destination = example , address = host.docker.internal/192.168.65.254:3306 , EventParser] DEBUG c.a.otter.canal.parse.driver.mysql.MysqlUpdateExecutor - read update result... 2025-06-11 06:18:08.502 [destination = example , address = host.docker.internal/192.168.65.254:3306 , EventParser] DEBUG c.a.otter.canal.parse.driver.mysql.MysqlUpdateExecutor - read update result... 2025-06-11 06:18:08.502 [destination = example , address = host.docker.internal/192.168.65.254:3306 , EventParser] DEBUG c.a.otter.canal.parse.driver.mysql.MysqlUpdateExecutor - read update result... 2025-06-11 06:18:08.503 [destination = example , address = host.docker.internal/192.168.65.254:3306 , EventParser] DEBUG c.a.otter.canal.parse.driver.mysql.MysqlUpdateExecutor - read update result... 2025-06-11 06:18:08.504 [destination = example , address = host.docker.internal/192.168.65.254:3306 , EventParser] DEBUG c.a.otter.canal.parse.driver.mysql.MysqlUpdateExecutor - read update result... 2025-06-11 06:18:08.518 [destination = example , address = host.docker.internal/192.168.65.254:3306 , EventParser] DEBUG c.a.otter.canal.parse.driver.mysql.MysqlUpdateExecutor - read update result... 2025-06-11 06:18:08.519 [destination = example , address = host.docker.internal/192.168.65.254:3306 , EventParser] DEBUG c.a.otter.canal.parse.driver.mysql.MysqlUpdateExecutor - read update result... 2025-06-11 06:18:08.522 [destination = example , address = host.docker.internal/192.168.65.254:3306 , EventParser] INFO c.a.otter.canal.parse.inbound.mysql.MysqlConnection - Register slave RegisterSlaveCommandPacket[reportHost=172.18.0.2,reportPort=50386,reportUser=canal,reportPasswd=tx123456,serverId=1234,command=21] 2025-06-11 06:18:08.524 [destination = example , address = host.docker.internal/192.168.65.254:3306 , EventParser] INFO c.a.otter.canal.parse.inbound.mysql.MysqlConnection - COM_BINLOG_DUMP with position:BinlogDumpCommandPacket[binlogPosition=196,slaveServerId=1234,binlogFileName=mysql-bin.000007,command=18] 2025-06-11 06:18:08.548 [destination = example , address = host.docker.internal/192.168.65.254:3306 , EventParser] INFO com.taobao.tddl.dbsync.binlog.LogEvent - common_header_len= 19, number_of_event_types= 40

2025-06-11 05:07:06.877 [destination = example , address = host.docker.internal/192.168.65.254:3306 , EventParser] ERROR com.alibaba.otter.canal.common.alarm.LogAlarmHandler - destination:example[com.alibaba.otter.canal.parse.exception.CanalParseException: com.alibaba.otter.canal.parse.exception.CanalParseException: com.alibaba.otter.canal.parse.exception.CanalParseException: fetch failed by table meta:canal_test.test Caused by: com.alibaba.otter.canal.parse.exception.CanalParseException: com.alibaba.otter.canal.parse.exception.CanalParseException: fetch failed by table meta:canal_test.test Caused by: com.alibaba.otter.canal.parse.exception.CanalParseException: fetch failed by table meta:canal_test.test Caused by: java.io.IOException: ErrorPacket [errorNumber=1142, fieldCount=-1, message=SHOW command denied to user 'canal'@'localhost' for table 'test', sqlState=42000, sqlStateMarker=#] with command: show create table canal_test.test at com.alibaba.otter.canal.parse.driver.mysql.MysqlQueryExecutor.query(MysqlQueryExecutor.java:61) at com.alibaba.otter.canal.parse.inbound.mysql.MysqlConnection.query(MysqlConnection.java:106) at com.alibaba.otter.canal.parse.inbound.mysql.dbsync.TableMetaCache.getTableMeta(TableMetaCache.java:186) at com.alibaba.otter.canal.parse.inbound.mysql.dbsync.LogEventConvert.getTableMeta(LogEventConvert.java:990) at com.alibaba.otter.canal.parse.inbound.mysql.dbsync.LogEventConvert.parseRowsEventForTableMeta(LogEventConvert.java:494) at com.alibaba.otter.canal.parse.inbound.mysql.MysqlMultiStageCoprocessor$SimpleParserStage.processEvent(MysqlMultiStageCoprocessor.java:293) at com.alibaba.otter.canal.parse.inbound.mysql.MysqlMultiStageCoprocessor$SimpleParserStage.onEvent(MysqlMultiStageCoprocessor.java:276) at com.alibaba.otter.canal.parse.inbound.mysql.MysqlMultiStageCoprocessor$SimpleParserStage.onEvent(MysqlMultiStageCoprocessor.java:239) at com.lmax.disruptor.BatchEventProcessor.processEvents(BatchEventProcessor.java:168) at com.lmax.disruptor.BatchEventProcessor.run(BatchEventProcessor.java:125) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:750)

ALLOW_UNLOCK_FLAG=1, TENANT_ID=1, VER_UUID=-1, MODIFY_FLAG=0}] 2025-06-05 17:13:28.999 [pool-4-thread-1] WARN c.a.o.canal.server.embedded.handle.oracle.OracleHandler - ### [ORACLE-LOG] 解析到原始SQL - SCN: 7891264697, 操作: UPDATE, 表: CFG_INDICATOR_VAL, SQL: update "ENERGY_TEST"."CFG_INDICATOR_VAL" set "QUOTE_VAL_IDS" = '15837666,17331378,18681847,20178909,21626525,31225962', "FORMULA_OBJ" = '{"formulaArr":["汇总"]}', "VAL" = '0.000' where "INDICATOR_VAL_ID" = 15837693 and "CREATE_TIME" = TIMESTAMP ' 2024-12-31 08:15:25' and "CREATE_USER" IS NULL and "UPDATE_TIME" = TIMESTAMP ' 2025-06-04 14:06:11' and "UPDATE_USER" IS NULL and "DEL" = 0 and "REMARK" IS NULL and "INDICATOR_ID" = 22796 and "GRANULARITY" = 'year' and "SHIFT_NAME" IS NULL and "TEAM_NAME" IS NULL and "BELONG_DATE" = TIMESTAMP ' 2025-01-01 00:00:00' and "START_DATE" = TIMESTAMP ' 2024-12-31 08:00:00' and "END_DATE" = TIMESTAMP ' 2025-12-31 08:00:00' and "LOCK_FLAG" = 0 and "VALUE_TYPE" = 0 and "ALLOW_UNLOCK_FLAG" = 1 and "TENANT_ID" = 1 and "VER_UUID" = '-1' and "MODIFY_FLAG" = 0 2025-06-05 17:13:29.000 [pool-4-thread-1] WARN c.a.o.canal.server.embedded.handle.oracle.OracleHandler - ### [CANAL-MSG] 转换后消息 - 类型: UPDATE, 主键: null, 数据: [{QUOTE_VAL_IDS=15837666,17331378,18681847,20178909,21626525,31225962, FORMULA_OBJ={"formulaArr":["汇总"]}, VAL=0.000}] 2025-06-05 17:13:29.000 [pool-4-thread-1] WARN c.a.o.canal.server.embedded.handle.oracle.OracleHandler - ### [ORACLE-LOG] 解析到原始SQL - SCN: 7891264699, 操作: UPDATE, 表: CFG_INDICATOR_VAL, SQL: update "ENERGY_TEST"."CFG_INDICATOR_VAL" set "UPDATE_TIME" = TIMESTAMP ' 2025-06-04 14:06:11', "UPDATE_USER" = NULL, "INDICATOR_ID" = 22813, "GRANULARITY" = 'quarter', "START_DATE" = TIMESTAMP ' 2025-03-31 08:00:00', "END_DATE" = TIMESTAMP ' 2025-06-30 08:00:00', "LOCK_FLAG" = 0, "VALUE_TYPE" = 2, "ALLOW_UNLOCK_FLAG" = 1, "TENANT_ID" = 1, "VER_UUID" = '-1', "MODIFY_FLAG" = 0 where "INDICATOR_VAL_ID" = 21925482 and "CREATE_TIME" = TIMESTAMP ' 2025-05-06 14:40:18' and "CREATE_USER" IS NULL and "UPDATE_TIME" = TIMESTAMP ' 2025-06-04 13:57:55' and "UPDATE_USER" IS NULL and "DEL" = 0 and "REMARK" IS NULL and "INDICATOR_ID" = 22813 and "GRANULARITY" = 'quarter' and "SHIFT_NAME" IS NULL and "TEAM_NAME" IS NULL and "BELONG_DATE" = TIMESTAMP ' 2025-04-01 00:00:00' and "START_DATE" = TIMESTAMP ' 2025-03-31 08:00:00' and "END_DATE" = TIMESTAMP ' 2025-06-30 08:00:00' and "LOCK_FLAG" = 0 and "VALUE_TYPE" = 2 and "ALLOW_UNLOCK_FLAG" = 1 and "TENANT_ID" = 1 and "VER_UUID" = '-1' and "MODIFY_FLAG" = 0 2025-06-05 17:13:29.000 [pool-4-thread-1] WARN c.a.o.canal.server.embedded.handle.oracle.OracleHandler - ### [CANAL-MSG] 转换后消息 - 类型: UPDATE, 主键: null, 数据: [{UPDATE_TIME=2025-06-04 14:06:11, UPDATE_USER=NULL, INDICATOR_ID=22813, GRANULARITY=quarter, START_DATE=2025-03-31 08:00:00, END_DATE=2025-06-30 08:00:00, LOCK_FLAG=0, VALUE_TYPE=2, ALLOW_UNLOCK_FLAG=1, TENANT_ID=1, VER_UUID=-1, MODIFY_FLAG=0}] 2025-06-05 17:13:29.000 [pool-4-thread-1] WARN c.a.o.canal.server.embedded.handle.oracle.OracleHandler - ### [ORACLE-LOG] 解析到原始SQL - SCN: 7891264699, 操作: UPDATE, 表: CFG_INDICATOR_VAL, SQL: update "ENERGY_TEST"."CFG_INDICATOR_VAL" set "QUOTE_VAL_IDS" = '20179006,21626673,31226046', "FORMULA_OBJ" = '{"formulaArr":["汇总"]}', "VAL" = '0.000' where "INDICATOR_VAL_ID" = 21925482 and "CREATE_TIME" = TIMESTAMP ' 2025-05-06 14:40:18' and "CREATE_USER" IS NULL and "UPDATE_TIME" = TIMESTAMP ' 2025-06-04 14:06:11' and "UPDATE_USER" IS NULL and "DEL" = 0 and "REMARK" IS NULL and "INDICATOR_ID" = 22813 and "GRANULARITY" = 'quarter' and "SHIFT_NAME" IS NULL and "TEAM_NAME" IS NULL and "BELONG_DATE" = TIMESTAMP ' 2025-04-01 00:00:00' and "START_DATE" = TIMESTAMP ' 2025-03-31 08:00:00' and "END_DATE" = TIMESTAMP ' 2025-06-30 08:00:00' and "LOCK_FLAG" = 0 and "VALUE_TYPE" = 2 and "ALLOW_UNLOCK_FLAG" = 1 and "TENANT_ID" = 1 and "VER_UUID" = '-1' and "MODIFY_FLAG" = 0 2025-06-05 17:13:29.001 [pool-4-thread-1] WARN c.a.o.canal.server.embedded.handle.oracle.OracleHandler - ### [CANAL-MSG] 转换后消息 - 类型: UPDATE, 主键: null, 数据: [{QUOTE_VAL_IDS=20179006,21626673,31226046, FORMULA_OBJ={"formulaArr":["汇总"]}, VAL=0.000}] 2025-06-05 17:13:29.001 [pool-4-thread-1] WARN c.a.o.canal.server.embedded.handle.oracle.OracleHandler - ### [ORACLE-LOG] 解析到原始SQL - SCN: 7891264701, 操作: UPDATE, 表: CFG_INDICATOR_VAL, SQL: update "ENERGY_TEST"."CFG_INDICATOR_VAL" set "UPDATE_TIME" = TIMESTAMP ' 2025-06-04 14:06:11', "UPDATE_USER" = NULL, "INDICATOR_ID" = 22847, "GRANULARITY" = 'dateQuarterTotal', "START_DATE" = TIMESTAMP ' 2025-03-31 08:00:00', "END_DATE" = TIMESTAMP ' 2025-06-05 08:00:00', "LOCK_FLAG" = 0, "VALUE_TYPE" = 0, "ALLOW_UNLOCK_FLAG" = 1, "TENANT_ID" = 1, "VER_UUID" = '-1', "MODIFY_FLAG" = 0 where "INDICATOR_VAL_ID" = 31457300 and "CREATE_TIME" = TIMESTAMP ' 2025-06-04 08:19:52' and "CREATE_USER" IS NULL and "UPDATE_TIME" = TIMESTAMP ' 2025-06-04 13:57:55' and "UPDATE_USER" IS NULL and "DEL" = 0 and "REMARK" IS NULL and "INDICATOR_ID" = 22847 and "GRANULARITY" = 'dateQuarterTotal' and "SHIFT_NAME" IS NULL and "TEAM_NAME" IS NULL and "BELONG_DATE" = TIMESTAMP ' 2025-06-04 00:00:00' and "START_DATE" = TIMESTAMP ' 2025-03-31 08:00:00' and "END_DATE" = TIMESTAMP ' 2025-06-05 08:00:00' and "LOCK_FLAG" = 0 and "VALUE_TYPE" = 0 and "ALLOW_UNLOCK_FLAG" = 1 and "TENANT_ID" = 1 and "VER_UUID" = '-1' and "MODIFY_FLAG" = 0 2025-06-05 17:13:29.001 [pool-4-thread-1] WARN c.a.o.canal.server.embedded.handle.oracle.OracleHandler - ### [CANAL-MSG] 转换后消息 - 类型: UPDATE, 主键: null, 数据: [{UPDATE_TIME=2025-06-04 14:06:11, UPDATE_USER=NULL, INDICATOR_ID=22847, GRANULARITY=dateQuarterTotal, START_DATE=2025-03-31 08:00:00, END_DATE=2025-06-05 08:00:00, LOCK_FLAG=0, VALUE_TYPE=0, ALLOW_UNLOCK_FLAG=1, TENANT_ID=1, VER_UUID=-1, MODIFY_FLAG=0}] 2025-06-05 17:13:29.001 [pool-4-thread-1] WARN c.a.o.canal.server.embedded.handle.oracle.OracleHandler - ### [ORACLE-LOG] 解析到原始SQL - SCN: 7891264701, 操作: UPDATE, 表: CFG_INDICATOR_VAL, SQL: update "ENERGY_TEST"."CFG_INDICATOR_VAL" set "QUOTE_VAL_IDS" = '20178928,21626550,31457240', "FORMULA_OBJ" = '{"formulaArr":["汇总"]}', "VAL" = '0.000' where "INDICATOR_VAL_ID" = 31457300 and "CREATE_TIME" = TIMESTAMP ' 2025-06-04 08:19:52' and "CREATE_USER" IS NULL and "UPDATE_TIME" = TIMESTAMP ' 2025-06-04 14:06:11' and "UPDATE_USER" IS NULL and "DEL" = 0 and "REMARK" IS NULL and "INDICATOR_ID" = 22847 and "GRANULARITY" = 'dateQuarterTotal' and "SHIFT_NAME" IS NULL and "TEAM_NAME" IS NULL and "BELONG_DATE" = TIMESTAMP ' 2025-06-04 00:00:00' and "START_DATE" = TIMESTAMP ' 2025-03-31 08:00:00' and "END_DATE" = TIMESTAMP ' 2025-06-05 08:00:00' and "LOCK_FLAG" = 0 and "VALUE_TYPE" = 0 and "ALLOW_UNLOCK_FLAG" = 1 and "TENANT_ID" = 1 and "VER_UUID" = '-1' and "MODIFY_FLAG" = 0 2025-06-05 17:13:29.002 [pool-4-thread-1] WARN c.a.o.canal.server.embedded.handle.oracle.OracleHandler - ### [CANAL-MSG] 转换后消息 - 类型: UPDATE, 主键: null, 数据: [{QUOTE_VAL_IDS=20178928,21626550,31457240, FORMULA_OBJ={"formulaArr":["汇总"]}, VAL=0.000}] 2025-06-05 17:13:29.002 [pool-4-thread-1] WARN c.a.o.canal.server.embedded.handle.oracle.OracleHandler - ### [ORACLE-LOG] 解析到原始SQL - SCN: 7891264703, 操作: UPDATE, 表: CFG_INDICATOR_VAL, SQL: update "ENERGY_TEST"."CFG_INDICATOR_VAL" set "UPDATE_TIME" = TIMESTAMP ' 2025-06-04 14:06:11', "UPDATE_USER" = NULL, "INDICATOR_ID" = 22832, "GRANULARITY" = 'shift', "SHIFT_NAME" = '早班', "TEAM_NAME" = '固定排班', "START_DATE" = TIMESTAMP ' 2025-06-04 08:00:00', "END_DATE" = TIMESTAMP ' 2025-06-04 20:00:00', "LOCK_FLAG" = 0, "VALUE_TYPE" = 2, "ALLOW_UNLOCK_FLAG" = 1, "TENANT_ID" = 1, "VER_UUID" = 'a20df8f8-1d28-40e3-afa4-3f03ed44e594', "MODIFY_FLAG" = 0 where "INDICATOR_VAL_ID" = 31457273 and "CREATE_TIME" = TIMESTAMP ' 2025-06-04 08:19:52' and "CREATE_USER" IS NULL and "UPDATE_TIME" = TIMESTAMP ' 2025-06-04 13:57:55' and "UPDATE_USER" IS NULL and "DEL" = 0 and "REMARK" IS NULL and "INDICATOR_ID" = 22832 and "GRANULARITY" = 'shift' and "SHIFT_NAME" = '早班' and "TEAM_NAME" = '固定排班' and "BELONG_DATE" = TIMESTAMP ' 2025-06-04 00:00:00' and "START_DATE" = TIMESTAMP ' 2025-06-04 08:00:00' and "END_DATE" = TIMESTAMP ' 2025-06-04 20:00:00' and "LOCK_FLAG" = 0 and "VALUE_TYPE" = 2 and "ALLOW_UNLOCK_FLAG" = 1 and "TENANT_ID" = 1 and "VER_UUID" = 'a20df8f8-1d28-40e3-afa4-3f03ed44e594' and "MODIFY_FLAG" = 0 2025-06-05 17:13:29.003 [pool-4-thread-1] WARN c.a.o.canal.server.embedded.handle.oracle.OracleHandler - ### [CANAL-MSG] 转换后消息 - 类型: UPDATE, 主键: null, 数据: [{UPDATE_TIME=2025-06-04 14:06:11, UPDATE_USER=NULL, INDICATOR_ID=22832, GRANULARITY=shift, SHIFT_NAME=早班, TEAM_NAME=固定排班, START_DATE=2025-06-04 08:00:00, END_DATE=2025-06-04 20:00:00, LOCK_FLAG=0, VALUE_TYPE=2, ALLOW_UNLOCK_FLAG=1, TENANT_ID=1, VER_UUID=a20df8f8-1d28-40e3-afa4-3f03ed44e594, MODIFY_FLAG=0}] 2025-06-05 17:13:29.003 [pool-4-thread-1] WARN c.a.o.canal.server.embedded.handle.oracle.OracleHandler - ### [ORACLE-LOG] 解析到原始SQL - SCN: 7891264703, 操作: UPDATE, 表: CFG_INDICATOR_VAL, SQL: update "ENERGY_TEST"."CFG_INDICATOR_VAL" set "QUOTE_VAL_IDS" = '31413363', "FORMULA_OBJ" = '{"formulaArr":["GETVALUE(江南化工-30%草甘膦铵盐水剂内销(900g)-生产量-本月计划,上期)"]}', "QUOTE_LOGIC_TAG_VAL_OBJ" = '{"dR":[],"funcContent":"","list":[],"logicTagId":null,"mValArr":[],"name":"","quoteTagValDTOS":[],"value":0}', "VAL" = '0.000' where "INDICATOR_VAL_ID" = 31457273 and "CREATE_TIME" = TIMESTAMP ' 2025-06-04 08:19:52' and "CREATE_USER" IS NULL and "UPDATE_TIME" = TIMESTAMP ' 2025-06-04 14:06:11' and "UPDATE_USER" IS NULL and "DEL" = 0 and "REMARK" IS NULL and "INDICATOR_ID" = 22832 and "GRANULARITY" = 'shift' and "SHIFT_NAME" = '早班' and "TEAM_NAME" = '固定排班' and "BELONG_DATE" = TIMESTAMP ' 2025-06-04 00:00:00' and "START_DATE" = TIMESTAMP ' 2025-06-04 08:00:00' and "END_DATE" = TIMESTAMP ' 2025-06-04 20:00:00' and "LOCK_FLAG" = 0 and "VALUE_TYPE" = 2 and "ALLOW_UNLOCK_FLAG" = 1 and "TENANT_ID" = 1 and "VER_UUID" = 'a20df8f8-1d28-40e3-afa4-3f03ed44e594' and "MODIFY_FLAG" = 0 2025-06-05 17:13:29.003 [pool-4-thread-1] WARN c.a.o.canal.server.embedded.handle.oracle.OracleHandler - ### [CANAL-MSG] 转换后消息 - 类型: UPDATE, 主键: null, 数据: [{QUOTE_VAL_IDS=31413363, FORMULA_OBJ={"formulaArr":["GETVALUE(江南化工-30%草甘膦铵盐水剂内销(900g)-生产量-本月计划,上期)"]}, QUOTE_LOGIC_TAG_VAL_OBJ={"dR":[],"funcContent":"","list":[],"logicTagId":null,"mValArr":[],"name":"","quoteTagValDTOS":[],"value":0}, VAL=0.000}] 2025-06-05 17:13:29.003 [pool-4-thread-1] WARN c.a.o.canal.server.embedded.handle.oracle.OracleHandler - ### [ORACLE-LOG] 解析到原始SQL - SCN: 7891264703, 操作: UPDATE, 表: CFG_INDICATOR_VAL, SQL: update "ENERGY_TEST"."CFG_INDICATOR_VAL" set "UPDATE_TIME" = TIMESTAMP ' 2025-06-04 14:06:11', "UPDATE_USER" = NULL, "INDICATOR_ID" = 22841, "GRANULARITY" = 'dateYearTotal', "START_DATE" = TIMESTAMP ' 2024-12-31 08:00:00', "END_DATE" = TIMESTAMP ' 2025-06-05 08:00:00', "LOCK_FLAG" = 0, "VALUE_TYPE" = 0, "ALLOW_UNLOCK_FLAG" = 1, "TENANT_ID" = 1, "VER_UUID" = '-1', "MODIFY_FLAG" = 0 where "INDICATOR_VAL_ID" = 31457312 and "CREATE_TIME" = TIMESTAMP ' 2025-06-04 08:19:52' and "CREATE_USER" IS NULL and "UPDATE_TIME" = TIMESTAMP ' 2025-06-04 13:57:56' and "UPDATE_USER" IS NULL and "DEL" = 0 and "REMARK" IS NULL and "INDICATOR_ID" = 22841 and "GRANULARITY" = 'dateYearTotal' and "SHIFT_NAME" IS NULL and "TEAM_NAME" IS NULL and "BELONG_DATE" = TIMESTAMP ' 2025-06-04 00:00:00' and "START_DATE" = TIMESTAMP ' 2024-12-31 08:00:00' and "END_DATE" = TIMESTAMP ' 2025-06-05 08:00:00' and "LOCK_FLAG" = 0 and "VALUE_TYPE" = 0 and "ALLOW_UNLOCK_FLAG" = 1 and "TENANT_ID" = 1 and "VER_UUID" = '-1' and "MODIFY_FLAG" = 0 2025-06-05 17:13:29.004 [pool-4-thread-1] WARN c.a.o.canal.server.embedded.handle.oracle.OracleHandler - ### [CANAL-MSG] 转换后消息 - 类型: UPDATE, 主键: null, 数据: [{UPDATE_TIME=2025-06-04 14:06:11, UPDATE_USER=NULL, INDICATOR_ID=22841, GRANULARITY=dateYearTotal, START_DATE=2024-12-31 08:00:00, END_DATE=2025-06-05 08:00:00, LOCK_FLAG=0, VALUE_TYPE=0, ALLOW_UNLOCK_FLAG=1, TENANT_ID=1, VER_UUID=-1, MODIFY_FLAG=0}] 2025-06-05 17:13:29.004 [pool-4-thread-1] WARN c.a.o.canal.server.embedded.handle.oracle.OracleHandler - ### [ORACLE-LOG] 解析到原始SQL - SCN: 7891264703, 操作: UPDATE, 表: CFG_INDICATOR_VAL, SQL: update "ENERGY_TEST"."CFG_INDICATOR_VAL" set "QUOTE_VAL_IDS" = '15838299,17331748,18681827,20179015,21626644,31457307', "FORMULA_OBJ" = '{"formulaArr":["汇总"]}', "VAL" = '0.000' where "INDICATOR_VAL_ID" = 31457312 and "CREATE_TIME" = TIMESTAMP ' 2025-06-04 08:19:52' and "CREATE_USER" IS NULL and "UPDATE_TIME" = TIMESTAMP ' 2025-06-04 14:06:11' and "UPDATE_USER" IS NULL and "DEL" = 0 and "REMARK" IS NULL and "INDICATOR_ID" = 22841 and "GRANULARITY" = 'dateYearTotal' and "SHIFT_NAME" IS NULL and "TEAM_NAME" IS NULL and "BELONG_DATE" = TIMESTAMP ' 2025-06-04 00:00:00' and "START_DATE" = TIMESTAMP ' 2024-12-31 08:00:00' and "END_DATE" = TIMESTAMP ' 2025-06-05 08:00:00' and "LOCK_FLAG" = 0 and "VALUE_TYPE" = 0 and "ALLOW_UNLOCK_FLAG" = 1 and "TENANT_ID" = 1 and "VER_UUID" = '-1' and "MODIFY_FLAG" = 0 2025-06-05 17:13:29.005 [pool-4-thread-1] WARN c.a.o.canal.server.embedded.handle.oracle.OracleHandler - ### [CANAL-MSG] 转换后消息 - 类型: UPDATE, 主键: null, 数据: [{QUOTE_VAL_IDS=15838299,17331748,18681827,20179015,21626644,31457307, FORMULA_OBJ={"formulaArr":["汇总"]}, VAL=0.000}] 2025-06-05 17:13:29.005 [pool-4-thread-1] WARN c.a.o.canal.server.embedded.handle.oracle.OracleHandler - ### [ORACLE-LOG] 解析到原始SQL - SCN: 7891264706, 操作: UPDATE, 表: CFG_INDICATOR_VAL, SQL: update "ENERGY_TEST"."CFG_INDICATOR_VAL" set "UPDATE_TIME" = TIMESTAMP ' 2025-06-04 14:06:11', "UPDATE_USER" = NULL, "INDICATOR_ID" = 22785, "GRANULARITY" = 'quarter', "START_DATE" = TIMESTAMP ' 2025-03-31 08:00:00', "END_DATE" = TIMESTAMP ' 2025-06-30 08:00:00', "LOCK_FLAG" = 0, "VALUE_TYPE" = 0, "ALLOW_UNLOCK_FLAG" = 1, "TENANT_ID" = 1, "VER_UUID" = '-1', "MODIFY_FLAG" = 0 where "INDICATOR_VAL_ID" = 21925458 and "CREATE_TIME" = TIMESTAMP ' 2025-05-06 14:40:17' and "CREATE_USER" IS NULL and "UPDATE_TIME" = TIMESTAMP ' 2025-06-04 13:57:55' and "UPDATE_USER" IS NULL and "DEL" = 0 and "REMARK" IS NULL and "INDICATOR_ID" = 22785 and "GRANULARITY" = 'quarter' and "SHIFT_NAME" IS NULL and "TEAM_NAME" IS NULL and "BELONG_DATE" = TIMESTAMP ' 2025-04-01 00:00:00' and "START_DATE" = TIMESTAMP ' 2025-03-31 08:00:00' and "END_DATE" = TIMESTAMP ' 2025-06-30 08:00:00' and "LOCK_FLAG" = 0 and "VALUE_TYPE" = 0 and "ALLOW_UNLOCK_FLAG" = 1 and "TENANT_ID" = 1 and "VER_UUID" = '-1' and "MODIFY_FLAG" = 0 2025-06-05 17:13:29.005 [pool-4-thread-1] WARN c.a.o.canal.server.embedded.handle.oracle.OracleHandler - ### [CANAL-MSG] 转换后消息 - 类型: UPDATE, 主键: null, 数据: [{UPDATE_TIME=2025-06-04 14:06:11, UPDATE_USER=NULL, INDICATOR_ID=22785, GRANULARITY=quarter, START_DATE=2025-03-31 08:00:00, END_DATE=2025-06-30 08:00:00, LOCK_FLAG=0, VALUE_TYPE=0, ALLOW_UNLOCK_FLAG=1, TENANT_ID=1, VER_UUID=-1, MODIFY_FLAG=0}] 2025-06-05 17:13:29.005 [pool-4-thread-1] WARN c.a.o.canal.server.embedded.handle.oracle.OracleHandler - ### [ORACLE-LOG] 解析到原始SQL - SCN: 7891264706, 操作: UPDATE, 表: CFG_INDICATOR_VAL, SQL: update "ENERGY_TEST"."CFG_INDICATOR_VAL" set "QUOTE_VAL_IDS" = '20178912,21626521,31225937', "FORMULA_OBJ" = '{"formulaArr":["汇总"]}', "VAL" = '0.000' where "INDICATOR_VAL_ID" = 21925458 and "CREATE_TIME" = TIMESTAMP ' 2025-05-06 14:40:17' and "CREATE_USER" IS NULL and "UPDATE_TIME" = TIMESTAMP ' 2025-06-04 14:06:11' and "UPDATE_USER" IS NULL and "DEL" = 0 and "REMARK" IS NULL and "INDICATOR_ID" = 22785 and "GRANULARITY" = 'quarter' and "SHIFT_NAME" IS NULL and "TEAM_NAME" IS NULL and "BELONG_DATE" = TIMESTAMP ' 2025-04-01 00:00:00' and "START_DATE" = TIMESTAMP ' 2025-03-31 08:00:00' and "END_DATE" = TIMESTAMP ' 2025-06-30 08:00:00' and "LOCK_FLAG" = 0 and "VALUE_TYPE" = 0 and "ALLOW_UNLOCK_FLAG" = 1 and "TENANT_ID" = 1 and "VER_UUID" = '-1' and "MODIFY_FLAG" = 0 2025-06-05 17:13:29.006 [pool-4-thread-1] WARN c.a.o.canal.server.embedded.handle.oracle.OracleHandler - ### [CANAL-MSG] 转换后消息 - 类型: UPDATE, 主键: null, 数据: [{QUOTE_VAL_IDS=20178912,21626521,31225937, FORMULA_OBJ={"formulaArr":["汇总"]}, VAL=0.000}] 2025-06-05 17:13:29.006 [pool-4-thread-1] WARN c.a.o.canal.server.embedded.handle.oracle.OracleHandler - ### [ORACLE-LOG] 解析到原始SQL - SCN: 7891264708, 操作: UPDATE, 表: CFG_INDICATOR_VAL, SQL: update "ENERGY_TEST"."CFG_INDICATOR_VAL" set "UPDATE_TIME" = TIMESTAMP ' 2025-06-04 14:06:11', "UPDATE_USER" = NULL, "INDICATOR_ID" = 22813, "GRANULARITY" = 'year', "START_DATE" = TIMESTAMP ' 2024-12-31 08:00:00', "END_DATE" = TIMESTAMP ' 2025-12-31 08:00:00', "LOCK_FLAG" = 0, "VALUE_TYPE" = 2, "ALLOW_UNLOCK_FLAG" = 1, "TENANT_ID" = 1, "VER_UUID" = '-1', "MODIFY_FLAG" = 0 where "INDICATOR_VAL_ID" = 15838220 and "CREATE_TIME" = TIMESTAMP ' 2024-12-31 08:15:29' and "CREATE_USER" IS NULL and "UPDATE_TIME" = TIMESTAMP ' 2025-06-04 13:57:55' and "UPDATE_USER" IS NULL and "DEL" = 0 and "REMARK" IS NULL and "INDICATOR_ID" = 22813 and "GRANULARITY" = 'year' and "SHIFT_NAME" IS NULL and "TEAM_NAME" IS NULL and "BELONG_DATE" = TIMESTAMP ' 2025-01-01 00:00:00' and "START_DATE" = TIMESTAMP ' 2024-12-31 08:00:00' and "END_DATE" = TIMESTAMP ' 2025-12-31 08:00:00' and "LOCK_FLAG" = 0 and "VALUE_TYPE" = 2 and "ALLOW_UNLOCK_FLAG" = 1 and "TENANT_ID" = 1 and "VER_UUID" = '-1' and "MODIFY_FLAG" = 0 2025-06-05 17:13:29.007 [pool-4-thread-1] WARN c.a.o.canal.server.embedded.handle.oracle.OracleHandler - ### [CANAL-MSG] 转换后消息 - 类型: UPDATE, 主键: null, 数据: [{UPDATE_TIME=2025-06-04 14:06:11, UPDATE_USER=NULL, INDICATOR_ID=22813, GRANULARITY=year, START_DATE=2024-12-31 08:00:00, END_DATE=2025-12-31 08:00:00, LOCK_FLAG=0, VALUE_TYPE=2, ALLOW_UNLOCK_FLAG=1, TENANT_ID=1, VER_UUID=-1, MODIFY_FLAG=0}] 2025-06-05 17:13:29.007 [pool-4-thread-1] WARN c.a.o.canal.server.embedded.handle.oracle.OracleHandler - ### [ORACLE-LOG] 解析到原始SQL - SCN: 7891264708, 操作: UPDATE, 表: CFG_INDICATOR_VAL, SQL: update "ENERGY_TEST"."CFG_INDICATOR_VAL" set "QUOTE_VAL_IDS" = '15838201,17331741,18681868,20179006,21626673,31226046', "FORMULA_OBJ" = '{"formulaArr":["汇总"]}', "VAL" = '0.000' where "INDICATOR_VAL_ID" = 15838220 and "CREATE_TIME" = TIMESTAMP ' 2024-12-31 08:15:29' and "CREATE_USER" IS NULL and "UPDATE_TIME" = TIMESTAMP ' 2025-06-04 14:06:11' and "UPDATE_USER" IS NULL and "DEL" = 0 and "REMARK" IS NULL and "INDICATOR_ID" = 22813 and "GRANULARITY" = 'year' and "SHIFT_NAME" IS NULL and "TEAM_NAME" IS NULL and "BELONG_DATE" = TIMESTAMP ' 2025-01-01 00:00:00' and "START_DATE" = TIMESTAMP ' 2024-12-31 08:00:00' and "END_DATE" = TIMESTAMP ' 2025-12-31 08:00:00' and "LOCK_FLAG" = 0 and "VALUE_TYPE" = 2 and "ALLOW_UNLOCK_FLAG" = 1 and "TENANT_ID" = 1 and "VER_UUID" = '-1' and "MODIFY_FLAG" = 0 2025-06-05 17:13:29.007 [pool-4-thread-1] WARN c.a.o.canal.server.embedded.handle.oracle.OracleHandler - ### [CANAL-MSG] 转换后消息 - 类型: UPDATE, 主键: null, 数据: [{QUOTE_VAL_IDS=15838201,17331741,18681868,20179006,21626673,31226046, FORMULA_OBJ={"formulaArr":["汇总"]}, VAL=0.000}] 2025-06-05 17:13:29.007 [pool-4-thread-1] WARN c.a.o.canal.server.embedded.handle.oracle.OracleHandler - ### [ORACLE-LOG] 解析到原始SQL - SCN: 7891264710, 操作: UPDATE, 表: CFG_INDICATOR_VAL, SQL: update "ENERGY_TEST"."CFG_INDICATOR_VAL" set "UPDATE_TIME" = TIMESTAMP ' 2025-06-04 14:06:11', "UPDATE_USER" = NULL, "INDICATOR_ID" = 22821, "GRANULARITY" = 'quarter', "START_DATE" = TIMESTAMP ' 2025-03-31 08:00:00', "END_DATE" = TIMESTAMP ' 2025-06-30 08:00:00', "LOCK_FLAG" = 0, "VALUE_TYPE" = 2, "ALLOW_UNLOCK_FLAG" = 1, "TENANT_ID" = 1, "VER_UUID" = '-1', "MODIFY_FLAG" = 0 where "INDICATOR_VAL_ID" = 21925490 and "CREATE_TIME" = TIMESTAMP ' 2025-05-06 14:40:19' and "CREATE_USER" IS NULL and "UPDATE_TIME" = TIMESTAMP ' 2025-06-04 13:57:55' and "UPDATE_USER" IS NULL and "DEL" = 0 and "REMARK" IS NULL and "INDICATOR_ID" = 22821 and "GRANULARITY" = 'quarter' and "SHIFT_NAME" IS NULL and "TEAM_NAME" IS NULL and "BELONG_DATE" = TIMESTAMP ' 2025-04-01 00:00:00' and "START_DATE" = TIMESTAMP ' 2025-03-31 08:00:00' and "END_DATE" = TIMESTAMP ' 2025-06-30 08:00:00' and "LOCK_FLAG" = 0 and "VALUE_TYPE" = 2 and "ALLOW_UNLOCK_FLAG" = 1 and "TENANT_ID" = 1 and "VER_UUID" = '-1' and "MODIFY_FLAG" = 0 2025-06-05 17:13:29.008 [pool-4-thread-1] WARN c.a.o.canal.server.embedded.handle.oracle.OracleHandler - ### [CANAL-MSG] 转换后消息 - 类型: UPDATE, 主键: null, 数据: [{UPDATE_TIME=2025-06-04 14:06:11, UPDATE_USER=NULL, INDICATOR_ID=22821, GRANULARITY=quarter, START_DATE=2025-03-31 08:00:00, END_DATE=2025-06-30 08:00:00, LOCK_FLAG=0, VALUE_TYPE=2, ALLOW_UNLOCK_FLAG=1, TENANT_ID=1, VER_UUID=-1, MODIFY_FLAG=0}] 2025-06-05 17:13:29.008 [pool-4-thread-1] WARN c.a.o.canal.server.embedded.handle.oracle.OracleHandler - ### [ORACLE-LOG] 解析到原始SQL - SCN: 7891264710, 操作: UPDATE, 表: CFG_INDICATOR_VAL, SQL: update "ENERGY_TEST"."CFG_INDICATOR_VAL" set "QUOTE_VAL_IDS" = '20178990,21626675,31226052', "FORMULA_OBJ" = '{"formulaArr":["汇总"]}', "VAL" = '0.000' where "INDICATOR_VAL_ID" = 21925490 and "CREATE_TIME" = TIMESTAMP ' 2025-05-06 14:40:19' and "CREATE_USER" IS NULL and "UPDATE_TIME" = TIMESTAMP ' 2025-06-04 14:06:11' and "UPDATE_USER" IS NULL and "DEL" = 0 and "REMARK" IS NULL and "INDICATOR_ID" = 22821 and "GRANULARITY" = 'quarter' and "SHIFT_NAME" IS NULL and "TEAM_NAME" IS NULL and "BELONG_DATE" = TIMESTAMP ' 2025-04-01 00:00:00' and "START_DATE" = TIMESTAMP ' 2025-03-31 08:00:00' and "END_DATE" = TIMESTAMP ' 2025-06-30 08:00:00' and "LOCK_FLAG" = 0 and "VALUE_TYPE" = 2 and "ALLOW_UNLOCK_FLAG" = 1 and "TENANT_ID" = 1 and "VER_UUID" = '-1' and "MODIFY_FLAG" = 0 这是改完后输出的日志 再结合代码分析下 为啥没有insert记录 ,

END; 2025-06-05 13:51:09.307 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - 分析归档日志... 2025-06-05 13:51:09.308 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - SELECT NAME, FIRST_CHANGE#, NEXT_CHANGE# FROM v$archived_log WHERE DEST_ID = 1 AND FIRST_CHANGE# <= 7914757418 AND NEXT_CHANGE# > 7914757418 2025-06-05 13:51:09.333 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - BEGIN dbms_logmnr.add_logfile(logfilename=>'/DATA/app/product/12.2.0/dbhome_1/dbs/arch/1_74286_1100144861.dbf',options=>dbms_logmnr.new); END; 2025-06-05 13:51:09.352 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - BEGIN dbms_logmnr.start_logmnr(startScn=>'7914757418',options=> dbms_logmnr.dict_from_online_catalog + dbms_logmnr.skip_corruption + dbms_logmnr.no_sql_delimiter + dbms_logmnr.no_rowid_in_stmt + dbms_logmnr.string_literals_in_stmt) ; END; 2025-06-05 13:51:09.362 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - dbms_logmnr successfully! 当前分析模式: archive 2025-06-05 13:51:09.732 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - 本轮归档日志已分析结束, 结束本次会话, 开始下次分析, 开始点位: 7914757422 2025-06-05 13:51:09.732 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - BEGIN dbms_logmnr.end_logmnr; END; 2025-06-05 13:51:09.733 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - end_logmnr succeeded ! 2025-06-05 13:51:09.733 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - BEGIN DBMS_SESSION.SET_SQL_TRACE(FALSE); END; 2025-06-05 13:51:09.734 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - 分析归档日志... 2025-06-05 13:51:09.734 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - SELECT NAME, FIRST_CHANGE#, NEXT_CHANGE# FROM v$archived_log WHERE DEST_ID = 1 AND FIRST_CHANGE# <= 7914757422 AND NEXT_CHANGE# > 7914757422 2025-06-05 13:51:09.750 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - 分析在线日志... 2025-06-05 13:51:09.768 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - SELECT f.member,g.group#,g.FIRST_CHANGE# FROM v$log g left join v$logfile f on g.group# = f.group# where g.FIRST_CHANGE# <= 7914757422 AND g.NEXT_CHANGE# > 7914757422 2025-06-05 13:51:09.768 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - BEGIN dbms_logmnr.add_logfile(logfilename=>'/DATA/app/oradata/orcl/redo02.log',options=>dbms_logmnr.new); END; 2025-06-05 13:51:09.772 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - BEGIN dbms_logmnr.start_logmnr(startScn=>'7914757422',options=> dbms_logmnr.dict_from_online_catalog + dbms_logmnr.skip_corruption + dbms_logmnr.no_sql_delimiter + dbms_logmnr.no_rowid_in_stmt + dbms_logmnr.string_literals_in_stmt) ; END; 2025-06-05 13:51:09.786 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - dbms_logmnr successfully! 当前分析模式: online 2025-06-05 13:54:02.535 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - BEGIN dbms_logmnr.end_logmnr; END; 2025-06-05 13:54:02.537 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - end_logmnr succeeded ! 2025-06-05 13:54:02.537 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - BEGIN DBMS_SESSION.SET_SQL_TRACE(FALSE); END; 2025-06-05 13:54:02.538 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - 分析归档日志... 2025-06-05 13:54:02.538 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - SELECT NAME, FIRST_CHANGE#, NEXT_CHANGE# FROM v$archived_log WHERE DEST_ID = 1 AND FIRST_CHANGE# <= 7914822313 AND NEXT_CHANGE# > 7914822313 2025-06-05 13:54:02.555 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - BEGIN dbms_logmnr.add_logfile(logfilename=>'/DATA/app/product/12.2.0/dbhome_1/dbs/arch/1_74287_1100144861.dbf',options=>dbms_logmnr.new); END; 2025-06-05 13:54:02.560 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - BEGIN dbms_logmnr.start_logmnr(startScn=>'7914822313',options=> dbms_logmnr.dict_from_online_catalog + dbms_logmnr.skip_corruption + dbms_logmnr.no_sql_delimiter + dbms_logmnr.no_rowid_in_stmt + dbms_logmnr.string_literals_in_stmt) ; END; 2025-06-05 13:54:02.569 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - dbms_logmnr successfully! 当前分析模式: archive 2025-06-05 13:54:02.980 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - 本轮归档日志已分析结束, 结束本次会话, 开始下次分析, 开始点位: 7914822317 2025-06-05 13:54:02.980 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - BEGIN dbms_logmnr.end_logmnr; END; 2025-06-05 13:54:02.982 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - end_logmnr succeeded ! 2025-06-05 13:54:02.982 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - BEGIN DBMS_SESSION.SET_SQL_TRACE(FALSE); END; 2025-06-05 13:54:02.983 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - 分析归档日志... 2025-06-05 13:54:02.983 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - SELECT NAME, FIRST_CHANGE#, NEXT_CHANGE# FROM v$archived_log WHERE DEST_ID = 1 AND FIRST_CHANGE# <= 7914822317 AND NEXT_CHANGE# > 7914822317 2025-06-05 13:54:03.010 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - 分析在线日志... 2025-06-05 13:54:03.040 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - SELECT f.member,g.group#,g.FIRST_CHANGE# FROM v$log g left join v$logfile f on g.group# = f.group# where g.FIRST_CHANGE# <= 7914822317 AND g.NEXT_CHANGE# > 7914822317 2025-06-05 13:54:03.041 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - BEGIN dbms_logmnr.add_logfile(logfilename=>'/DATA/app/oradata/orcl/redo03.log',options=>dbms_logmnr.new); END; 2025-06-05 13:54:03.045 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - BEGIN dbms_logmnr.start_logmnr(startScn=>'7914822317',options=> dbms_logmnr.dict_from_online_catalog + dbms_logmnr.skip_corruption + dbms_logmnr.no_sql_delimiter + dbms_logmnr.no_rowid_in_stmt + dbms_logmnr.string_literals_in_stmt) ; END; 2025-06-05 13:54:03.054 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - dbms_logmnr successfully! 当前分析模式: online 2025-06-05 14:00:13.564 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - BEGIN dbms_logmnr.end_logmnr; END; 2025-06-05 14:00:13.570 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - end_logmnr succeeded ! 2025-06-05 14:00:13.570 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - BEGIN DBMS_SESSION.SET_SQL_TRACE(FALSE); END; 2025-06-05 14:00:13.571 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - 分析归档日志... 2025-06-05 14:00:13.571 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - SELECT NAME, FIRST_CHANGE#, NEXT_CHANGE# FROM v$archived_log WHERE DEST_ID = 1 AND FIRST_CHANGE# <= 7914891702 AND NEXT_CHANGE# > 7914891702 2025-06-05 14:00:13.587 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - BEGIN dbms_logmnr.add_logfile(logfilename=>'/DATA/app/product/12.2.0/dbhome_1/dbs/arch/1_74288_1100144861.dbf',options=>dbms_logmnr.new); END; 2025-06-05 14:00:13.600 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - BEGIN dbms_logmnr.start_logmnr(startScn=>'7914891702',options=> dbms_logmnr.dict_from_online_catalog + dbms_logmnr.skip_corruption + dbms_logmnr.no_sql_delimiter + dbms_logmnr.no_rowid_in_stmt + dbms_logmnr.string_literals_in_stmt) ; END; 2025-06-05 14:00:13.608 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - dbms_logmnr successfully! 当前分析模式: archive 2025-06-05 14:00:13.971 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - 本轮归档日志已分析结束, 结束本次会话, 开始下次分析, 开始点位: 7914891706 2025-06-05 14:00:13.971 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - BEGIN dbms_logmnr.end_logmnr; END; 2025-06-05 14:00:13.973 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - end_logmnr succeeded ! 2025-06-05 14:00:13.973 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - BEGIN DBMS_SESSION.SET_SQL_TRACE(FALSE); END; 2025-06-05 14:00:13.974 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - 分析归档日志... 2025-06-05 14:00:13.974 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - SELECT NAME, FIRST_CHANGE#, NEXT_CHANGE# FROM v$archived_log WHERE DEST_ID = 1 AND FIRST_CHANGE# <= 7914891706 AND NEXT_CHANGE# > 7914891706 2025-06-05 14:00:14.005 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - 分析在线日志... 2025-06-05 14:00:14.014 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - SELECT f.member,g.group#,g.FIRST_CHANGE# FROM v$log g left join v$logfile f on g.group# = f.group# where g.FIRST_CHANGE# <= 7914891706 AND g.NEXT_CHANGE# > 7914891706 2025-06-05 14:00:14.014 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - BEGIN dbms_logmnr.add_logfile(logfilename=>'/DATA/app/oradata/orcl/redo01.log',options=>dbms_logmnr.new); END; 2025-06-05 14:00:14.018 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - BEGIN dbms_logmnr.start_logmnr(startScn=>'7914891706',options=> dbms_logmnr.dict_from_online_catalog + dbms_logmnr.skip_corruption + dbms_logmnr.no_sql_delimiter + dbms_logmnr.no_rowid_in_stmt + dbms_logmnr.string_literals_in_stmt) ; END; 2025-06-05 14:00:14.043 [pool-34-thread-1] WARN c.a.o.c.server.embedded.handle.oracle.OracleHandlerV3 - dbms_logmnr successfully! 当前分析模式: online 这个日志执行结果 ,下面是代码, package com.alibaba.otter.canal.server.embedded.handle.oracle; import com.alibaba.otter.canal.instance.core.CanalInstance; import com.alibaba.otter.canal.meta.FileMixedMetaManager; import com.alibaba.otter.canal.parse.CanalEventParser; import com.alibaba.otter.canal.parse.inbound.mysql.MysqlEventParser; import com.alibaba.otter.canal.parse.support.AuthenticationInfo; import com.alibaba.otter.canal.protocol.FlatMessage; import com.alibaba.otter.canal.protocol.Message; import com.alibaba.otter.canal.server.embedded.handle.Constant; import com.alibaba.otter.canal.server.embedded.handle.NotMysqlHandler; import com.alibaba.otter.canal.server.exception.CanalServerException; import com.alibaba.otter.canal.utils.OracleUtil; import com.google.common.collect.Lists; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.CollectionUtils; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.sql.*; import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.atomic.AtomicLong; /** * @author : yangpeng * create at: 2022/5/21 13:09 * @description: oracle连接实现 */ @Deprecated public class OracleHandlerV3 implements NotMysqlHandler { private static final Logger logger = LoggerFactory.getLogger(OracleHandler.class); private final static String ORACLE_DRIVER_URL = "jdbc:oracle:thin:@"; private final static String DATA_DICTIONARY_PATH = "/oracle/oradata/orcl/logmnr"; private Connection connection; private AuthenticationInfo authInfo; private AtomicLong currentScn = new AtomicLong(0); private String queryLogSql; private Map<String, List<String>> pkMaps; private List<String> whiteList; private String currentRedoGroups; private boolean isSwitch = true; private int pageSize = 500; static { //加载驱动 try { Class.forName("oracle.jdbc.OracleDriver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } @Override public void subscribe(CanalInstance canalInstance) { //数据库基本信息 CanalEventParser eventParser = canalInstance.getEventParser(); MysqlEventParser mysqlEventParser = (MysqlEventParser) eventParser; this.authInfo = mysqlEventParser.getMasterInfo(); connect(); String filterRegex = authInfo.getFilterRegex(); if(!org.springframework.util.StringUtils.isEmpty(filterRegex) && !filterRegex.endsWith(".*")){ //whiteList = Arrays.asList(filterRegex.split(",")); whiteList = new ArrayList<>(); for (String table : filterRegex.split(",")) { whiteList.add(table.toUpperCase()); } } String index = FileMixedMetaManager.getScnLocal(canalInstance.getDestination()); if("0".equals(index)){ String scn = authInfo.getTimestamp(); if(StringUtils.isEmpty(scn)) scn = getStartPosition(); try { this.currentScn.set(Long.valueOf(scn)); FileMixedMetaManager.saveScnLocal(canalInstance.getDestination(), Long.valueOf(scn)); } catch (IOException e) { e.printStackTrace(); } }else{ this.currentScn.set(Long.valueOf(index)); } //queryCurrentArchivedLogInfo(); currentRedoGroups = queryCurrentRedoGroups(); authInfo.setArchived(true); updateSettings(); //获取主键 pkMaps = new HashMap<>(); for (String table : whiteList) { List<String> pkNames = getPkNames(authInfo.getDefaultDatabaseName(), table); //pkMaps.put(authInfo.getDefaultDatabaseName()+"."+table, pkNames); String key = (authInfo.getDefaultDatabaseName() + "." + table).toUpperCase(); pkMaps.put(key, pkNames != null ? pkNames : Collections.emptyList()); } } private String queryCurrentRedoGroups(){ //获取当前正在使用的redo日志文件的相关组信息 Statement statement = null; ResultSet resultSet = null; try { statement = connection.createStatement(); resultSet = statement.executeQuery("SELECT GROUP# FROM V$LOG WHERE STATUS = 'CURRENT'"); StringBuilder sb = new StringBuilder(); while (resultSet.next()) { sb.append(resultSet.getString(1)); } if(sb.length() > 0){ return sb.toString(); } } catch (SQLException e) { logger.warn("Query Current Redo Group failed!"); } finally { close(statement, resultSet); } return ""; } // private void queryCurrentArchivedLogInfo(){ // //获取当前最新的归档日志信息 // Statement statement = null; // ResultSet resultSet = null; // try { // statement = connection.createStatement(); // resultSet = statement.executeQuery("SELECT NAME, RECID FROM " + // "(SELECT NAME, RECID FROM v$archived_log WHERE DEST_ID = 1 ORDER BY RECID DESC) WHERE ROWNUM = 1"); // if (resultSet.next()) { // //lastArchivedLogName = resultSet.getString(1); // //lastArchivedLogRecid = resultSet.getLong(2); // //logger.warn("1 - > lastArchivedLogName: " + lastArchivedLogName); // } // } catch (SQLException e) { // logger.warn("Query Current Archived Log failed!"); // } finally { // close(statement, resultSet); // } // } private void isArchived(Statement statement, ResultSet resultSet, ArrayList<String> logFiles){ if(authInfo.isArchived()){ try { logger.warn("分析归档日志..."); statement = connection.createStatement(); String sql = "SELECT NAME, NEXT_CHANGE# FROM v$archived_log WHERE DEST_ID = 1 AND FIRST_CHANGE# >= "+currentScn+" ORDER BY RECID ASC"; resultSet = statement.executeQuery(sql); String NAME; while(resultSet.next()){ NAME = resultSet.getString(1); //添加归档日志 logFiles.add(NAME); } } catch (SQLException e) { logger.warn("Archive log parsing failed!"); e.printStackTrace(); StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); // 将出错的栈信息输出到printWriter中 e.printStackTrace(pw); pw.flush(); sw.flush(); try { sw.close(); } catch (IOException ex) { throw new RuntimeException(ex); } pw.close(); } finally { close(statement, resultSet); } } } private void addLogfile(Statement statement, ResultSet resultSet, ArrayList<String> logFiles){ if(CollectionUtils.isEmpty(logFiles)){ try { logger.warn("分析在线日志..."); statement = connection.createStatement(); resultSet = statement.executeQuery("select member from v$logfile"); while (resultSet.next()) { String fileName = resultSet.getString(1); if(!fileName.contains("sredo")){ logFiles.add(fileName); } } } catch (SQLException e) { logger.warn("Description Failed to query online logs!"); } finally { close(statement, resultSet); } } } private void setLogAnalyseDir(){ String createDictSql = "BEGIN dbms_logmnr_d.build(dictionary_filename =>'" + authInfo.getOraName() + "', dictionary_location =>'" + DATA_DICTIONARY_PATH + "'); END;"; logger.warn(createDictSql); getCallableStatement(createDictSql); } private void addAllfile(ArrayList<String> logFiles){ StringBuilder sbSQL = new StringBuilder(); for (int i = 0; i < logFiles.size(); ++i) { if (i == 0) { sbSQL.append("BEGIN\n"); } sbSQL.append("dbms_logmnr.add_logfile(logfilename=>'").append(logFiles.get(i)).append("',options=>dbms_logmnr.") .append(i == 0 ? "new" : "addfile").append(");\n"); } logFiles.clear(); sbSQL.append("END;\n"); logger.warn(sbSQL.toString()); getCallableStatement(sbSQL.toString()); } private void appendSql(){ //logmner视图查询 StringBuilder queryStr = new StringBuilder(); queryStr.append("SELECT scn,operation,sql_redo,table_space,table_name,timestamp,csf FROM v$logmnr_contents where 1=1"); queryStr.append(" AND seg_type_name='TABLE'"); queryStr.append(" AND table_space!='SYSTEM'"); String filter = authInfo.getFilter(); if (filter.contains(".*") && !".*..*".equals(filter)) { queryStr.append(" AND seg_owner='").append(authInfo.getDefaultDatabaseName()).append("'"); } if (!filter.contains(".*") && !".*..*".equals(filter)) { queryStr.append(" AND seg_owner='").append(authInfo.getDefaultDatabaseName()).append("'"); queryStr.append(" AND table_name in(").append(authInfo.getTable()).append(")"); } queryStr.append(" AND scn > " + "?"); queryStr.append(" AND rownum < ").append(pageSize); queryStr.append(" order by scn asc "); queryStr.append(" AND operation IN ('INSERT','UPDATE','DELETE')"); this.queryLogSql = queryStr.toString(); } public void updateSettings() { ArrayList<String> logFiles = new ArrayList<>(); Statement statement = null; ResultSet resultSet = null; try { // 是否分析归档日志 isArchived(statement, resultSet, logFiles); // 分析在线日志 addLogfile(statement, resultSet, logFiles); if (logFiles.isEmpty()) throw new RuntimeException("The Oracle log file was not read"); // 设置日志分析目录 setLogAnalyseDir(); // 添加所有日志文件 addAllfile(logFiles); try { // 开启logmnr视图 String startsql = "BEGIN\n" + "dbms_logmnr.start_logmnr(startScn=>'" + currentScn.get() //开始的scn号 + "',dictfilename=>'" + DATA_DICTIONARY_PATH + "/" + authInfo.getOraName() //路径 + "',options=>" + " dbms_logmnr.primary_key" + " +dbms_logmnr.skip_corruption" + " + dbms_logmnr.no_sql_delimiter" + " + dbms_logmnr.no_rowid_in_stmt" + " + dbms_logmnr.committed_data_only" + " + dbms_logmnr.string_literals_in_stmt) ;\n" + "END;"; logger.warn(startsql); getCallableStatement(startsql); } catch (Exception e) { logger.error("oracle logminer Unsubscribe failed:{}", e); // 开启logmnr视图 String startsql = "BEGIN\n" + "dbms_logmnr.start_logmnr(startScn=>'" + 0 //开始的scn号 + "',dictfilename=>'" + DATA_DICTIONARY_PATH + "/" + authInfo.getOraName() //路径 + "',options=>" + " dbms_logmnr.primary_key" + " +dbms_logmnr.skip_corruption" + " + dbms_logmnr.no_sql_delimiter" + " + dbms_logmnr.no_rowid_in_stmt" + " + dbms_logmnr.committed_data_only" + " + dbms_logmnr.string_literals_in_stmt) ;\n" + "END;"; logger.warn(startsql); getCallableStatement(startsql); } //logmner视图查询 appendSql(); logger.info("Subscribe to Oracle {} successfully!", authInfo.getAddress() + ":" + authInfo.getDefaultDatabaseName()); } catch (Exception e) { throw new CanalServerException("Failed to subscribe to Oracle logs. Procedure:::", e); } finally { close(statement, resultSet); } } private void logSwitchVerify(){ String crgs = queryCurrentRedoGroups(); if(StringUtils.isNotEmpty(crgs) && !crgs.equals(currentRedoGroups)){ currentRedoGroups = crgs; unsubscribe(); //oracle切换日志组时可能存在日志没来得及分析的遗漏问题, 此时应分析最近的归档日志, 且只分析一次, 处理掉可能遗漏的数据后再开启分析在线日志 authInfo.setArchived(true); isSwitch = true; updateSettings(); } } @Override public synchronized Message getWithoutAck(CanalInstance canalInstance) { try { if (connection.isClosed()) { reconnect(); } } catch (Exception e) { logger.error(e.getMessage(), e); } logSwitchVerify(); String findSql = this.queryLogSql.replace("?", currentScn.toString()); logger.warn(findSql); List<FlatMessage> data = new ArrayList<>(); Statement statement = null; ResultSet resultSet = null; try { statement = connection.createStatement(); resultSet = statement.executeQuery(findSql); //获取历史标识 long lastScn = currentScn.get(); Long endScn = null; while (resultSet.next()) { long scn = resultSet.getLong(Constant.scn); if (scn <= currentScn.get()) continue; String operation = resultSet.getString(Constant.operation); String sql = resultSet.getString(Constant.sql_redo); if(StringUtils.isEmpty(sql)) continue; // String tableSpace = resultSet.getString(Constant.table_space); String tableName = resultSet.getString(Constant.table_name); String timestamp = resultSet.getString(Constant.timestamp); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); long es = sdf.parse(timestamp).getTime() / 1000; FlatMessage flatMessage = new FlatMessage(); flatMessage.setDatabase(authInfo.getDefaultDatabaseName()); flatMessage.setTable(tableName); flatMessage.setIsDdl(false); flatMessage.setType(operation); flatMessage.setEs(es); flatMessage.setTs(System.currentTimeMillis()); flatMessage.setSql(sql); OracleUtil.toMqformat(flatMessage);//转换sql为mq所需json格式 //主键设置 //List<String> list = pkMaps.get(authInfo.getDefaultDatabaseName() + "." + tableName); String key = (authInfo.getDefaultDatabaseName() + "." + tableName).toUpperCase(); List<String> list = pkMaps.get(key); if (list == null || list.isEmpty()) { logger.warn("表 {} 无主键信息! 操作: {}, SQL: {}", tableName, operation, sql); } else { logger.info("主键信息: table={}, pk={}", tableName, list); } if(!CollectionUtils.isEmpty(list)){ flatMessage.setPkNames(list); }else{ flatMessage.setPkNames(new ArrayList<>()); } data.add(flatMessage); endScn = scn; } if (!CollectionUtils.isEmpty(data)) { if(null != endScn) currentScn.set(endScn); FileMixedMetaManager.saveScnLocal(canalInstance.getDestination(), currentScn.get()); return new Message(lastScn, data, Constant.NOT_MYSQL); } } catch (Exception e) { logger.error("oracle logminer Unsubscribe failed:{}", e); unsubscribe(); updateSettings(); } finally { close(statement, resultSet); if(isSwitch){ if(!CollectionUtils.isEmpty(data) && data.size() >= (pageSize-1)){ //data不等于空, 且条目数大于等于每次获取的日志数量, 可能说明从归档日志中一次不足以拿完全部日志, 多循环几次 }else{ isSwitch = false; authInfo.setArchived(false); unsubscribe(); updateSettings(); } } } return new Message(-1, true, null); } private String getStartPosition() { String sql = "SELECT MAX(CURRENT_SCN) CURRENT_SCN FROM GV$DATABASE"; Statement statement = null; ResultSet resultSet = null; try { statement = connection.createStatement(); resultSet = statement.executeQuery(sql); while (resultSet.next()) { long scn = resultSet.getLong(1); return String.valueOf(scn); } } catch (SQLException e) { e.printStackTrace(); } finally { close(statement, resultSet); } return "0"; } public List<String> getPkNames(String datasourceName, String tableName) { List<String> pkNames = Lists.newArrayList(); Statement statement = null; ResultSet resultSet = null; try { DatabaseMetaData metaData = connection.getMetaData(); String tableNameUpper = tableName.toUpperCase(); resultSet = metaData.getPrimaryKeys(datasourceName, null, tableNameUpper); while (resultSet.next()) { pkNames.add(resultSet.getString("COLUMN_NAME")); } return pkNames; } catch (Exception e) { logger.error(datasourceName+"."+tableName+"oracle get table primary key returns null", e); return Collections.emptyList(); } finally { close(statement, resultSet); } } private void close(Statement statement, ResultSet resultSet){ try { if (resultSet != null) resultSet.close(); } catch (SQLException e1) { e1.printStackTrace(); } finally { try { if (statement != null) statement.close(); } catch (SQLException e) { e.printStackTrace(); } } } @Override public void connect() { String jdbcUrl = ORACLE_DRIVER_URL + authInfo.getAddress().getHostString() + ":" + authInfo.getAddress().getPort() + ":" + authInfo.getServerName(); try { this.connection = DriverManager.getConnection(jdbcUrl, authInfo.getUsername(), authInfo.getPassword()); } catch (SQLException e) { e.printStackTrace(); } } @Override public void reconnect() { disconnect(); connect(); } @Override public void disconnect() { if (connection != null) { try { unsubscribe(); connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } @Override public void ack(CanalInstance canalInstance) { return; } @Override public boolean checkConsistent(CanalInstance canalInstance) { CanalEventParser eventParser = canalInstance.getEventParser(); MysqlEventParser parser = (MysqlEventParser) eventParser; AuthenticationInfo newAuthInfo = parser.getMasterInfo(); String newUrl = newAuthInfo.getAddress().getHostName() + newAuthInfo.getAddress().getPort(); String oldUrl = this.authInfo.getAddress().getHostName() + this.authInfo.getAddress().getPort(); if (Objects.equals(newUrl, oldUrl)) { return true; } return false; } @Override //回退到指定位置 public void rollback(CanalInstance canalInstance, Long batchId) { try { FileMixedMetaManager.saveScnLocal(canalInstance.getDestination(), batchId); currentScn.set(batchId); } catch (IOException e) { e.printStackTrace(); } } public void getCallableStatement(String sql) { CallableStatement callableStatement = null; try { callableStatement = connection.prepareCall(sql); callableStatement.execute(); } catch (SQLException e) { logger.error(e.getMessage(), e); e.printStackTrace(); StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); // 将出错的栈信息输出到printWriter中 e.printStackTrace(pw); pw.flush(); sw.flush(); try { sw.close(); } catch (IOException ex) { throw new RuntimeException(ex); } pw.close(); if (e.getErrorCode() == 1291) { throw new CanalServerException("1291"); } } finally { close(callableStatement, null); } } public void getStatement(String sql) { try (Statement statement = connection.createStatement()) { statement.execute(sql); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * description: 关闭查询会话 * * @param {} * @return void */ public void unsubscribe() { getStatement("BEGIN\n" + "dbms_logmnr.end_logmnr;\n" + "END;"); logger.warn("Unsubscribing succeeded !"); } } 怎么在代码加日志打印来排查 ,解析到的oracle归档日志中的sql是否正确,尤其是update和insert,来排查增量数据没有增加的原因

cd to /kms/component/canal-admin/bin for workaround relative path CLASSPATH :/kms/component/canal-admin/bin/../conf:/kms/component/canal-admin/bin/../lib/zookeeper-3.4.5.jar:/kms/component/canal-admin/bin/../lib/zkclient-0.10.jar:/kms/component/canal-admin/bin/../lib/xmlunit-core-2.5.1.jar:/kms/component/canal-admin/bin/../lib/validation-api-2.0.1.Final.jar:/kms/component/canal-admin/bin/../lib/tomcat-embed-websocket-8.5.29.jar:/kms/component/canal-admin/bin/../lib/tomcat-embed-el-8.5.29.jar:/kms/component/canal-admin/bin/../lib/tomcat-embed-core-8.5.29.jar:/kms/component/canal-admin/bin/../lib/spring-webmvc-5.0.5.RELEASE.jar:/kms/component/canal-admin/bin/../lib/spring-web-5.0.5.RELEASE.jar:/kms/component/canal-admin/bin/../lib/spring-tx-5.0.5.RELEASE.jar:/kms/component/canal-admin/bin/../lib/spring-orm-5.0.5.RELEASE.jar:/kms/component/canal-admin/bin/../lib/spring-jdbc-5.0.5.RELEASE.jar:/kms/component/canal-admin/bin/../lib/spring-jcl-5.0.5.RELEASE.jar:/kms/component/canal-admin/bin/../lib/spring-expression-5.0.5.RELEASE.jar:/kms/component/canal-admin/bin/../lib/spring-core-5.0.5.RELEASE.jar:/kms/component/canal-admin/bin/../lib/spring-context-5.0.5.RELEASE.jar:/kms/component/canal-admin/bin/../lib/spring-boot-test-autoconfigure-2.0.1.RELEASE.jar:/kms/component/canal-admin/bin/../lib/spring-boot-test-2.0.1.RELEASE.jar:/kms/component/canal-admin/bin/../lib/spring-boot-starter-web-2.0.1.RELEASE.jar:/kms/component/canal-admin/bin/../lib/spring-boot-starter-tomcat-2.0.1.RELEASE.jar:/kms/component/canal-admin/bin/../lib/spring-boot-starter-test-2.0.1.RELEASE.jar:/kms/component/canal-admin/bin/../lib/spring-boot-starter-logging-2.0.1.RELEASE.jar:/kms/component/canal-admin/bin/../lib/spring-boot-starter-json-2.0.1.RELEASE.jar:/kms/component/canal-admin/bin/../lib/spring-boot-starter-jdbc-2.0.1.RELEASE.jar:/kms/component/canal-admin/bin/../lib/spring-boot-starter-2.0.1.RELEASE.jar:/kms/component/canal-admin/bin/../lib/spring-boot-autoconfigure-2.0.1.RELEASE.jar:/kms/component/canal-admin/bin/../lib/spring-boot-2.0.1.RELEASE.jar:/kms/component/canal-admin/bin/../lib/spring-beans-5.0.5.RELEASE.jar:/kms/component/canal-admin/bin/../lib/spring-aop-5.0.5.RELEASE.jar:/kms/component/canal-admin/bin/../lib/snakeyaml-1.19.jar:/kms/component/canal-admin/bin/../lib/slf4j-api-1.7.25.jar:/kms/component/canal-admin/bin/../lib/protobuf-java-3.6.1.jar:/kms/component/canal-admin/bin/../lib/persistence-api-2.2.2.jar:/kms/component/canal-admin/bin/../lib/objenesis-2.6.jar:/kms/component/canal-admin/bin/../lib/netty-all-4.1.23.Final.jar:/kms/component/canal-admin/bin/../lib/netty-3.2.2.Final.jar:/kms/component/canal-admin/bin/../lib/mysql-connector-java-5.1.48.jar:/kms/component/canal-admin/bin/../lib/mockito-core-2.15.0.jar:/kms/component/canal-admin/bin/../lib/logback-core-1.2.3.jar:/kms/component/canal-admin/bin/../lib/logback-classic-1.2.3.jar:/kms/component/canal-admin/bin/../lib/log4j-to-slf4j-2.10.0.jar:/kms/component/canal-admin/bin/../lib/log4j-api-2.10.0.jar:/kms/component/canal-admin/bin/../lib/jul-to-slf4j-1.7.25.jar:/kms/component/canal-admin/bin/../lib/jsr305-3.0.2.jar:/kms/component/canal-admin/bin/../lib/json-smart-2.3.jar:/kms/component/canal-admin/bin/../lib/json-path-2.4.0.jar:/kms/component/canal-admin/bin/../lib/jsonassert-1.5.0.jar:/kms/component/canal-admin/bin/../lib/jcl-over-slf4j-1.7.25.jar:/kms/component/canal-admin/bin/../lib/jboss-logging-3.3.2.Final.jar:/kms/component/canal-admin/bin/../lib/javax.annotation-api-1.3.2.jar:/kms/component/canal-admin/bin/../lib/jackson-module-parameter-names-2.9.5.jar:/kms/component/canal-admin/bin/../lib/jackson-datatype-jsr310-2.9.5.jar:/kms/component/canal-admin/bin/../lib/jackson-datatype-jdk8-2.9.5.jar:/kms/component/canal-admin/bin/../lib/jackson-databind-2.9.5.jar:/kms/component/canal-admin/bin/../lib/jackson-core-2.9.5.jar:/kms/component/canal-admin/bin/../lib/jackson-annotations-2.9.0.jar:/kms/component/canal-admin/bin/../lib/j2objc-annotations-1.1.jar:/kms/component/canal-admin/bin/../lib/HikariCP-2.7.8.jar:/kms/component/canal-admin/bin/../lib/hibernate-validator-6.0.9.Final.jar:/kms/component/canal-admin/bin/../lib/hamcrest-library-1.3.jar:/kms/component/canal-admin/bin/../lib/hamcrest-core-1.3.jar:/kms/component/canal-admin/bin/../lib/guava-22.0.jar:/kms/component/canal-admin/bin/../lib/fastjson-1.2.58.sec06.jar:/kms/component/canal-admin/bin/../lib/error_prone_annotations-2.0.18.jar:/kms/component/canal-admin/bin/../lib/ebean-types-1.3.jar:/kms/component/canal-admin/bin/../lib/ebean-migration-11.16.2.jar:/kms/component/canal-admin/bin/../lib/ebean-datasource-api-4.5.jar:/kms/component/canal-admin/bin/../lib/ebean-datasource-4.5.2.jar:/kms/component/canal-admin/bin/../lib/ebean-annotation-4.11.jar:/kms/component/canal-admin/bin/../lib/ebean-11.41.1.jar:/kms/component/canal-admin/bin/../lib/commons-logging-1.1.1.jar:/kms/component/canal-admin/bin/../lib/commons-lang-2.6.jar:/kms/component/canal-admin/bin/../lib/commons-io-2.4.jar:/kms/component/canal-admin/bin/../lib/commons-codec-1.11.jar:/kms/component/canal-admin/bin/../lib/commons-beanutils-1.8.2.jar:/kms/component/canal-admin/bin/../lib/classmate-1.3.4.jar:/kms/component/canal-admin/bin/../lib/canal.protocol-1.1.6-SNAPSHOT.jar:/kms/component/canal-admin/bin/../lib/canal.common-1.1.6-SNAPSHOT.jar:/kms/component/canal-admin/bin/../lib/canal.admin-web-1.1.6-SNAPSHOT.jar:/kms/component/canal-admin/bin/../lib/caffeine-2.6.2.jar:/kms/component/canal-admin/bin/../lib/byte-buddy-agent-1.7.11.jar:/kms/component/canal-admin/bin/../lib/byte-buddy-1.7.11.jar:/kms/component/canal-admin/bin/../lib/avaje-classpath-scanner-api-2.2.jar:/kms/component/canal-admin/bin/../lib/avaje-classpath-scanner-3.1.1.jar:/kms/component/canal-admin/bin/../lib/assertj-core-3.9.1.jar:/kms/component/canal-admin/bin/../lib/asm-5.0.4.jar:/kms/component/canal-admin/bin/../lib/antlr4-runtime-4.7.2.jar:/kms/component/canal-admin/bin/../lib/animal-sniffer-annotations-1.14.jar:/kms/component/canal-admin/bin/../lib/android-json-0.0.20131108.vaadin1.jar:/kms/component/canal-admin/bin/../lib/accessors-smart-1.2.jar:/usr/java/jdk-17/lib:.:/usr/java/jdk-17/lib:.:/usr/java/jdk-17/lib:.:/usr/java/jdk-17/lib:.:/usr/java/jdk-17/lib:.:/usr/local/jdk1.8.0_211/lib/dt.jar:/usr/local/jdk1.8.0_211/lib/tools.jar cd to /kms/component/canal-admin/bin for continue

com.alibaba.druid.pool.DruidDataSource : create connection SQLException, url: jdbc:mysql://localhost:3306/sky_take_out?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true, errorCode 1045, state 28000 java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) ~[mysql-connector-java-8.0.30.jar:8.0.30] at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-java-8.0.30.jar:8.0.30] at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:828) ~[mysql-connector-java-8.0.30.jar:8.0.30] at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:448) ~[mysql-connector-java-8.0.30.jar:8.0.30] at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:241) ~[mysql-connector-java-8.0.30.jar:8.0.30] at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198) ~[mysql-connector-java-8.0.30.jar:8.0.30] at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1651) ~[druid-1.2.1.jar:1.2.1] at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1717) ~[druid-1.2.1.jar:1.2.1] at com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread.run(DruidDataSource.java:2785) ~[druid-1.2.1.jar:1.2.1]

最新推荐

recommend-type

二维码工具(1).zip

二维码工具(1).zip
recommend-type

基于ZXing修改的二维码扫描器.zip

基于ZXing修改的二维码扫描器.zip
recommend-type

Hyperledger Fabric v2与Accord Project Cicero智能合约开发指南

标题和描述中提到的“hlf-cicero-contract:Accord Project Cicero与Hyperledger Fabric v2签约”以及“半西约合同”暗示了与智能合约和区块链技术相关的知识点。下面详细说明这些知识点: ### 智能合约与区块链技术 智能合约是一套运行在区块链上的程序,当合约条款被触发时,合约会自动执行相应的操作。这种自动执行的特点使得智能合约特别适合于执行多方之间的可信交易,它能减少或消除中介服务的需要,从而降低交易成本并提高效率。 区块链技术是一种分布式账本技术,通过加密算法和共识机制保证了交易数据的不可篡改性和透明性。区块链上的每一笔交易都会被网络中的多个节点验证并记录,确保了交易记录的安全性。 ### Hyperledger Fabric v2 Hyperledger Fabric 是由Linux基金会托管的一个开源项目,它是企业级区块链框架,旨在为商业应用提供安全、模块化、可扩展的区块链平台。Hyperledger Fabric v2.2是该框架的一个版本。 Hyperledger Fabric v2支持链码(Chaincode)概念,链码是部署在Hyperledger Fabric网络上的应用程序,它可以被用来实现各种智能合约逻辑。链码在运行时与网络中的背书节点和排序服务交互,负责验证、执行交易以及维护账本状态。 ### Accord Project Cicero Accord Project Cicero 是一个开源的智能合同模板和执行引擎,它允许开发者使用自然语言来定义合同条款,并将这些合同转换为可以在区块链上执行的智能合约。CiceroMark是基于Markdown格式的一种扩展,它允许在文档中嵌入智能合约逻辑。 通过Accord Project Cicero,可以创建出易于理解、可执行的智能合约。这些合同可以与Hyperledger Fabric集成,利用其提供的安全、透明的区块链网络环境,从而使得合同条款的执行更加可靠。 ### 智能合约的安装与部署 描述中提到了“安装”和“启动”的步骤,这意味着为了使用HLF v2.2和Accord Project Cicero,需要先进行一系列的配置和安装工作。这通常包括设置环境变量(例如HLF_INSTALL_DIR)、安装区块链网络(Test-Net)以及安装其他必需的软件工具(如jq)。 jq是一个轻量级且灵活的命令行JSON处理器,常用于处理JSON数据。在区块链项目中,jq可以帮助开发者处理链码或智能合约的数据,特别是在与网络节点交互时。 ### JavaScript 标签 标签“JavaScript”表明本项目或相关文档中会涉及到JavaScript编程语言。Hyperledger Fabric v2支持多种智能合约语言,其中JavaScript是一个广泛使用的选项。JavaScript在编写链码时提供了灵活的语法和强大的库支持,是进行区块链开发的一个流行选择。 ### 文件结构 文件名称列表“hlf-cicero-contract-master”暗示这是一个包含所有相关文件和资源的项目源代码目录。这个名称通常表明开发者可以从该目录开始探索、安装和配置项目的所有组件。 ### 综合知识点 1. 智能合约与区块链技术可以自动化执行多方面可信交易,降低交易成本并提高效率。 2. Hyperledger Fabric v2为企业提供一个安全、模块化、可扩展的区块链平台。 3. Accord Project Cicero结合Markdown格式的CiceroMark,将自然语言定义的合同条款转换为可执行的智能合约。 4. 智能合约的安装和部署涉及到一系列配置步骤,包括设置环境变量、安装必要的软件工具等。 5. JavaScript是编写智能合约的流行语言之一,为区块链开发提供灵活性和强大的库支持。 6. 项目文件结构表明从一个主目录可以探索和配置所有项目相关文件和资源。 以上是根据文件标题、描述、标签以及文件名称列表所提取的相关知识点。这些知识点对于理解Hyperledger Fabric v2和Accord Project Cicero在智能合约中的应用尤为重要。
recommend-type

深度神经网络优化技巧全解析

# 深度神经网络优化技巧全解析 ## 1 超越 Sigmoid 函数 在神经网络中,Sigmoid 函数曾被广泛使用,但它存在一些问题,如梯度消失。研究人员一直在寻找更好的激活函数,且不同的激活函数在不同场景下表现各异。 ### 1.1 ReLU 函数登场 如今,修正线性单元(ReLU)成为了 Sigmoid 的常用替代函数。与 Sigmoid 相比,ReLU 非常简单,以下是其 Python 实现: ```python def relu(z): if z <= 0: return 0 else: return z ``` ReLU 由两段直
recommend-type

什么是噪声功率密度

<think> 嗯,用户这次问的是噪声功率密度的定义,结合之前的系统指令和站内引用,需要给出清晰准确的中文解释。用户可能是电子工程或通信专业的学生,正在学习噪声相关的理论基础,也可能是工程师需要实际应用概念。从引用来[^1]看,用户对相位噪声的定义有基础认知,但需要系统梳理核心概念。 噪声功率密度最本质的定义应该是单位带宽内的噪声功率。引用[^2]提到电阻热噪声的例子很典型,50Ω电阻在300K环境下功率谱密度是定值(0.9nV/√Hz)²,这说明: 1. 它描述的是噪声功率随频率分布的密度 2. 与带宽强相关(带宽加倍则总功率加倍) 3. 单位通常用W/Hz或V²/Hz 维纳-辛钦定理(
recommend-type

Libshare: Salesforce的高效可重用模块集合

Salesforce是一个云基础的CRM平台,它允许用户构建定制应用程序来满足特定的业务需求。Apex是Salesforce平台上的一个强类型编程语言,用于开发复杂的业务逻辑,通过触发器、类和组件等实现。这些组件使得开发者可以更高效地构建应用程序和扩展Salesforce的功能。 在提到的"libshare:经过测试的Salesforce可重用模块"文件中,首先介绍了一个名为Libshare的工具包。这个工具包包含了一系列已经过测试的可重用模块,旨在简化和加速Salesforce应用程序的开发。 Libshare的各个组成部分的知识点如下: 1. 设置模块:在Salesforce应用程序中,应用程序设置的管理是必不可少的一部分。设置模块提供了一种简便的方式存储应用程序的设置,并提供了一个易用的API来与之交互。这样,开发者可以轻松地为不同的环境配置相同的设置,并且可以快速地访问和修改这些配置。 2. Fluent断言模块:断言是单元测试中的关键组成部分,它们用于验证代码在特定条件下是否表现预期。Fluent断言模块受到Java世界中Assertj的启发,提供了一种更流畅的方式来编写断言。通过这种断言方式,可以编写更易于阅读和维护的测试代码,提高开发效率和测试质量。 3. 秒表模块:在性能调优和效率测试中,记录方法的执行时间是常见的需求。秒表模块为开发者提供了一种方便的方式来记录总时间,并跟踪每种方法所花费的时间。这使得开发者能够识别瓶颈并优化代码性能。 4. JsonMapper模块:随着Web API的广泛应用,JSON数据格式在应用程序开发中扮演了重要角色。JsonMapper模块为开发者提供了一个更高级别的抽象,用于读取和创建JSON内容。这能够大幅简化与JSON数据交互的代码,并提高开发效率。 5. utils模块:在软件开发过程中,经常会遇到需要重复实现一些功能的情况,这些功能可能是通用的,例如日期处理、字符串操作等。utils模块提供了一系列已经编写好的实用工具函数,可以用于节省时间,避免重复劳动,提高开发效率。 6. 记录器模块:记录器通常用于记录应用程序的运行日志,以便于问题诊断和性能监控。系统提供的System.debug功能虽然强大,但在大型应用中,统一的记录器包装器可以使得日志管理更加高效。记录器模块支持记录器名称,并且可以对日志进行适当的封装。 7. App Logger模块:App Logger模块扩展了记录器模块的功能,它允许开发者将日志语句保存到一个精心设计的App Log对象中。此外,App Logger模块支持存储长达56k字符的日志内容,这对于复杂应用的监控和调试非常有用。 8. 应用程序任务模块:在处理异步作业时,例如批量数据处理或定时任务,需要有一个框架来管理和跟踪这些任务。应用程序任务模块提供了一个框架,用于处理可排队的作业,并能够跟踪这些任务的执行情况。 通过Libshare提供的这些模块,Salesforce的开发者能够减少开发工作量,加快开发速度,并提高代码质量。这些模块能够帮助开发者避免重复的“造轮子”工作,专注于核心业务逻辑的实现。同时,由于Libshare作为托管程序包发布,开发者无需担心代码的维护和管理,只需将其添加到自己的Salesforce组织中即可使用。 Libshare的发布也强调了可重用性的重要性,这是软件工程领域中长期提倡的一个原则。通过使用可重用的组件,开发者能够遵循DRY(Don't Repeat Yourself)原则,从而减少代码的冗余,提高生产效率,同时降低因重复编写相同代码而导致错误的风险。 总之,Libshare是一个有价值的资源,对于那些希望在Salesforce平台上快速构建高效、可靠应用程序的开发者来说,这些预置的、经过测试的模块无疑是一个强大的助手。
recommend-type

机器学习技术要点与应用解析

# 机器学习技术要点与应用解析 ## 1. 机器学习基础概念 ### 1.1 数据类型与表示 在编程中,数据类型起着关键作用。Python 具有动态类型特性,允许变量在运行时改变类型。常见的数据类型转换函数包括 `bool()`、`int()`、`str()` 等。例如,`bool()` 函数可将值转换为布尔类型,`int()` 用于将值转换为整数类型。数据类型还包括列表(`lists`)、字典(`dictionaries`)、元组(`tuples`)等集合类型,其中列表使用方括号 `[]` 表示,字典使用花括号 `{}` 表示,元组使用圆括号 `()` 表示。 ### 1.2 变量与命名
recommend-type

点击歌曲没反应

<think> 我们之前已经讨论了如何将音频文件显示在QListView中,并希望实现点击播放。现在遇到的问题是点击列表项没有反应。 原因分析: 1. 我们没有将点击信号连接到播放槽函数。 2. 播放列表(QMediaPlaylist)可能没有正确添加媒体。 3. 媒体路径可能不正确。 解决方案: 按照之前的思路,我们需要做以下几步: 步骤1:确保已经创建了QMediaPlayer和QMediaPlaylist对象,并且播放器设置了播放列表。 步骤2:将QListView的点击信号(clicked)连接到自定义的槽函数,在该槽函数中设置播放列表的当前索引并播放。 步骤3:
recommend-type

SM-CNN-Torch: Torch实现短文本对排名的CNN模型

标题中提到的“SM-CNN-Torch”是一个深度学习框架Torch的实现版本,它基于Severyn和Moschitti在2015年SIGIR会议上发表的一篇论文所描述的卷积神经网络(CNN)模型。这篇论文的内容主要关注的是如何利用CNN对短文本对进行有效的排名,这一点对于问题回答(question-answering, QA)系统来说至关重要。实施该CNN模型的目标是为了更好地处理问答系统中的文本对比较问题,例如,在搜索引擎中确定哪些文档与用户的查询更加相关。 在描述中提到了如何使用该仓库中的代码。首先,用户需要安装Torch库,这是实现和运行SM-CNN-Torch模型的前提条件。接着,用户需要使用提供的脚本(fetch_and_preprocess.sh)下载并预处理GloVe(Global Vectors for Word Representation)字嵌入数据。这一数据集是预先训练好的词向量,能够将单词转换为连续的向量表示,这在深度学习模型中是处理文本的基本步骤。 在模型准备工作中,还需要注意的是Python版本,因为模型运行依赖于Python环境,建议的版本为2.7或更高版本。此外,描述中还提到了并行处理的线程数设置,这表明模型在运行过程中可能会涉及到并行计算,以加速计算过程。通过设置环境变量OMP_NUM_THREADS,可以指定并行计算时的线程数。 文件名称列表中的“SM-CNN-Torch-master”表示这是该仓库的主目录,包含了所有实现Severyn和Moschitti CNN模型的相关文件。 该存储库还包含了一些附加信息,例如,原始Torch实现已经被PyTorch版本所取代。PyTorch是Torch的一个分支,它提供了更多的功能和更易于使用的接口,对研究人员和开发者来说更加友好。此外,该仓库目前仅用于存档目的,这意味着原始的Torch代码不再被积极维护,而是作为一种历史记录保留下来。 标签“deep-learning”表明该项目是一个深度学习项目,所使用的模型是深度神经网络,特别是卷积神经网络。标签“question-answering”则直接指向了问题回答系统,这是深度学习的一个重要应用领域。标签“convolutional-neural-networks”指明了所使用的网络类型是卷积神经网络,它在图像处理和自然语言处理中都有广泛应用。而“Lua”标签则是因为Torch是用Lua语言编写的,尽管它通常与Python一起使用,但也有一个使用Lua的版本。 总的来说,SM-CNN-Torch是一个专门针对短文本对排名的深度学习模型的实现,它允许研究人员和开发者利用已经发表的研究成果来搭建和测试自己的模型,同时为了解其背后原理和实现细节提供了具体的代码和数据处理流程。
recommend-type

Python与机器学习基础入门

# Python与机器学习基础入门 ## 1. Python环境与包管理 ### 1.1 Anaconda与Miniconda Anaconda 功能丰富,自带集成开发环境(IDE)和独立于官方 Python 仓库的包仓库。若不需要这些额外功能,可选择安装 Miniconda,它仅包含 Conda 和 Python,安装包更小。 ### 1.2 Conda 与 pip 的对比 - **安装方式**:Conda 和 pip 在安装包时操作相似,例如使用 Conda 安装特定版本的 Keras 可使用命令 `conda install keras=2.2.4`。 - **功能特点**: