Jdbc 输入插件

编辑

对于其他版本,请参阅版本化插件文档

获取帮助

编辑

有关插件的问题,请在Discuss论坛中开启一个主题。对于错误或功能请求,请在Github中开启一个问题。有关 Elastic 支持的插件列表,请查阅Elastic 支持矩阵

描述

编辑

此插件的创建是为了将具有 JDBC 接口的任何数据库中的数据引入 Logstash。 您可以使用 cron 语法定期安排数据引入(请参阅 schedule 设置),或者运行一次查询以将数据加载到 Logstash 中。结果集中的每一行都成为一个单独的事件。结果集中的列将转换为事件中的字段。

驱动程序

编辑

此插件不附带 JDBC 驱动程序库。所需的 jdbc 驱动程序库必须使用 jdbc_driver_library 配置选项显式传递到插件中。

有关更多信息,请参阅 jdbc_driver_libraryjdbc_driver_class 选项。

调度

编辑

可以根据特定的计划定期调度此插件的输入。 此调度语法由 rufus-scheduler 提供支持。 该语法类似于 cron,但具有 Rufus 特有的一些扩展(例如时区支持)。

示例

* 5 * 1-3 *

将在 1 月至 3 月的每天凌晨 5 点的每一分钟执行。

0 * * * *

将在每天每小时的第 0 分钟执行。

0 6 * * * America/Chicago

将在每天上午 6:00(UTC/GMT -5)执行。

有关此语法的更多文档,请访问此处

状态

编辑

插件将以元数据文件的形式持久化 sql_last_value 参数,该元数据文件存储在配置的 last_run_metadata_path 中。 查询执行后,此文件将使用 sql_last_value 的当前值进行更新。 下次管道启动时,将通过读取文件来更新此值。 如果 clean_run 设置为 true,则将忽略此值,并且 sql_last_value 将设置为 1970 年 1 月 1 日,或者如果 use_column_value 为 true,则设置为 0,就像从未执行过任何查询一样。

处理大型结果集

编辑

许多 JDBC 驱动程序使用 fetch_size 参数来限制从游标一次预先提取到客户端缓存的结果数量,然后再从结果集中检索更多结果。 这在本插件中使用 jdbc_fetch_size 配置选项进行配置。 默认情况下,此插件未设置提取大小,因此将使用特定驱动程序的默认大小。

用法

编辑

以下是设置插件以从 MySQL 数据库获取数据的示例。 首先,我们将适当的 JDBC 驱动程序库放在当前路径中(这可以放在您文件系统上的任何位置)。在此示例中,我们使用用户:mysql 连接到 mydb 数据库,并希望输入 songs 表中与特定艺术家匹配的所有行。以下示例演示了可能的 Logstash 配置。 本示例中的 schedule 选项将指示插件每分钟执行此输入语句。

input {
  jdbc {
    jdbc_driver_library => "mysql-connector-java-5.1.36-bin.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/mydb"
    jdbc_user => "mysql"
    parameters => { "favorite_artist" => "Beethoven" }
    schedule => "* * * * *"
    statement => "SELECT * from songs where artist = :favorite_artist"
  }
}

配置 SQL 语句

编辑

此输入需要一个 SQL 语句。这可以通过字符串形式的 statement 选项传入,或者从文件 (statement_filepath) 中读取。当 SQL 语句很大或在配置中提供起来很麻烦时,通常使用文件选项。文件选项仅支持一个 SQL 语句。插件将仅接受其中一个选项。它不能从文件和 statement 配置参数中读取语句。

配置多个 SQL 语句

编辑

当需要从不同的数据库表或视图中查询和引入数据时,配置多个 SQL 语句非常有用。可以为每个语句定义单独的 Logstash 配置文件,或者在单个配置文件中定义多个语句。在单个 Logstash 配置文件中使用多个语句时,每个语句都必须定义为单独的 jdbc 输入(包括 jdbc 驱动程序、连接字符串和其他必需的参数)。

请注意,如果任何语句使用 sql_last_value 参数(例如,仅引入自上次运行以来更改的数据),则每个输入都应定义自己的 last_run_metadata_path 参数。否则会导致不良行为,因为所有输入都将其状态存储到相同的(默认)元数据文件中,从而有效地覆盖彼此的 sql_last_value

预定义参数

编辑

一些参数是内置的,可以从查询中使用。以下是列表

sql_last_value

用于计算要查询的行的值。在运行任何查询之前,如果 use_column_value 为 true 并且设置了 tracking_column,则此值设置为 1970 年 1 月 1 日星期四,或者设置为 0。在后续查询运行后,它会相应更新。

offset, size

与手动分页模式一起使用的值,用于显式实现分页。 仅当启用 jdbc_paging_enabled 并且 jdbc_paging_mode 的值为 explicit 时才支持。

示例

input {
  jdbc {
    statement => "SELECT id, mycolumn1, mycolumn2 FROM my_table WHERE id > :sql_last_value"
    use_column_value => true
    tracking_column => "id"
    # ... other configuration bits
  }
}

预处理语句

编辑

使用服务器端预处理语句可以加快执行速度,因为服务器会优化查询计划和执行。

并非所有 JDBC 可访问技术都支持预处理语句。

随着预处理语句支持的引入,出现了不同的代码执行路径和一些新设置。大多数现有设置仍然有用,但是有一些用于预处理语句的新设置需要阅读。使用布尔值设置 use_prepared_statements 来启用此执行模式。使用 prepared_statement_name 设置来指定预处理语句的名称,此名称在本地和远程标识预处理语句,并且在您的配置和数据库中应是唯一的。使用 prepared_statement_bind_values 数组设置来指定绑定值,对之前提到的预定义参数使用精确的字符串 :sql_last_value (如有必要,多次使用)。 statement(或 statement_path)设置仍然保留 SQL 语句,但是要使用绑定变量,您必须使用 ? 字符作为 prepared_statement_bind_values 数组中找到的精确顺序的占位符。

目前不支持围绕预处理语句构建计数查询。因为当 jdbc_paging_mode 的值为 auto 时,jdbc 分页使用计数查询,因此目前也不支持将 jdbc 分页用于预处理语句。因此,当使用预处理语句时,jdbc_paging_enabledjdbc_page_size 设置将被忽略。

示例

input {
  jdbc {
    statement => "SELECT * FROM mgd.seq_sequence WHERE _sequence_key > ? AND _sequence_key < ? + ? ORDER BY _sequence_key ASC"
    prepared_statement_bind_values => [":sql_last_value", ":sql_last_value", 4]
    prepared_statement_name => "foobar"
    use_prepared_statements => true
    use_column_value => true
    tracking_column_type => "numeric"
    tracking_column => "_sequence_key"
    last_run_metadata_path => "/elastic/tmp/testing/confs/test-jdbc-int-sql_last_value.yml"
    # ... other configuration bits
  }
}

数据库特定注意事项

编辑

JDBC 输入插件利用 sequel 库通过其 JDBC 驱动程序查询数据库。但是,驱动程序的实现会有所不同,这可能会导致意外的行为。

无法重用连接

编辑

某些数据库(例如 Sybase 或 SQL Anywhere)可能会出现陈旧连接的问题,在计划的运行之间超时并且永远不会重新连接。

为了确保连接在执行查询之前有效,请启用 jdbc_validate_connection,并将 jdbc_validation_timeout 设置为比 schedule 更短的时间间隔。

input {
  jdbc {
    schedule => "* * * * *"       # run every minute
    jdbc_validate_connection => true
    jdbc_validation_timeout => 50 # 50 seconds
  }
}

Jdbc 输入配置选项

编辑

此插件支持以下配置选项以及稍后描述的通用选项

另请参阅 通用选项,以获取所有输入插件支持的选项列表。

 

clean_run

编辑

是否应保留先前的运行状态

columns_charset

编辑
  • 值类型为 哈希
  • 默认值为 {}

特定列的字符编码。此选项将覆盖指定列的 :charset 选项。

示例

input {
  jdbc {
    ...
    columns_charset => { "column0" => "ISO-8859-1" }
    ...
  }
}

这将仅转换原始编码为 ISO-8859-1 的 column0。

connection_retry_attempts

编辑
  • 值类型为 数字
  • 默认值为 1

尝试连接到数据库的最大次数

connection_retry_attempts_wait_time

编辑
  • 值类型为 数字
  • 默认值为 0.5

连接尝试之间休眠的秒数

jdbc_connection_string

编辑
  • 这是一个必需的设置。
  • 值类型为 字符串
  • 此设置没有默认值。

JDBC 连接字符串

jdbc_default_timezone

编辑
  • 值类型为 字符串

    • 值应为规范时区或偏移量,例如 Europe/ParisEtc/GMT+3
    • 可能包含方括号扩展,例如 America/Denver[dst_enabled_on_overlap:true]
  • 此设置没有默认值。
时区转换
编辑

Logstash 和 Elasticsearch 希望时间戳以 UTC 格式表示。如果您的数据库记录的时间戳相对于另一个时区(即数据库时区),则将此设置设置为数据库正在使用的时区。但是,由于 SQL 不允许在时间戳字段中包含时区数据,我们无法逐条记录地确定这一点。此插件会自动将您的 SQL 时间戳字段转换为 Logstash 时间戳,并以 ISO8601 格式的相对 UTC 时间表示。

使用此设置将手动分配指定的时区偏移量,而不是使用本地机器的时区设置。您必须使用规范时区,例如 America/Denver

不明确的时间戳

编辑

虽然通常将本地时间存储在 SQL 的时间戳列类型中,但许多时区在一年中会更改其偏移量,因此不能与 SQL 的时间戳类型一起使用来表示有序的、连续的时间线。例如,在 America/Chicago 时区中,当秋季夏令时 (DST) 结束时,时钟将从 01:59:59 拨回 01:00:00,从而使当天 01:00:00CDT02:00:00CST 之间的 2 小时内的任何时间戳都变得不明确。

当遇到由 DST 转换引起的不明确的时间戳时,除非此处指定的时区包含有关如何处理重叠时段的方括号指令(例如:America/Chicago[dst_enabled_on_overlap:true]Australia/Melbourne[dst_enabled_on_overlap:false]),否则查询将失败。

plugin_timezone

编辑
  • 值可以是以下任何一种:utclocal
  • 默认值为 "utc"

如果您希望此插件将时间戳偏移到 UTC 以外的时区,则可以将此设置设置为 local,插件将使用操作系统时区进行偏移调整。

注意:当指定 plugin_timezone 和/或 jdbc_default_timezone 时,会在两个位置进行偏移调整,如果 sql_last_value 是时间戳并且它在语句中用作参数,则从插件时区到数据时区进行偏移调整,并且在处理记录时,将从数据库时区到插件时区进行时间戳偏移调整。如果您的数据库时区为 UTC,则无需设置任何这些设置。

jdbc_driver_class

编辑
  • 这是一个必需的设置。
  • 值类型为 字符串
  • 此设置没有默认值。

要加载的 JDBC 驱动程序类,例如“org.apache.derby.jdbc.ClientDriver”

根据 https://github.com/logstash-plugins/logstash-input-jdbc/issues/43,如果驱动程序似乎未正确加载,即使通过 jdbc_driver_library 设置或放置在 Logstash Java 类路径中提供了相关 jar 文件,也可能需要在驱动程序类前面添加 Java::。已知 Oracle JDBC 驱动程序 (ojdbc6.jar) 就是这种情况,其中正确的 jdbc_driver_class"Java::oracle.jdbc.driver.OracleDriver",其他 JDBC 驱动程序也可能是这种情况。

jdbc_driver_library

编辑
  • 值类型为 字符串
  • 此设置没有默认值。

第三方驱动程序库的 JDBC 驱动程序库路径。如果需要多个库,则可以用逗号分隔传递它们。

如果未提供,插件将在 Logstash Java 类路径中查找驱动程序类。此外,如果库似乎未通过此设置正确加载,则将相关 jar 文件放置在 Logstash Java 类路径中,而不是通过此设置可能会有所帮助。另请确保 Logstash 进程可以读取该路径(例如,以服务运行时,为 logstash 用户)。

jdbc_fetch_size

编辑
  • 值类型为 数字
  • 此设置没有默认值。

JDBC 获取大小。如果未提供,将使用相应驱动程序的默认值

jdbc_page_size

编辑
  • 值类型为 数字
  • 默认值为 100000

JDBC 页面大小

jdbc_paging_enabled

编辑

JDBC 启用分页

这将导致 SQL 语句被分解为多个查询。每个查询将使用限制和偏移量来共同检索完整的结果集。限制大小由 jdbc_page_size 设置。

请注意,查询之间的顺序不保证。

jdbc_paging_mode

编辑
  • 值可以是以下任何一种:autoexplicit
  • 默认值为 "auto"

在 JDBC 分页期间是否使用 explicitauto 模式

如果为 auto,则您的语句将自动被计数查询和后续多个分页查询(使用 LIMIT 语句等)包围。

如果为 explicit,则将使用您的语句执行多个查询(前面没有计数查询),直到没有检索到更多行。您必须在语句配置中编写自己的分页条件。offsetsize 参数可以在您的语句中使用(size 等于 jdbc_page_size,并且 offset 为每个查询增加 size)。当查询返回的行数不等于 size 时,SQL 分页将结束。示例

input {
  jdbc {
    statement => "SELECT id, mycolumn1, mycolumn2 FROM my_table WHERE id > :sql_last_value LIMIT :size OFFSET :offset",
    jdbc_paging_enabled => true,
    jdbc_paging_mode => "explicit",
    jdbc_page_size => 100000
  }
}
input {
  jdbc {
    statement => "CALL fetch_my_data(:sql_last_value, :offset, :size)",
    jdbc_paging_enabled => true,
    jdbc_paging_mode => "explicit",
    jdbc_page_size => 100000
  }
}

在以下情况下可以考虑此模式

  1. 在默认分页模式下遇到性能问题。
  2. 您的 SQL 语句很复杂,因此简单地用分页语句包围它不是您想要的。
  3. 您的语句是存储过程,并且实际的分页语句在其中。

jdbc_password

编辑
  • 值类型为 密码
  • 此设置没有默认值。

JDBC 密码

jdbc_password_filepath

编辑
  • 值类型为 路径
  • 此设置没有默认值。

JDBC 密码文件名

jdbc_pool_timeout

编辑
  • 值类型为 数字
  • 默认值为 5

连接池配置。在引发 PoolTimeoutError 之前等待获取连接的秒数(默认为 5)

jdbc_user

编辑
  • 这是一个必需的设置。
  • 值类型为 字符串
  • 此设置没有默认值。

JDBC 用户

jdbc_validate_connection

编辑

连接池配置。使用前验证连接。

jdbc_validation_timeout

编辑
  • 值类型为 数字
  • 默认值为 3600

连接池配置。验证连接的频率(以秒为单位)

last_run_metadata_path

编辑
  • 值类型为 字符串
  • 默认值为 "<path.data>/plugins/inputs/jdbc/logstash_jdbc_last_run"

上次运行时间的文件路径

在 5.2.6 之前的版本中,元数据文件写入 $HOME/.logstash_jdbc_last_run。如果在 Logstash 升级期间在“$HOME”中找到该文件,它将被移动到“path.data”下的默认位置。如果路径由用户定义,则不会执行自动移动。

lowercase_column_names

编辑

是否强制将标识符字段小写

parameters

编辑
  • 值类型为 哈希
  • 默认值为 {}

查询参数的哈希,例如 { "target_id" => "321" }

prepared_statement_bind_values

编辑
  • 值类型为 数组
  • 默认值为 []

预处理语句的绑定值的数组。:sql_last_value 是一个保留的预定义字符串

prepared_statement_name

编辑

预处理语句的名称。它在您的配置和数据库中必须是唯一的

record_last_run

编辑

是否在 last_run_metadata_path 中保存状态

schedule

编辑
  • 值类型为 字符串
  • 此设置没有默认值。

定期运行语句的时间表,例如 Cron 格式:"* * * * *"(每分钟执行一次查询)

默认情况下没有时间表。如果没有给出时间表,则该语句只运行一次。

sequel_opts

编辑
  • 值类型为 哈希
  • 默认值为 {}

通用/特定于供应商的 Sequel 配置选项。

一个可选的连接池配置示例:max_connections - 连接池的最大连接数

可以在此文档页面找到特定于供应商的选项示例:https://github.com/jeremyevans/sequel/blob/master/doc/opening_databases.rdoc

sql_log_level

编辑
  • 值可以是以下任何一个:fatal, error, warn, info, debug
  • 默认值是 "info"

记录 SQL 查询的日志级别,接受的值是常见的 fatal、error、warn、info 和 debug。默认值是 info。

statement

编辑
  • 值类型为 字符串
  • 此设置没有默认值。

如果未定义,Logstash 将会报错,即使未使用编解码器。要执行的语句

要使用参数,请使用命名参数语法。例如

"SELECT * FROM MYTABLE WHERE id = :target_id"

这里,“:target_id”是一个命名参数。您可以使用 parameters 设置配置命名参数。

statement_filepath

编辑
  • 值类型为 路径
  • 此设置没有默认值。

包含要执行的语句的文件的路径

target

编辑

如果没有 target,则会从每一行根级别的列创建事件。当 target 设置为字段引用时,每一行的列将放置在目标字段中。

当强制执行下游模式(例如 ECS)时,此选项对于避免填充未知字段非常有用。

tracking_column

编辑
  • 值类型为 字符串
  • 此设置没有默认值。

如果 use_column_value 设置为 true,则要跟踪其值的列

tracking_column_type

编辑
  • 值可以是以下任何一个:numeric, timestamp
  • 默认值是 "numeric"

跟踪列的类型。目前仅支持“numeric”和“timestamp”

use_column_value

编辑

当设置为 true 时,使用定义的 tracking_column 值作为 :sql_last_value。当设置为 false 时,:sql_last_value 反映上次执行查询的时间。

use_prepared_statements

编辑

当设置为 true 时,启用预处理语句的使用

通用选项

编辑

所有输入插件都支持这些配置选项

设置 输入类型 必需

add_field

哈希值

codec

codec

enable_metric

布尔值

id

字符串

tags

数组

type

字符串

add_field

编辑
  • 值类型是 哈希
  • 默认值为 {}

向事件添加一个字段

codec

编辑

用于输入数据的编解码器。输入编解码器是一种方便的方法,可以在数据进入输入之前对其进行解码,而无需在 Logstash 管道中使用单独的过滤器。

enable_metric

编辑

默认情况下,禁用或启用此特定插件实例的指标日志记录,我们会记录所有可以记录的指标,但您可以禁用特定插件的指标收集。

  • 值类型是 字符串
  • 此设置没有默认值。

向插件配置添加唯一的 ID。如果未指定 ID,Logstash 将生成一个。强烈建议在配置中设置此 ID。当您有两个或多个相同类型的插件时,例如,如果您有两个 jdbc 输入,这将特别有用。在这种情况下添加一个命名的 ID 将有助于在使用监控 API 时监控 Logstash。

input {
  jdbc {
    id => "my_plugin_id"
  }
}

id 字段中的变量替换仅支持环境变量,不支持使用来自密钥存储的值。

tags

编辑
  • 值类型是 数组
  • 此设置没有默认值。

向您的事件添加任意数量的标签。

这有助于以后的处理。

type

编辑
  • 值类型是 字符串
  • 此设置没有默认值。

向此输入处理的所有事件添加 type 字段。

类型主要用于过滤器激活。

该类型存储为事件本身的一部分,因此您也可以使用该类型在 Kibana 中搜索它。

如果您尝试在已经具有类型的事件上设置类型(例如,当您将事件从托运人发送到索引器时),则新的输入将不会覆盖现有的类型。在托运人处设置的类型会在事件的整个生命周期内保持不变,即使发送到另一个 Logstash 服务器也是如此。