给出以下 PostgreSQL 表test
(省略了一些列,例如管道中使用的data
):
id (uuid) | updated_at (timestamp with time zone)
652d88d3-e978-48b1-bd0f-b8188054a920 | 2018-08-08 11:02:00.000000
50cf7942-cd18-4730-a65e-fc06f11cfd1d | 2018-08-07 15:30:00.000000
使用下面的管道(省略jdbc_*
)给出Logstash 6.3.2(通过Docker):
input {
jdbc {
statement => "SELECT id, data, updated_at FROM test WHERE updated_at > :sql_last_value"
schedule => "* * * * *"
use_column_value => true
tracking_column => "updated_at"
tracking_column_type => "timestamp"
}
}
filter {
mutate { remove_field => "updated_at" }
}
output {
elasticsearch {
hosts => "elasticsearch:9200"
index => "test"
document_id => "%{id}"
}
}
当该管道第一次运行时(或与clean_run => true
一起运行时),我希望它可以处理两个数据库行(因为sql_last_value
为1970-01-01 00:00:00.000000
)并设置存储在.logstash_jdbc_last_run
到2018-08-08 11:02:00.000000000 Z
中的跟踪列(=找到的所有updated_at
时间戳的最新)。不过,它将设置为2018-08-07 15:30:00.000000000 Z
,这是两个给定时间戳记中的较早者。这意味着在第二次运行中,即使未更改,两行中的另一行也将再次被处理。
这是预期的行为吗?我会错过一些控制此方面的其他配置吗?
似乎将使用返回的 last 行的updated_at
(只是尝试了更多行)。因此,我必须添加一个ORDER BY updated_at ASC
,我认为这对数据库查询性能而言并不理想。
sh-4.2$ cat .logstash_jdbc_last_run
cat: .logstash_jdbc_last_run: No such file or directory
[2018-08-09T14:38:01,540][INFO ][logstash.inputs.jdbc ] (0.001254s) SELECT id, data, updated_at FROM test WHERE updated_at > '1970-01-01 00:00:00.000000+0000'
sh-4.2$ cat .logstash_jdbc_last_run
--- 2018-08-07 15:30:00.000000000 Z
[2018-08-09T14:39:00,335][INFO ][logstash.inputs.jdbc ] (0.001143s) SELECT id, data, updated_at FROM test WHERE updated_at > '2018-08-07 15:30:00.000000+0000'
sh-4.2$ cat .logstash_jdbc_last_run
--- 2018-08-08 11:02:00.000000000 Z
[2018-08-09T14:40:00,104][INFO ][logstash.inputs.jdbc ] (0.000734s) SELECT id, data, updated_at FROM test WHERE updated_at > '2018-08-08 11:02:00.000000+0000'
sh-4.2$ cat .logstash_jdbc_last_run
--- 2018-08-08 11:02:00.000000000 Z
答案 0 :(得分:0)
从上个月开始,从MySQL到ES,我遇到了同样的问题。但是最后它解决了。默认情况下,文件.logstash_jdbc_last_run是在您的主目录中创建的。您可以通过设置last_run_metadata_path配置选项来更改此文件的路径。我正在使用UTC日期格式。
启动时间sql_last_value的值为1970-01-01 00:00:00.000000。它还在logstash_jdbc_last_run文件中设置日期,该文件是MySQL返回的第一条记录。那就是为什么我通过update_at DESC使用命令。以下代码对我有用。
input {
jdbc {
jdbc_default_timezone => "UTC"
statement => "SELECT id, data, DATE_FORMAT(updated_at, '%Y-%m-%d %T') as updated_at, FROM test WHERE updated_at > :sql_last_value order by update_at DESC"
schedule => "* * * * * *"
use_column_value => true
tracking_column => "updated_at"
tracking_column_type => "timestamp"
last_run_metadata_path => /home/logstash_track_date/.logstash_user_jdbc_last_run"
}
}
filter {
mutate { remove_field => "updated_at" }
}
output {
stdout { codec => rubydebug }
elasticsearch {
hosts => "elasticsearch:9200"
index => "test"
document_id => "%{id}"
}
}