簡體   English   中英

Logstash:sql_last_value 顯示錯誤的垃圾日期(顯示 6 個月的舊日期作為上次運行時間)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM