Jdbc 输入插件
编辑Jdbc 输入插件
编辑对于其他版本,请参阅版本化插件文档。
获取帮助
编辑有关插件的问题,请在Discuss论坛中开启一个主题。对于错误或功能请求,请在Github中开启一个问题。有关 Elastic 支持的插件列表,请查阅Elastic 支持矩阵。
描述
编辑此插件的创建是为了将具有 JDBC 接口的任何数据库中的数据引入 Logstash。 您可以使用 cron 语法定期安排数据引入(请参阅 schedule
设置),或者运行一次查询以将数据加载到 Logstash 中。结果集中的每一行都成为一个单独的事件。结果集中的列将转换为事件中的字段。
驱动程序
编辑此插件不附带 JDBC 驱动程序库。所需的 jdbc 驱动程序库必须使用 jdbc_driver_library
配置选项显式传递到插件中。
有关更多信息,请参阅 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 选项传入,或者从文件 (statement_filepath
) 中读取。当 SQL 语句很大或在配置中提供起来很麻烦时,通常使用文件选项。文件选项仅支持一个 SQL 语句。插件将仅接受其中一个选项。它不能从文件和 statement
配置参数中读取语句。
配置多个 SQL 语句
编辑当需要从不同的数据库表或视图中查询和引入数据时,配置多个 SQL 语句非常有用。可以为每个语句定义单独的 Logstash 配置文件,或者在单个配置文件中定义多个语句。在单个 Logstash 配置文件中使用多个语句时,每个语句都必须定义为单独的 jdbc 输入(包括 jdbc 驱动程序、连接字符串和其他必需的参数)。
请注意,如果任何语句使用 sql_last_value
参数(例如,仅引入自上次运行以来更改的数据),则每个输入都应定义自己的 last_run_metadata_path
参数。否则会导致不良行为,因为所有输入都将其状态存储到相同的(默认)元数据文件中,从而有效地覆盖彼此的 sql_last_value
。
预定义参数
编辑一些参数是内置的,可以从查询中使用。以下是列表
sql_last_value |
用于计算要查询的行的值。在运行任何查询之前,如果 |
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_paging_mode
的值为 auto
时,jdbc 分页使用计数查询,因此目前也不支持将 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 的时间戳列类型中,但许多时区在一年中会更改其偏移量,因此不能与 SQL 的时间戳类型一起使用来表示有序的、连续的时间线。例如,在 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,如果驱动程序似乎未正确加载,即使通过 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_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
编辑- 值类型为 字符串
- 默认值为
"<path.data>/plugins/inputs/jdbc/logstash_jdbc_last_run"
上次运行时间的文件路径
在 5.2.6 之前的版本中,元数据文件写入 $HOME/.logstash_jdbc_last_run
。如果在 Logstash 升级期间在“$HOME”中找到该文件,它将被移动到“path.data”下的默认位置。如果路径由用户定义,则不会执行自动移动。
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
设置配置命名参数。
target
编辑- 值类型是 字段引用
- 此设置没有默认值。
如果没有 target
,则会从每一行根级别的列创建事件。当 target
设置为字段引用时,每一行的列将放置在目标字段中。
当强制执行下游模式(例如 ECS)时,此选项对于避免填充未知字段非常有用。
tracking_column_type
编辑- 值可以是以下任何一个:
numeric
,timestamp
- 默认值是
"numeric"
跟踪列的类型。目前仅支持“numeric”和“timestamp”
use_column_value
编辑- 值类型为 布尔值
- 默认值为
false
当设置为 true
时,使用定义的 tracking_column
值作为 :sql_last_value
。当设置为 false
时,:sql_last_value
反映上次执行查询的时间。
通用选项
编辑所有输入插件都支持这些配置选项
codec
编辑- 值类型是 编解码器
- 默认值是
"plain"
用于输入数据的编解码器。输入编解码器是一种方便的方法,可以在数据进入输入之前对其进行解码,而无需在 Logstash 管道中使用单独的过滤器。