[英]Logstash :sql_last_value is showing wrong junk date (Showing 6 month's old date as last run time)
我觀察到非常奇怪的問題我正在使用 logstash + jdbc 將數據從 Oracle db 加載到 Elasticsearch 下面是我的配置文件的樣子
input{
jdbc{
clean_run => "false"
jdbc_driver_library => "<path_to_ojdbc8-12.1.0.jar>"
jdbc_driver_class => "Java::oracle.jdbc.driver.OracleDriver"
jdbc_connection_string => "<connection_string>"
jdbc_user => "<usename>"
jdbc_password_filepath => ".\pwd.txt"
statement=> "SELECT * FROM customers WHERE CUSTOMER_NAME LIKE 'PE%' AND UPD_DATE > :sql_last_value "
schedule=>"*/1 * * * * "
use_column_value => true
tracking_column_type => "timestamp"
tracking_column => "upd_date"
last_run_metadata_path =>"<path to logstash_metadata>"
record_last_run => true
}
}
filter {
mutate {
copy => { "id" => "[@metadata][_id]"}
remove_field => ["@version","@timestamp"]
}
}
output {
elasticsearch{
hosts => ["<host>"]
index => "<index_name>"
document_id=>"%{[@metadata][_id]}"
user => "<user>"
password => "<pwd>"
}
stdout{
codec => dots
}
}
現在,我在 2021 年 3 月 8 日的今天每分鍾觸發一次此文件。當我第一次加載時,一切正常 - :sql_last_value 為 '1970-01-01 00:00:00.000000 +00:00'
但是在第一次加載之后,理想情況下 logstash_metadata 應該顯示 '2021-03-08 <HH:MM:ss>' 但奇怪的是它正在更新為 --- 2020-09-11 01:05:09.000000000 Z in logstash_metadata (: sql_last_value)
如您所見,差異接近 180 天
我嘗試了多次,但它仍然以相同的方式更新,因此我的增量負載被搞砸了
我的 logstash 版本是 7.10.2
非常感謝您的幫助!
注意:我沒有使用分頁,因為結果集中的結果數量對於我的查詢來說總是非常少
記錄的日期是最后處理的行的日期。
看到您的查詢,您沒有從數據庫讀取的記錄的特定順序。 Logstash jdbc 輸入插件將您的查詢包含在按 [1] 對行進行排序的查詢中,1 是它所排序的列的序號。
因此,要以正確的順序處理記錄並獲取最新的 upd_date 值,您需要將 upd_date 設置為 select 語句中的第一列。
input{
jdbc{
clean_run => "false"
jdbc_driver_library => "<path_to_ojdbc8-12.1.0.jar>"
jdbc_driver_class => "Java::oracle.jdbc.driver.OracleDriver"
jdbc_connection_string => "<connection_string>"
jdbc_user => "<usename>"
jdbc_password_filepath => ".\pwd.txt"
statement=> "SELECT c.UPD_DATE, c.CUSTOMER_NAME, c.<Other field>
FROM customers c
WHERE c.CUSTOMER_NAME LIKE 'PE%' AND c.UPD_DATE > :sql_last_value
ORDER BY c.UPD_DATE ASC"
schedule=>"*/1 * * * * "
use_column_value => true
tracking_column_type => "timestamp"
tracking_column => "upd_date"
last_run_metadata_path =>"<path to logstash_metadata>"
record_last_run => true
}
}
另請注意,即使您設置了 jdbc_page_size,這種方法也會在第一次運行 logstash 時耗盡表。 如果你想要這個,那很好。
但是,如果您希望 logstash 每分鍾運行一批 X 行並停止直到下一次執行,那么您必須結合使用 jdbc_page_size 和帶限制的查詢,以使 logstash 以正確的順序准確檢索您想要的記錄數量。 在 SQL 服務器中,它的工作方式如下:
input{
jdbc{
jdbc_driver_library => ...
jdbc_driver_class => ...
jdbc_connection_string => ...
jdbc_user => ...
jdbc_password_filepath => ...
statement=> "SELECT TOP 10000 c.UPD_DATE, c.CUSTOMER_NAME
FROM customers c
WHERE c.CUSTOMER_NAME LIKE 'PE%' AND c.UPD_DATE > :sql_last_value
ORDER BY c.UPD_DATE ASC"
schedule=>"*/1 * * * * "
use_column_value => true
tracking_column_type => "timestamp"
tracking_column => "upd_date"
jdbc_page_size => 10000
last_run_metadata_path =>"<path to logstash_metadata>"
record_last_run => true
}
}
對於 Oracle DB,您必須根據版本更改查詢,或者僅使用 FETCH FIRST x ROWS; Oracle 12 或 ROWNUM 用於舊版本。
無論如何,我建議您查看日志以檢查 logstash 運行的查詢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.