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)执行。

有关此语法的更多说明,请参阅 此处

状态

编辑

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

处理大型结果集

编辑

许多 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_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 的 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,插件将使用 OS 时区进行偏移调整。

注意:在指定 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 语句被分解成多个查询。每个查询将使用限制和偏移量来共同检索完整的 result-set。限制大小由 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

编辑
  • 值可以是以下任何一个:fatalerrorwarninfodebug
  • 默认值为 "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

编辑
  • 值可以是以下任何一个:numerictimestamp
  • 默认值为 "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。当您有两个或多个相同类型的插件时,这尤其有用,例如,如果您有 2 个 jdbc 输入。在这种情况下,添加命名 ID 将有助于在使用监控 API 时监控 Logstash。

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

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

tags

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

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

这可以帮助以后处理。

type

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

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

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

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

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