一、背景

需求要把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.)

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐