Logstash未更新last_run_metadata文件,重复处理数据求助
Logstash JDBC 元数据文件不更新问题排查与解决
嘿,我来帮你捋清楚这个问题——你遇到的是Logstash JDBC输入插件的last_run_metadata_path文件停更,导致重复拉取旧数据的情况,结合你提到同一张表配置了两个管道的细节,大概率是下面这些原因:
可能的原因及对应解决办法
1. 元数据文件权限不足
首先排查最基础的权限问题:Logstash的运行用户(一般是logstash用户)有没有写入权限到你指定的元数据文件?
- 先检查文件权限:
ls -l /etc/logstash/conf.d/lastrun_metadata/transactions_uat_metadata - 如果文件所有者是root,Logstash根本没法修改它。修复命令:
chown logstash:logstash /etc/logstash/conf.d/lastrun_metadata/transactions_uat_metadata # 或者给文件加写入权限 chmod 664 /etc/logstash/conf.d/lastrun_metadata/transactions_uat_metadata
2. SQL查询未返回正确的最大时间戳
JDBC插件更新sql_last_value的逻辑是:取本次查询结果中tracking_column字段的最大值,写入元数据文件。如果你的查询有问题,插件就拿不到新的时间戳:
- 有没有在SQL里加了
LIMIT或者分页?这会导致插件只拿到部分数据,取不到真正的最大时间 - 手动验证下:执行这条SQL看看结果是不是比元数据里的时间新
SELECT MAX(sys_created_on) FROM snc_uat.syslog_transaction0007 WHERE sys_created_on >= TIMESTAMP '2018-05-26 08:41:55.000000 -04:00'
3. 两个管道的并发冲突问题
你给同一张表配了两个管道,哪怕用了不同的元数据文件,也可能出现并发冲突:
- 两个管道同时执行查询,可能导致其中一个的元数据更新被锁或者覆盖
- 建议错开两个管道的
schedule时间,比如一个设为*/15 * * * *,另一个设为*/16 * * * * - 务必确认两个管道的
last_run_metadata_path是完全不同的文件,别重名或者指向同一个路径
4. JDBC插件版本存在bug
有些旧版本的Logstash JDBC插件确实有元数据更新的bug:
- 检查插件版本:
bin/logstash-plugin list --verbose logstash-input-jdbc - 如果版本低于4.3.0,建议更新插件:
bin/logstash-plugin update logstash-input-jdbc
5. tracking_column字段名大小写不匹配
Oracle数据库默认是大写存储字段名的,你配置里写的tracking_column => 'sys_created_on'是小写,可能导致插件找不到对应字段:
- 把配置改成大写试试:
tracking_column => 'SYS_CREATED_ON'
快速验证步骤
- 手动修改元数据文件,把时间改成一个远早于当前时间的日期,然后重启Logstash,看它会不会拉取最新数据并更新元文件
- 开启Logstash的debug日志(启动时加
--debug参数),查看有没有类似Updating last_run_metadata_path to [新时间戳]的日志,这能帮你确认插件是否在尝试更新元数据
内容的提问来源于stack exchange,提问作者Michael Dz
相关产品推荐
相关产品推荐

