如何使用 Db2 客户机将 CSV 文件远程装入 Db2 事件存储?



我在 Db2 事件存储文档中看到,当 CSV 文件位于本文档 https://www.ibm.com/support/knowledgecenter/en/SSGNPV_2.0.0/local/loadcsv.html 的系统内时,可以将该文件装入到系统中。我还发现,如何在如何从远程 Db2 实例连接到 IBM Db2 事件存储实例?中,您可以使用标准 Db2 客户机连接到 Db2 事件存储数据库。我现在要做的是使用该连接加载CSV文件。可以远程加载吗?

这应该可以通过指定的额外关键字REMOTESOURCE YES来实现,例如:

db2 "INSERT INTO import_test SELECT * FROM EXTERNAL '/home/db2v111/data.del' USING (DELIMITER ',' REMOTESOURCE YES)"

请参阅此处的示例: 使用 RUN SQL 接口在 IBM DB2 Cloud 上使用 IMPORT 脚本

其他答案提到了使用传统 db2 的连接和加载。我必须添加一些专门用于 Db2 事件存储的更多详细信息。

假设我们使用的是 Db2 客户机容器,该容器可以在 docker 集线器找到,带有标记ibmcom/db2。 基本上我们必须经历以下步骤:

1/建立从 DB2 客户机容器到远程 DB2 事件库数据库的远程连接

2/使用 DB2 CLP 命令通过 DB2 的外部表装入功能来装入 CSV 文件,该功能会将 CSV 文件从 DB2 客户机容器装入到远程事件库数据库。

第 1 步: 运行以下命令,或在脚本中运行它。请注意,这些命令需要在 db2 客户机容器中以 db2 用户身份运行。db2 用户名通常db2inst1

#!/bin/bash -x
NODE_NAME=eventstore
. /database/config/db2inst1/sqllib/db2profile
### create new keydb used for authentication
# remote old keydb files
rm -rf $HOME/mydbclient.kdb  $HOME/mydbclient.sth $HOME/mydbclient.crl $HOME/mydbclient.rdb
$HOME/sqllib/gskit/bin/gsk8capicmd_64 -keydb -create -db $HOME/mydbclient.kdb -pw ${SSL_KEY_DATABASE_PASSWORD} -stash
KEYDB_PATH=/var/lib/eventstore/clientkeystore
# get the target eventstore cluster's SSL public certificate using REST api
bearerToken=`curl --silent -k -X GET "https://$IP/v1/preauth/validateAuth" -u $EVENT_USER:$EVENT_PASSWORD | python -c "import sys, json; print (json.load(sys.stdin)['accessToken']) "`
curl --silent -k -X GET -H "authorization: Bearer $bearerToken"  "https://${IP}:443/com/ibm/event/api/v1/oltp/certificate" -o $HOME/server-certificate.cert 
# insert eventstore cluster's SSL public cert into new gskit keydb
$HOME/sqllib/gskit/bin/gsk8capicmd_64 -cert -add -db $HOME/mydbclient.kdb  -pw ${SSL_KEY_DATABASE_PASSWORD}  -label server -file $HOME/server-certificate.cert -format ascii -fips
# let db2 client use the new keydb 
$HOME/sqllib/bin/db2 update dbm cfg using SSL_CLNT_KEYDB $HOME/mydbclient.kdb SSL_CLNT_STASH $HOME/mydbclient.sth
# configure connection from db2Client to remote EventStore cluster.
$HOME/sqllib/bin/db2 UNCATALOG NODE ${NODE_NAME}
$HOME/sqllib/bin/db2 CATALOG TCPIP NODE ${NODE_NAME} REMOTE ${IP} SERVER ${DB2_CLIENT_PORT_ON_EVENTSTORE_SERVER} SECURITY SSL
$HOME/sqllib/bin/db2 UNCATALOG DATABASE ${EVENTSTORE_DATABASE}
$HOME/sqllib/bin/db2 CATALOG DATABASE ${EVENTSTORE_DATABASE} AT NODE ${NODE_NAME} AUTHENTICATION GSSPLUGIN
$HOME/sqllib/bin/db2 terminate
# Ensure to use correct database name, eventstore user credential in remote 
# eventstore cluster
$HOME/sqllib/bin/db2 CONNECT TO ${EVENTSTORE_DATABASE} USER ${EVENT_USER} USING ${EVENT_PASSWORD}

一些重要的变量: EVENTSTORE_DATABASE:远程事件存储群集中的数据库名称

EVENT_USER:事件存储用户名远程事件存储群集

EVENT_PASSWORD:事件存储用户密码远程事件存储群集

IP:远程事件存储集群的公共 IP

DB2_CLIENT_PORT_ON_EVENTSTORE_SERVER:远程事件存储集群的 JDBC 端口,通常为 18730

SSL_KEY_DATABASE_PASSWORD:DB2 客户机容器中 gskit keydb 文件的密钥库密码,您可以根据需要进行设置

运行上述命令后,您应该已在本地 db2 客户机容器和远程事件存储集群之间建立了连接

2/使用 db2 的外部表功能装入 csv 文件

在 db2客户机和远程事件存储集群之间建立连接之后,我们可以发出 db2 CLP 命令,就像向任何本地 db2 数据库发出命令一样。

例如:

// establish remote connection to eventstore database
// replace the same variables in ${} with what you used above.
CONNECT TO ${EVENTSTORE_DATABASE} USER ${EVENT_USER} USING ${EVENT_PASSWORD}
SET CURRENT ISOLATION UR
// create table in the remote eventstore database
CREATE TABLE db2cli_csvload (DEVICEID INTEGER NOT NULL, SENSORID INTEGER NOT NULL, TS BIGINT NOT NULL, AMBIENT_TEMP DOUBLE NOT NULL, POWER DOUBLE NOT NULL, TEMPERATURE DOUBLE NOT NULL, CONSTRAINT "TEST1INDEX" PRIMARY KEY(DEVICEID, SENSORID, TS) INCLUDE (TEMPERATURE)) DISTRIBUTE BY HASH (DEVICEID, SENSORID) ORGANIZE BY COLUMN STORED AS PARQUET
// external table load to remote eventstore database
INSERT INTO db2cli_csvload SELECT * FROM EXTERNAL '${DB_HOME_IN_CONTAINER}/${CSV_FILE}' LIKE db2cli_csvload USING (delimiter ',' MAXERRORS 10 SOCKETBUFSIZE 30000 REMOTESOURCE 'YES' LOGDIR '/database/logs' )
CONNECT RESET
TERMINATE

有关更多信息,您可以查看 Db2 EventStore 的公共 github 存储库。 https://github.com/IBMProjectEventStore/db2eventstore-IoT-Analytics/tree/master/db2client_remote/utils

最新更新