Интеграция Yandex Managed Service for ClickHouse® с Oracle через ClickHouse® JDBC Bridge
С помощью ClickHouse® JDBC Bridge
- Запрашивать данные с помощью функции JDBC Table Function
из таблицы внешней базы данных Oracle. - Создавать таблицы в ClickHouse® с помощью JDBC Table Engine
, ссылающиеся на таблицу внешней базы данных Oracle.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки решения входят:
- Плата за кластер Managed Service for ClickHouse®: использование вычислительных ресурсов, выделенных хостам (в том числе хостам ZooKeeper), и дискового пространства (см. тарифы Managed Service for ClickHouse®).
- Плата за NAT-шлюз, если для хостов кластера не включен публичный доступ (см. тарифы Virtual Private Cloud).
- Плата за использование публичных IP-адресов, если для хостов кластера включен публичный доступ (см. тарифы Virtual Private Cloud).
Подготовьте инфраструктуру
-
Создайте группу безопасности и настройте ее.
Также добавьте правило для исходящего трафика:
- Диапазон портов —
0-65535
; - Протокол —
TCP
; - Источник —
CIDR
; - CIDR блоки —
0.0.0.0/0
.
Это правило разрешает любой исходящий трафик, что позволит ClickHouse® JDBC Bridge подключаться к внешним базам данных, в т. ч. к Oracle.
- Диапазон портов —
-
Создайте кластер Managed Service for ClickHouse®.
При создании кластера укажите группу безопасности, подготовленную ранее.
В разделе Настройки СУБД нажмите Настроить и добавьте опцию jdbcBridge с параметрами:
- host — IP-адрес вашей инсталляции базы данных Oracle;
- port —
9019
.
-
Создайте NAT-шлюз для подсети, в которой будет создан кластер Managed Service for ClickHouse®, если вы не используете публичный доступ.
Подготовьте внешнюю базу данных Oracle
Важно
В приведенных ниже командах все сущности, создаваемые для базы данных Oracle, указываются в верхнем регистре согласно правилам именования Oracle
-
Убедитесь, что к вашей инсталляции внешней базы данных Oracle разрешено подключение по портам
9019
и1521
. -
Подключитесь к вашей инсталляции внешней базы данных Oracle и загрузите JDBC драйвер ojdbc8
в директорию/opt/drivers
:sudo mkdir -p /opt/drivers && \ curl -s https://repo1.maven.org/maven2/com/oracle/database/jdbc/ojdbc8/ | grep -oP '(?<=href=")[0-9][^/]+(?=/")' | sort -V | tail -n1 | xargs -I{} sudo curl -o /opt/drivers/ojdbc8-{}.jar https://repo1.maven.org/maven2/com/oracle/database/jdbc/ojdbc8/{}/ojdbc8-{}.jar
-
Установите Docker Engine
. -
Запустите ClickHouse® JDBC Bridge:
docker run -d --name jdbc_bridge --network host -v /opt/drivers:/app/drivers clickhouse/jdbc-bridge
Если у вас уже запущен контейнер, перезапустите его, чтобы новые драйверы загрузились в ClickHouse® JDBC Bridge:
docker container restart jdbc_bridge
-
Подключитесь к внешней базе данных Oracle как администратор
. Например, через SQL Plus, если вы подключаетесь локально:sqlplus / as sysdba
-
Смените сессию на нужную PDB
, например наPDB1
:ALTER SESSION SET CONTAINER = PDB1;
-
Создайте пользователя
JDBC_USER
, от имени которого вы будете подключаться из кластера Managed Service for ClickHouse®:CREATE USER JDBC_USER IDENTIFIED BY <пароль_пользователя> DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP QUOTA UNLIMITED ON USERS;
Где
<пароль_пользователя>
— ваш пароль пользователяJDBC_USER
.Совет
Чтобы подключаться к разным PDB, создайте общего пользователя
, добавив к его имени префиксC##
. Например,C##JDBC_USER
. -
Выдайте права, необходимые для работы ClickHouse® JDBC Bridge:
GRANT CONNECT, RESOURCE TO JDBC_USER;
-
Подключитесь от нового пользователя:
CONNECT JDBC_USER/<пароль_пользователя>@<хост_Oracle_DB>/PDB1;
Где:
<пароль_пользователя>
— пароль пользователяJDBC_USER
.<хост_Oracle_DB>
— IP-адрес вашей инсталляции базы данных Oracle.
-
Создайте тестовую таблицу с именем
CUSTOMERS
:CREATE TABLE CUSTOMERS ( NAME VARCHAR2(100), EMAIL VARCHAR2(100) );
-
Добавьте тестовые данные:
INSERT INTO CUSTOMERS (NAME, EMAIL) VALUES ('Angela Smith', 'angela@example.ru'); INSERT INTO CUSTOMERS (NAME, EMAIL) VALUES ('Bob Johnson', 'bob@example.ru'); INSERT INTO CUSTOMERS (NAME, EMAIL) VALUES ('Charlie Brown', 'charlie@example.ru'); COMMIT;
-
Проверьте, что данные записались:
SELECT * FROM CUSTOMERS;
Запросите данные с помощью JDBC Table Function
-
Отправьте запрос к внешней базе данных Oracle с помощью JDBC Table Function:
SELECT * FROM jdbc('jdbc:oracle:thin:JDBC_USER/<пароль_пользователя>@<хост_Oracle_DB>:1521/PDB1', 'SELECT * FROM CUSTOMERS');
Где:
<пароль_пользователя>
— пароль пользователяJDBC_USER
.<хост_Oracle_DB>
— IP-адрес вашей инсталляции базы данных Oracle.
Если запрос выполнен успешно, то вы получите данные из внешней базы данных Oracle.
Создайте таблицу с помощью JDBC Table Engine
С помощью JDBC Table Engine вы можете:
-
Запрашивать данные через
SELECT
. -
Добавлять новые значения через
INSERT INTO
, с ограничениями:- Таблица в базе данных кластера Managed Service for ClickHouse® должна полностью повторять структуру таблицы, на которую ссылается.
INSERT INTO
— единственная доступная операция записи. Изменять уже существующие данные черезUPDATE
,DELETE
,ALTER
и т. п. — нельзя.- Если добавить новые записи и не указать в них значения для полей с автоматической генерацией (
DEFAULT
,GENERATED BY
,SYSDATE
и т. п.), эти значения сгенерированы не будут.
Чтобы использовать JDBC Table Engine:
-
Создайте таблицу с JDBC Table Engine на основе таблицы из внешней базы данных Oracle.
CREATE TABLE oracle_customers ENGINE = JDBC( 'jdbc:oracle:thin:JDBC_USER/<пароль_пользователя>@<хост_Oracle_DB>:1521/XEPDB1', 'JDBC_USER', 'CUSTOMERS' ) AS SELECT * FROM jdbc( 'jdbc:oracle:thin:JDBC_USER/<пароль_пользователя>@<хост_Oracle_DB>:1521/XEPDB1', 'JDBC_USER', 'SELECT * FROM CUSTOMERS' ) LIMIT 0;
Вы также можете создать таблицу с указанием только части полей, однако в таком случае вы не сможете добавлять новые значения через
INSERT INTO
. -
Проверьте результат:
SELECT * FROM oracle_customers;
-
Вставьте новую строку:
INSERT INTO oracle_customers (NAME, EMAIL) VALUES ('Alice Wonderland', 'alice@example.ru');
ClickHouse® JDBC Bridge сам открывает транзакцию и закрывает её. Выполнять отдельно
COMMIT
не нужно. -
Снова проверьте результат и сравните с предыдущим выводом:
SELECT * FROM oracle_customers;
Если вставка прошла успешно, вы увидите новую строку в полученном выводе.
Удалите созданные ресурсы
Некоторые ресурсы платные. Чтобы за них не списывалась плата, удалите ресурсы, которые вы больше не будете использовать:
ClickHouse® является зарегистрированным товарным знаком ClickHouse, Inc