7

sql_last_value私が自分の声明をそのように与えるとどうなるかはまったくわかりません:

statement => "SELECT * from mytable where id > :sql_last_value"

フィールドを更新するためにdbテーブル全体を参照するのではなく、新しく追加されたレコードのみを更新するという使用理由を少し理解できます。私が間違っている場合は修正してください。

だから私がやろうとしているのは、そのlogstashように使用してインデックスを作成することです:

input {
    jdbc {
        jdbc_connection_string => "jdbc:mysql://hostmachine:3306/db" 
        jdbc_user => "root"
        jdbc_password => "root"
        jdbc_validate_connection => true
        jdbc_driver_library => "/path/mysql_jar/mysql-connector-java-5.1.39-bin.jar"
        jdbc_driver_class => "com.mysql.jdbc.Driver"
        schedule => "* * * * *"
        statement => "SELECT * from mytable where id > :sql_last_value"
        use_column_value => true
        tracking_column => id
        jdbc_paging_enabled => "true"
        jdbc_page_size => "50000"
    }
}

output {
    elasticsearch {
        #protocol => http
        index => "myindex"
        document_type => "message_logs"
        document_id => "%{id}"
        action => index
        hosts => ["http://myhostmachine:9402"]
    }
}

これを行うと、ドキュメントはインデックスにまったくアップロードされません。どこが間違っていますか?

どんな助けでも大歓迎です。

4

3 に答える 3

7

テーブルにタイムスタンプ列 (例: last_updated) がある場合は、ID 列の代わりにそれを使用することをお勧めします。そのため、レコードが更新されたときにそのタイムスタンプも変更すると、jdbc入力プラグインがレコードを取得します (つまり、ID 列の値は変更されず、更新されたレコードは取得されません)。

input {
    jdbc {
        jdbc_connection_string => "jdbc:mysql://hostmachine:3306/db" 
        jdbc_user => "root"
        jdbc_password => "root"
        jdbc_validate_connection => true
        jdbc_driver_library => "/path/mysql_jar/mysql-connector-java-5.1.39-bin.jar"
        jdbc_driver_class => "com.mysql.jdbc.Driver"
        jdbc_paging_enabled => "true"
        jdbc_page_size => "50000"
        schedule => "* * * * *"
        statement => "SELECT * from mytable where last_updated > :sql_last_value"
    }
}

それでも ID 列を使用する場合は、$HOME/.logstash_jdbc_last_runファイルを削除してからやり直してください。

于 2016-11-01T17:17:20.170 に答える