Jdbc 输入插件编辑

其他版本请参见 版本化插件文档

获取帮助编辑

有关插件的问题,请在 Discuss 论坛中发帖。有关错误或功能请求,请在 Github 中提交问题。有关 Elastic 支持的插件列表,请参阅 Elastic 支持矩阵

描述编辑

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

驱动程序编辑

此插件不包含 JDBC 驱动程序库。必须使用 jdbc_driver_library 配置选项将所需的 jdbc 驱动程序库显式传递给插件。

有关更多信息,请参见 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_filepath) 中读取。文件选项通常用于 SQL 语句很大或在配置中提供很麻烦的情况。文件选项仅支持一个 SQL 语句。该插件将只接受其中一个选项。它不能从文件以及从 statement 配置参数中读取语句。

配置多个 SQL 语句编辑

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

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

预定义参数编辑

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

sql_last_value

用于计算要查询哪些行的值。在运行任何查询之前,此值设置为 1970 年 1 月 1 日星期四,或者如果 use_column_value 为 true 且 tracking_column 已设置,则设置为 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 分页在 jdbc_paging_mode 具有值 auto 时使用计数查询,因此目前也不支持使用预处理语句进行 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 的 timestamp 列类型中存储本地时间很常见,但许多时区在一年中会改变其偏移量,因此无法与 SQL 的 timestamp 类型一起使用来表示有序的连续时间线。例如,在 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,如果驱动程序似乎没有被正确加载,尽管相关的 jar(s) 通过 jdbc_driver_library 设置提供或放置在 Logstash Java 类路径中,则可能需要在驱动程序类前面加上 Java::。这已知是 Oracle JDBC 驱动程序 (ojdbc6.jar) 的情况,其中正确的 jdbc_driver_class"Java::oracle.jdbc.driver.OracleDriver",其他 JDBC 驱动程序也可能出现这种情况。

jdbc_driver_library编辑

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

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

如果未提供,插件将在 Logstash Java 类路径中查找驱动程序类。此外,如果库似乎没有通过此设置正确加载,则将相关的 jar(s) 放置在 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_useredit

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

JDBC 用户名。

jdbc_validate_connectionedit

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

jdbc_validation_timeoutedit

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

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

last_run_metadata_pathedit

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

保存上次运行时间的路径。

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

lowercase_column_namesedit

  • 值类型为 布尔值
  • 默认值为 true

是否强制将标识符字段转换为小写。

parametersedit

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

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

prepared_statement_bind_valuesedit

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

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

prepared_statement_nameedit

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

record_last_runedit

  • 值类型为 布尔值
  • 默认值为 true

是否在 last_run_metadata_path 中保存状态。

scheduleedit

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

定期运行语句的计划,使用 Cron 格式,例如:"* * * * *"(每分钟执行查询,在分钟开始时)。

默认情况下没有计划。如果没有指定计划,则语句只执行一次。

sequel_optsedit

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

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

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

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

sql_log_leveledit

  • 值可以是以下任何一个:fatalerrorwarninfodebug
  • 默认值为 "info"

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

statementedit

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

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

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

"SELECT * FROM MYTABLE WHERE id = :target_id"

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

statement_filepathedit

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

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

targetedit

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

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

tracking_columnedit

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

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

tracking_column_typeedit

  • 值可以是以下任何一个:numerictimestamp
  • 默认值为 "numeric"

跟踪列的类型。目前只有 "numeric" 和 "timestamp"。

use_column_valueedit

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

use_prepared_statementsedit

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

通用选项edit

以下配置选项受所有输入插件支持。

设置 输入类型 必需

add_field

哈希

codec

codec

enable_metric

布尔值

id

字符串

tags

数组

type

字符串

详情edit

 

add_fieldedit

向事件添加字段。

codecedit

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

enable_metricedit

  • 值类型为 布尔值
  • 默认值为 true

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

idedit

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

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

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

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

tagsedit

  • 值类型为 数组
  • 此设置没有默认值。

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

这可以帮助以后的处理。

typeedit

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

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

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

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

如果您尝试在已经具有类型的事件上设置类型(例如,当您从发送器发送事件到索引器时),则新的输入不会覆盖现有的类型。在发送器中设置的类型会一直保留在该事件中,即使它被发送到另一个 Logstash 服务器也是如此。