Jdbc 输入插件
编辑Jdbc 输入插件编辑
其他版本请参见 版本化插件文档。
获取帮助编辑
有关插件的问题,请在 Discuss 论坛中发帖。有关错误或功能请求,请在 Github 中提交问题。有关 Elastic 支持的插件列表,请参阅 Elastic 支持矩阵。
描述编辑
此插件旨在将任何具有 JDBC 接口的数据库中的数据导入 Logstash。您可以使用 cron 语法定期安排导入(参见 schedule
设置)或运行查询一次以将数据加载到 Logstash 中。结果集中的每一行都将成为一个单独的事件。结果集中的列将转换为事件中的字段。
驱动程序编辑
此插件不包含 JDBC 驱动程序库。必须使用 jdbc_driver_library
配置选项将所需的 jdbc 驱动程序库显式传递给插件。
有关更多信息,请参见 jdbc_driver_library
和 jdbc_driver_class
选项。
调度编辑
可以根据特定时间表定期安排此插件的输入。此调度语法由 rufus-scheduler 提供支持。语法类似于 cron,但有一些 Rufus 特定的扩展(例如时区支持)。
示例
|
将在 1 月到 3 月的每天凌晨 5 点的每一分钟执行。 |
|
将在每天的每小时的第 0 分钟执行。 |
|
将在每天的上午 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 日星期四,或者如果 |
offset, size |
与手动分页模式一起使用的值,用于显式实现分页。仅在 |
示例
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_enabled
、jdbc_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 输入配置选项编辑
此插件支持以下配置选项,以及后面介绍的 通用选项。
设置 | 输入类型 | 必需 |
---|---|---|
否 |
||
否 |
||
否 |
||
否 |
||
是 |
||
否 |
||
是 |
||
否 |
||
否 |
||
否 |
||
否 |
||
字符串,其中之一为 |
否 |
|
否 |
||
有效的文件系统路径 |
否 |
|
否 |
||
是 |
||
否 |
||
否 |
||
否 |
||
否 |
||
否 |
||
字符串,其中之一为 |
否 |
|
否 |
||
否 |
||
否 |
||
否 |
||
否 |
||
字符串,其中之一为 |
否 |
|
否 |
||
有效的文件系统路径 |
否 |
|
否 |
||
否 |
||
字符串,其中之一为 |
否 |
|
否 |
||
否 |
另请参阅 通用选项,了解所有输入插件支持的选项列表。
columns_charset
编辑
- 值类型为 哈希
- 默认值为
{}
特定列的字符编码。此选项将覆盖为指定列设置的 :charset
选项。
示例
input { jdbc { ... columns_charset => { "column0" => "ISO-8859-1" } ... } }
这将仅转换原始编码为 ISO-8859-1 的 column0。
jdbc_default_timezone
编辑
-
值类型为 字符串
- 值应为规范时区或偏移量,例如
Europe/Paris
或Etc/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:00CDT
和 02:00:00CST
之间的 2 小时内任何时间戳都变得模棱两可。
当遇到由 DST 转换引起的时间戳模棱两可时,查询将失败,除非此处指定的时区包含关于如何处理重叠时段的方括号指令(例如:America/Chicago[dst_enabled_on_overlap:true]
或 Australia/Melbourne[dst_enabled_on_overlap:false]
)。
plugin_timezone
编辑
- 值可以是以下任何一个:
utc
、local
- 默认值为
"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_paging_enabled
编辑
- 值类型为 布尔值
- 默认值为
false
JDBC 启用分页
这将导致 SQL 语句被分解成多个查询。每个查询将使用限制和偏移量来共同检索完整的结果集。限制大小由 jdbc_page_size
设置。
请注意,查询之间的排序没有保证。
jdbc_paging_mode
编辑
- 值可以是以下任何一个:
auto
、explicit
- 默认值为
"auto"
在 JDBC 分页期间是否使用 explicit
或 auto
模式
如果为 auto
,您的语句将自动被计数查询和随后的多个分页查询(使用 LIMIT
语句等)包围。
如果为 explicit
,将使用您的语句执行多个查询(前面没有计数查询),直到不再检索到行。您必须在语句配置中编写自己的分页条件。offset
和 size
参数可以在您的语句中使用(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 } }
此模式可以在以下情况下考虑
- 在默认分页模式下遇到的性能问题。
- 您的 SQL 语句很复杂,因此简单地用分页语句将其包围并不是您想要的。
- 您的语句是存储过程,实际的分页语句在其中。
last_run_metadata_path
edit
- 值类型为 字符串
- 默认值为
"<path.data>/plugins/inputs/jdbc/logstash_jdbc_last_run"
。
保存上次运行时间的路径。
在 5.2.6 之前的版本中,元数据文件写入 $HOME/.logstash_jdbc_last_run
。如果在 Logstash 升级期间在 "$HOME" 中找到该文件,它将被移动到 "path.data" 下的默认位置。如果路径由用户定义,则不会执行自动移动操作。
schedule
edit
- 值类型为 字符串
- 此设置没有默认值。
定期运行语句的计划,使用 Cron 格式,例如:"* * * * *"(每分钟执行查询,在分钟开始时)。
默认情况下没有计划。如果没有指定计划,则语句只执行一次。
sequel_opts
edit
- 值类型为 哈希
- 默认值为
{}
通用/特定于供应商的 Sequel 配置选项。
可选连接池配置的示例:max_connections - 连接池的最大连接数。
特定于供应商的选项示例可以在以下文档页面中找到:https://github.com/jeremyevans/sequel/blob/master/doc/opening_databases.rdoc
sql_log_level
edit
- 值可以是以下任何一个:
fatal
、error
、warn
、info
、debug
。 - 默认值为
"info"
。
记录 SQL 查询的日志级别,接受的值是常见的 fatal、error、warn、info 和 debug。默认值为 info。
statement
edit
- 值类型为 字符串
- 此设置没有默认值。
如果未定义,Logstash 会报错,即使编解码器未被使用。要执行的语句。
要使用参数,请使用命名参数语法。例如:
"SELECT * FROM MYTABLE WHERE id = :target_id"
这里,":target_id" 是一个命名参数。您可以使用 parameters
设置配置命名参数。
target
edit
- 值类型为 字段引用。
- 此设置没有默认值。
如果没有 target
,事件将从每一行的列在根级别创建。当 target
设置为字段引用时,每一行的列将放置在目标字段中。
此选项在强制执行下游模式(例如 ECS)时,可以避免填充未知字段,非常有用。
tracking_column_type
edit
- 值可以是以下任何一个:
numeric
、timestamp
。 - 默认值为
"numeric"
。
跟踪列的类型。目前只有 "numeric" 和 "timestamp"。
use_column_value
edit
- 值类型为 布尔值
- 默认值为
false
当设置为 true
时,使用定义的 tracking_column
值作为 :sql_last_value
。当设置为 false
时,:sql_last_value
反映上次执行查询的时间。
通用选项edit
以下配置选项受所有输入插件支持。
详情edit
codec
edit
- 值类型为 编解码器。
- 默认值为
"plain"
。
用于输入数据的编解码器。输入编解码器是一种方便的方法,可以在数据进入输入之前对其进行解码,而无需在 Logstash 管道中使用单独的过滤器。