====== Миграция базы данных в ClickHouse для Glaber ====== Миграцию можно выполнить через выполнение SQL команд на Clickhouse сервер, ниспользуя утилиту clickhouse-client. Мигрировать необходимо 6 основных таблиц: четыре таблицы истории: * history * history_uint * history_str * history_text две таблицы трендов * trends * trends_uint В Glaber в ClickHouse и текстовые и строковые данные хранятся в единой таблице history_str Для mysql команды будут аналогичными, но дополнительно нужно будет поменять название движка БД на MySQL. В последовательности SQL команд исправьте данные для подключения к серверу Postgtes: имя пользователя и пароль, название базы и именование схемы. ===== Подключение к ClickHouse ===== clickhouse-client --password glaber ===== Схема БД для ClickHouse ===== Если схема не была импортирована! Создаем базу данных таблицы и таблицы, запросы можно найти в проекте в databases/clickhouse \\ https://gitlab.com/mikler/glaber/-/blob/master/database/clickhouse/history.sql \\ clickhouse-client --password --multiquery < history.sql В содержимое history.sql вставить это: CREATE DATABASE glaber; CREATE TABLE glaber.history_dbl ( day Date, itemid UInt64, clock DateTime, hostname String, itemname String, ns UInt32, value Float64 ) ENGINE = MergeTree() PARTITION BY toYYYYMM(day) ORDER BY (itemid, clock) TTL day + INTERVAL 6 MONTH; -- CREATE TABLE glaber.history_uint ( day Date, itemid UInt64, clock DateTime, hostname String, itemname String, ns UInt32, value UInt64 ) ENGINE = MergeTree() PARTITION BY toYYYYMM(day) ORDER BY (itemid, clock) TTL day + INTERVAL 6 MONTH; CREATE TABLE glaber.history_str ( day Date, itemid UInt64, clock DateTime, hostname String, itemname String, ns UInt32, value String ) ENGINE = MergeTree() PARTITION BY toYYYYMM(day) ORDER BY (itemid, clock) TTL day + INTERVAL 6 MONTH; -- CREATE TABLE glaber.history_log ( day Date, itemid UInt64, clock DateTime, logeventid UInt64, source String, severity Int16, hostname String, itemname String, ns UInt32, value String ) ENGINE = MergeTree() PARTITION BY toYYYYMM(day) ORDER BY (itemid, clock) TTL day + INTERVAL 6 MONTH; -- CREATE TABLE glaber.trends_dbl ( day Date, itemid UInt64, clock DateTime, value_min Float64, value_max Float64, value_avg Float64, count UInt32, hostname String, itemname String ) ENGINE = MergeTree PARTITION BY toYYYYMM(day) ORDER BY (itemid, clock) TTL day + toIntervalMonth(24) SETTINGS index_granularity = 8192; -- CREATE TABLE glaber.trends_uint ( day Date, itemid UInt64, clock DateTime, value_min Int64, value_max Int64, value_avg Int64, count UInt32, hostname String, itemname String ) ENGINE = MergeTree PARTITION BY toYYYYMM(day) ORDER BY (itemid, clock) TTL day + toIntervalMonth(24) SETTINGS index_granularity = 8192; ===== Миграция с PostgreSQL ===== Отредактировать строку запроса **FROM PostgreSQL** INSERT INTO glaber.history_dbl SELECT toDate(clock) AS day, itemid, clock, '', '', ns, value FROM PostgreSQL('host:port', 'database', 'history', 'user', 'password', 'schema') INSERT INTO glaber.history_uint SELECT toDate(clock) AS day, itemid, clock, '', '', ns, value FROM PostgreSQL('host:port', 'database', 'history_uint', 'user', 'password', 'schema') INSERT INTO glaber.history_str SELECT toDate(clock) AS day, itemid, clock, '', '', ns, value FROM PostgreSQL('localhost:5432', 'zabbix', 'history_str', 'zabbix', 'zabbix') INSERT INTO glaber.history_str SELECT toDate(clock) AS day, itemid, clock, '', '', ns, value FROM PostgreSQL('host:port', 'database', 'history_text', 'user', 'password', 'schema') INSERT INTO glaber.history_log SELECT toDate(clock) AS day, itemid, clock, logeventid, source, severity, '', '', ns, value FROM PostgreSQL('host:port', 'database', 'history_log', 'user', 'password', 'schema') INSERT INTO glaber.trends_dbl SELECT toDate(clock) AS day, itemid, clock, value_min, value_max, value_avg, num, '', '' FROM PostgreSQL('host:port', 'database', 'trends', 'user', 'password', 'schema') INSERT INTO glaber.trends_uint SELECT toDate(clock) AS day, itemid, clock, value_min, value_max, value_avg, num, '', '' FROM PostgreSQL('host:port', 'database', 'trends_uint', 'user', 'password', 'schema') ===== Миграция с MySQL ===== Отредактировать строку запроса **FROM MySQL** INSERT INTO glaber.history_dbl SELECT toDate(clock) AS day, itemid, clock, '', '', ns, value FROM MySQL('host:port', 'database', 'history', 'user', 'password', 'schema') INSERT INTO glaber.history_uint SELECT toDate(clock) AS day, itemid, clock, '', '', ns, value FROM MySQL('host:port', 'database', 'history_uint', 'user', 'password', 'schema') INSERT INTO glaber.history_str SELECT toDate(clock) AS day, itemid, clock, '', '', ns, value FROM MySQL('localhost:5432', 'zabbix', 'history_str', 'zabbix', 'zabbix') INSERT INTO glaber.history_str SELECT toDate(clock) AS day, itemid, clock, '', '', ns, value FROM MySQL('host:port', 'database', 'history_text', 'user', 'password', 'schema') INSERT INTO glaber.history_log SELECT toDate(clock) AS day, itemid, clock, logeventid, source, severity, '', '', ns, value FROM MySQL('host:port', 'database', 'history_log', 'user', 'password', 'schema') INSERT INTO glaber.trends_dbl SELECT toDate(clock) AS day, itemid, clock, value_min, value_max, value_avg, num, '', '' FROM MySQL('host:port', 'database', 'trends', 'user', 'password', 'schema') INSERT INTO glaber.trends_uint SELECT toDate(clock) AS day, itemid, clock, value_min, value_max, value_avg, num, '', '' FROM MySQL('host:port', 'database', 'trends_uint', 'user', 'password', 'schema') ===== Источники ===== * [[https://docs.glaber.io/ru/setup/zabbix_history_migration/]] * [[https://clickhouse.com/docs/en/engines/table-engines/integrations]]