Интеграция 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