Задача, которую необходимо было решить:
Есть SQL сервер с базой в 1 миллиард записей, который уже не справлялся с подготовкой отчетов по тем или иным запросам. Выполнение запросов могло быть и час и два и три.
Было решено все данные, которые хранились на SQL сервере перенести на базу ClickHouse.
После недолгих поисков был создан вот такой скрипт на языке Python. Используются специальная библиотека pandas.
Запускаем его на сервере где находится ClickHouse
# библиотеки для Clikhouse
from sqlalchemy import create_engine
import pandas as pd
# engine для clickhouse. Подключаемся
uri = 'clickhouse+native://IP адрес сервера ClickHouse:9000/Имя базы данных'
engine_click = create_engine(uri)
# engine для MSSQL
server = 'IP адрес SQL сервера'
database = 'База данных'
driver='driver=/opt/microsoft/msodbcsql18/lib64/libmsodbcsql-18.2.so.1.1'
user = 'имя пользователя для подключения к базе данных SQL'
password = “пароль”
engine_ms = create_engine(f'mssql+pyodbc://{user}:{password}@{server}/{database}?{driver}&Encrypt=yes&TrustServerCertificate=yes')
# Запрос для MSSQL. Выбираем все из таблицы
sql_str = '''SELECT * FROM БазаДанных.ИмяТаблицы'''
# Забираем результат порциями(чанками). Делим их по сто тысяч записей.
df = pd.read_sql_query(sql_str, engine_ms.connect(),chunksize=100000)
for chunk in df:
# Для каждого чанка мы можем менять типы данных, модернизировать данные, фильтровать и так далее, перед тем как отправим в ClickHouse
chunk['LogonType']=chunk['LogonType'].fillna(0)
chunk['LogonType']=chunk['LogonType'].astype('int')
# записываем порцию в ClickHouse
chunk.to_sql('AccessEvents', engine_click, if_exists='append', index=False)
Копирование одного миллиарда записей в нашем примере составила несколько часов.