一、背景
需求要把oracle中的数据导入到clickhouse中,使用clickhouse的jdbc表引擎,把oracle11g的数据导入到clickhouse中。
二、方案
通过clickhouse-jdbc-bridge:是clickhouse提供的一个jdbc组件,用于通过JDBC的方式远程访问其他数据库表。
三、clickhouse-jdbc-bridge的下载和安装
3.1 下载clickhouse-jdbc-bridge
(1)登录官网:https://github.com/ClickHouse/clickhouse-jdbc-bridge/releases,下载源码程序到本地
(2)将clickhouse-jdbc-bridge-2.1.0-shaded.jar放在Linux服务器的目录/opt/clickhouse-jdbc-bridge下,并在该文件同级目录下新建3个目录:
config/datasources --存放数据源配置文件
drivers --jdbc驱动存放目录logs --存放日志
3.2 下载Oracle对应的驱动包
(1)oracle驱动的下载和配置
下载地址: https://maven.xwiki.org/externals/com/oracle/jdbc/ojdbc8/12.2.0.1/ojdbc8-12.2.0.1.jar
(2)放置到/opt/clickhouse-jdbc-bridge/drivers目录下。
3.3 配置clickhouse-jdbc-bridge远程的数据库信息
#创建config目录及其子目录
mkdir -p /opt/clickhouse-jdbc-bridge/config/datasources
在datasources目录下创建数据源配置文件,msjdbc.json文件名尽量与配置中的datasource名一致,如下配置:
{
"msjdbc": {
"driverUrls": [
"/opt/clickhouse-jdbc-bridge/drivers/ojdbc8-12.2.0.1.jar"
],
"driverClassName": "oracle.jdbc.driver.OracleDriver",
"jdbcUrl": "jdbc:oracle:thin:@远程连接oracle数据库ip:1521:ora11g",
"username": "ra",
"password": "密码",
"connectionTestQuery": ""
}
当前Linux服务器的目录为:
[root@localhost clickhouse-jdbc-bridge]# tree
.
├── clickhouse-jdbc-bridge-2.1.0-shaded.jar
├── config
│ └── datasources
│ └── msjdbc.json
├── drivers
│ └── ojdbc8-12.2.0.1.jar
├── logs
└── nohup.out
3.4 运行clickhouse-jdbc-bridge
cd /opt/clickhouse-jdbc-bridge
nohup java -Duser.timezone=CN -jar clickhouse-jdbc-bridge-2.1.0-shaded.jar &
##注意 -Duser.timezone=CN 是在请求oracle11 的时候,会有时区的报错 添加这个报错消失
3.5 查看clickhouse-jdbc-bridge的日志
tail -10f nohup.out
3.6 修改clickhouse-server的配置文件
到/etc/clickhouse-server目录下的config.xml文件,找到以下代码,移除注释,并修改host为执行clickhouse-jdbc-bridge-2.1.0-shaded.jar的ip地址:
<jdbc_bridge>
<host>127.0.0.1</host>
<port>9019</port>
</jdbc_bridge>
保存之后,重启clickhouse服务
systemctl restart clickhouse-server
3.7 查询数据
SELECT * FROM jdbc('msjdbc', 'select count(*) from CERT_INFO')
select * FROM jdbc('jdbc:oracle:thin:账号/密码@xx.xx.xx.xx:端口/服务名', 'select * from test_tb')
3.8 插入外部表数据
首先参照oracle的表结构在clickhouse创建表
CREATE TABLE default.CERT_INFO
(
`CERTID` Int64,
`USERID` Int64,
...
`APPLYTIME` Nullable(DateTime64(3)),
...
`KEYALG` Nullable(String),
...
`UPDATETIME` Nullable(DateTime64(3))
)
ENGINE = MergeTree
PRIMARY KEY CERTID
ORDER BY CERTID
SETTINGS index_granularity = 8192
##默认为非空,如果允许空值,需指定Nullable
插入数据:
insert into CERT_INFO_TEST(CERTID,USERID,...,UPDATETIME) SELECT * FROM jdbc('msjdbc', 'select * from CERT_INFO)
250万数据,耗时236秒,插入完成,提示如下:
0 rows in set. Elapsed: 236.850 sec. Processed 2.53 million rows, 3.06 GB (10.68 thousand rows/s., 12.94 MB/s.)