#!/usr/bin/env bash # Импорт дневного архива событий в ClickHouse домашнего сервера. # # Запускается на домашнем сервере (обычно по ssh из scripts/clickhouse_backup.sh). # Рядом должны лежать этот скрипт и канонический DDL кликхаус-схемы # (clickhouse/init/001_events.sql из репозитория). # # Использование: ./clickhouse_import.sh 2026-01-01 # В stdout печатается количество строк загруженного дня (для сверки), диагностика — в stderr. # # Настройки (окружение): # BACKUP_DIR каталог, куда складываются архивы events_YYYY-MM-DD.parquet.gz # SCHEMA_FILE путь к DDL схемы (по умолчанию ./001_events.sql рядом со скриптом) # CLICKHOUSE_CLIENT бинарь клиента (по умолчанию clickhouse-client) # CLICKHOUSE_HOST/PORT/USER/PASSWORD доступ к ClickHouse домашнего сервера set -euo pipefail DAY="${1:?укажите дату в формате YYYY-MM-DD}" PARTITION="${DAY//-/}" ARCHIVE_DIR="${BACKUP_DIR:-.}" ARCHIVE="${ARCHIVE_DIR}/events_${DAY}.parquet.gz" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SCHEMA_FILE="${SCHEMA_FILE:-${SCRIPT_DIR}/001_events.sql}" CLIENT="${CLICKHOUSE_CLIENT:-clickhouse-client}" log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" >&2; } ch() { "$CLIENT" \ --host "${CLICKHOUSE_HOST:-localhost}" \ --port "${CLICKHOUSE_PORT:-9000}" \ --user "${CLICKHOUSE_USER:-default}" \ --password "${CLICKHOUSE_PASSWORD:-}" "$@" } [ -f "$ARCHIVE" ] || { log "нет файла архива ${ARCHIVE}" exit 1 } [ -f "$SCHEMA_FILE" ] || { log "нет файла схемы ${SCHEMA_FILE} (скопируйте clickhouse/init/001_events.sql на домашний сервер)" exit 1 } log "Применяю схему из ${SCHEMA_FILE}" ch --multiquery <"$SCHEMA_FILE" # Повторный импорт того же дня не должен дублировать строки. log "Очищаю партицию ${PARTITION} перед импортом" ch --query "ALTER TABLE analytics.events DROP PARTITION ID '${PARTITION}'" 2>/dev/null || true log "Импортирую ${ARCHIVE} в analytics.events" gzip -dc "$ARCHIVE" | ch --query "INSERT INTO analytics.events FORMAT Parquet" log "Импорт завершён" ch --query "SELECT count() FROM analytics.events WHERE toDate(event_time) = toDate('${DAY}')"