DispelEvilBot/scripts/clickhouse_import.sh

59 lines
2.6 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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}')"