59 lines
2.6 KiB
Bash
59 lines
2.6 KiB
Bash
#!/usr/bin/env bash
|
||
# Импорт дневного архива событий в ClickHouse домашнего сервера.
|
||
#
|
||
# Запускается на домашнем сервере; обычно вызывается из scripts/clickhouse_backup.sh,
|
||
# но можно и вручную — например, чтобы повторно залить архив после сбоя.
|
||
#
|
||
# Использование:
|
||
# ./scripts/clickhouse_import.sh 2026-01-01
|
||
# В stdout печатается количество строк загруженного дня (для сверки), диагностика — в stderr.
|
||
#
|
||
# Настройки (окружение):
|
||
# BACKUP_DIR каталог с архивами events_YYYY-MM-DD.parquet.gz
|
||
# SCHEMA_FILE DDL схемы (по умолчанию clickhouse/init/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}/../clickhouse/init/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} (канонический DDL — 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 --param_day="$DAY" --query "SELECT count() FROM analytics.events WHERE toDate(event_time) = toDate({day:String})"
|