Настройка утилиты для архивирования и восстановления исторических событий

Полное резервное копирование базы данных ClickHouse описано в следующих разделах:

Не рекомендуется настраивать резервное копирование исторических событий, если вы настроили резервное копирование по инструкциям выше.

Для архивирования и восстановления исторических событий используется утилита clickhouse-backup. Чтобы установить и настроить ее в вашей инсталляции ClickHouse, выполните действия, указанные ниже.

Все команды в инструкции необходимо выполнять от имени пользователя root.
  1. Откройте в браузере список релизов clickhouse-backup на GitHub.

  2. Чтобы выбрать пакет релиза для установки, определите архитектуру и семейство ОС узла, где установлена СУБД ClickHouse.

    1. Выполните команду для вывода архитектуры:

      uname -m
      Пример вывода команды uname -m
      x86_64
    2. Выполните команду для вывода файла информации об ОС:

      cat /etc/os-release
      Пример вывода команды cat /etc/os-release
      NAME="RED OS"
      VERSION="MUROM (7.3.2)"
      PLATFORM_ID="platform:el7"
      ID="redos"
      ID_LIKE="rhel centos fedora"
      VERSION_ID="7.3.2"
      PRETTY_NAME="RED OS MUROM (7.3.2)"
      ANSI_COLOR="0;31"
      CPE_NAME="cpe:/o:redos:redos:7"
      HOME_URL="http://red-soft.ru/ru/main_products.html#redos"
      BUG_REPORT_URL="http://redos-support.red-soft.ru"
      EDITION="Standard"

      Если параметр ID_LIKE имеет значение rhel centos fedora, вам нужно скачать файл clickhouse-backup с расширением .rpm, а если ubuntu — с расширением .deb.

    Согласно вышеуказанному примеру, для ОС с параметром ID_LIKE="rhel centos fedora" и архитектурой x86_64 нужно скачать пакет релиза clickhouse-backup clickhouse-backup-2.6.41-1.x86_64.rpm.
  3. Скачайте необходимый пакет релиза и скопируйте его на узел, на котором установлена СУБД ClickHouse.

  4. Установите пакет с помощью менеджера пакетов, доступного на узле, например:

    • Debian

    • РЕД ОС

    dpkg -i <package_name>

    Здесь:

    • <package-name> — имя пакета, например, clickhouse-backup_2.6.41_amd64.deb.

    dnf install -y <package_name>

    Здесь:

    • <package-name> — имя пакета, например, clickhouse-backup-2.6.41-1.x86_64.rpm.

  5. Убедитесь, что утилита clickhouse-backup успешно установлена, с помощью следующей команды:

    clickhouse-backup --version
    Пример вывода версии clickhouse-backup
    Version: 2.6.41
    Git Commit: b52aa4fc973f0025707e09dce2f275257f068ff1
    Build Date: 2025-12-02
  6. Создайте пользователя ClickHouse, от имени которого будет работать clickhouse-backup. Для этого:

    1. Подключитесь к консольному клиенту ClickHouse, выполнив следующую команду:

      clickhouse-client
    2. Создайте пользователя для clickhouse-backup, выполнив следующий запрос:

      CREATE USER <backup_user> IDENTIFIED WITH plaintext_password BY '<backup_password>';

      Здесь и далее:

      • <backup_user> — имя пользователя для clickhouse-backup.

      • <backup_password> — пароль пользователя для clickhouse-backup.

    3. Выдайте пользователю <backup_user> необходимые права для корректной работы clickhouse-backup, выполнив следующий запрос:

      GRANT SELECT, INSERT, ALTER, DROP, CREATE TABLE, BACKUP, SHOW ON *.* TO <backup_user>;
      GRANT SYSTEM ON *.* TO <backup_user>;
    4. Проверьте, что пользователь <backup_user> обладает необходимыми правами, с помощью следующего запроса:

      SHOW GRANTS FOR <backup_user>;

      Результат выполнения запроса должен содержать следующую строку:

      GRANT SHOW, SELECT, INSERT, ALTER, CREATE TABLE, DROP, BACKUP, SYSTEM ON *.* TO <backup_user>
  7. Настройте директорию для хранения архивов исторических событий.

    Далее в инструкции используется директория /opt/clickhouse/backup, однако при необходимости вы можете ее изменить.
    1. Создайте директорию для архивов исторических событий и выдайте права на работу с ней пользователю и группе clickhouse:

      mkdir -p /opt/clickhouse/backup
      chown clickhouse:clickhouse /opt/clickhouse/backup
      chmod 755 /opt/clickhouse/backup
    2. Для обеспечения доступа ClickHouse к разделу на диске, в котором будут создаваться архивы событий, создайте конфигурационный файл /etc/clickhouse-server/config.d/backup_disk.xml со следующим содержимым:

      <clickhouse>
          <storage_configuration>
              <disks>
                  <backups>
                      <type>local</type>
                      <path>/opt/clickhouse/backup/</path>
                  </backups>
              </disks>
          </storage_configuration>
          <backups>
              <allowed_disk>backups</allowed_disk>
              <allowed_path>/opt/clickhouse/backup/</allowed_path>
          </backups>
      </clickhouse>
    3. Для применения конфигурационного файла перезагрузите службы ClickHouse:

      systemctl restart clickhouse-*
    4. Когда службы ClickHouse будут перезапущены, убедитесь, что в логах перезапуска отображается информация о прочтении файла /etc/clickhouse-server/config.d/backup_disk.xml. Для этого выполните следующую команду:

      systemctl status clickhouse-*
      Пример лога с информацией о прочтении файла /etc/clickhouse-server/config.d/backup_disk.xml
      clickhouse-server.service- ClickHouse Server (analytic DBMS for big data)
         Loaded: loaded (/usr/lib/systemd/system/clickhouse-server.service; enabled; vendor preset: disabled)
         Active: active (running) since Fri 2025-11-28 13:55:06 UTC: 3 days ago
       Main PID: 385936 (clickhouse-serv)
          Tasks: 963 (limit: 14304)
          Memory: 8.6G
          CPU: 2d 49min 11.507s
       CGroup: /system.slice/clickhouse-server.service
               ├── 385933 clickhouse-watchdog "" ** ** ** ** *""" --config=/etc/clickhouse-server/config.xml --pid-file=/run/clickhouse-server/clickhouse-server.pid
               └── 385936 /usr/bin/clickhouse-server --config=/etc/clickhouse-server/config.xml --pid-file=/run/clickhouse-server/clickhouse-server.pid
      
      dec 01 13:55:02 clc04.evo.local systemd[1]: Starting ClickHouse Server (analytic DBMS for big data)...
      dec 01 13:55:02 clc04.evo.local clickhouse-server [385933]: Processing configuration file '/etc/clickhouse-server/config.xml'.
      dec 01 13:55:02 clc04.evo.local clickhouse-server [385933]: Merging configuration file '/etc/clickhouse-server/config.d/backup_disk.xml'.
      dec 01 13:55:02 clc04.evo.local clickhouse-server [385933]: Logging warning to /var/log/clickhouse-server/clickhouse-server.log
      dec 01 13:55:02 clc04.evo.local clickhouse-server [385933]: Logging errors to /var/log/clickhouse-server/clickhouse-server.err.log
      dec 01 13:55:02 clc04.evo.local systemd[1]: clickhouse-server.service: Supervising process 385936 which is not our child. We'll most likely not notice when it exits.
      dec 01 13:55:06 clc04.evo.local systemd[1]: Started ClickHouse Server (analytic DBMS for big data).
  8. Создайте конфигурационный файл /etc/clickhouse-backup/config.yml, содержащий настройки утилиты clickhouse-backup:

    general:
        remote_storage: none
        backups_to_keep_local: <backups_to_keep_local>
        log_level: info
    clickhouse:
        username: <backup_user>
        password: <backup_password>
        host: localhost
        port: 9000
        disk_mapping:
          backups: /opt/clickhouse/backup/
        skip_tables:
            - system.*
            - INFORMATION_SCHEMA.*
            - information_schema.*
        timeout: <timeout>
        use_embedded_backup_restore: true
        embedded_backup_disk: "backups"
        debug: false

    Здесь:

    • <backups_to_keep_local> — максимальное количество архивов событий, хранимых на диске. Целое число. Следует настроить его в зависимости от размера доступного дискового пространства.

    • <backup_user> — имя пользователя для clickhouse-backup.

    • <backup_password> — пароль пользователя для clickhouse-backup.

    • <timeout> — максимальное допустимое время на создание архива, после чего процесс архивирования исторических событий будет досрочно остановлен. Указывается в часах, например, 24h.

  9. Создайте скрипт архивирования исторических событий /usr/local/bin/archive_events.sh:

    #!/bin/bash
    
    # archive_events.sh - архивация партиций таблиц default.EventStorage_*_local старше N дней и удаление их из ClickHouse.
    #
    # Использование: ./archive_events.sh [DAYS].
    #   DAYS - события старше скольких дней нужно архивировать (по умолчанию 7).
    #
    # Требования: bash, clickhouse-client, clickhouse-backup.
    
    set -euo pipefail
    
    # Перенаправление stdout и stderr в лог-файл.
    LOG_DIR=/opt/clickhouse/log
    LOG_FILE="$LOG_DIR/archive_events.log"
    
    mkdir -p "$LOG_DIR"
    chown clickhouse:clickhouse "$LOG_DIR"
    chmod 0755 "$LOG_DIR"
    touch "$LOG_FILE"
    chown clickhouse:clickhouse "$LOG_FILE"
    chmod 0644 "$LOG_FILE"
    
    exec >>"$LOG_FILE" 2>&1
    
    # Пути к утилитам clickhouse-backup и clickhouse-client.
    CHB_BIN=/usr/bin/clickhouse-backup
    CH_CLIENT=/usr/bin/clickhouse-client
    
    # Вызов справки по ключу --help.
    if [[ "${1:-}" =~ ^(-h|--help)$ ]]; then
      cat <<'EOF'
    Использование: ./archive_events.sh [DAYS].
      DAYS - события старше скольких дней нужно архивировать (по умолчанию 7).
    EOF
      exit 0
    fi
    
    RETENTION_DAYS="${1:-7}"
    
    # Паттерн таблиц и путь к конфигурационному файлу.
    TABLE_PATTERN='default.EventStorage_*_local'
    CHB_CFG='/etc/clickhouse-backup/config.yml'
    
    # Проверка наличия утилиты clickhouse-backup.
    if ! command -v "$CHB_BIN" &>/dev/null; then
      echo "ERROR: clickhouse-backup не найден по $CHB_BIN" >&2
      exit 1
    fi
    
    # Проверка наличия утилиты clickhouse-client.
    if ! command -v "$CH_CLIENT" &>/dev/null; then
      echo "ERROR: clickhouse-client не найден по $CH_CLIENT" >&2
      exit 1
    fi
    
    # Чтение учетных данных из конфигурационного файла.
    read -r CHB_USER CHB_PASS CHB_HOST CHB_PORT < <(
      awk '/^\s*username:/ {u=$2}
           /^\s*password:/ {p=$2}
           /^\s*host:/     {h=$2}
           /^\s*port:/     {po=$2}
           END {
             print u, p, h, po
           }' "$CHB_CFG"
    )
    
    # Проверка, что учетные данные успешно получены.
    if [[ -z "$CHB_USER" || -z "$CHB_PASS" || -z "$CHB_HOST" || -z "$CHB_PORT" ]]; then
      echo "ERROR: не удалось прочитать username/password/host/port из $CHB_CFG" >&2
      exit 1
    fi
    
    # Проверка наличия и выбор кластера ClickHouse. По умолчанию - default.
    CLUSTER=$("$CH_CLIENT" \
      --host="$CHB_HOST" --port="$CHB_PORT" \
      --user="$CHB_USER" --password="$CHB_PASS" \
      --query="SELECT any(cluster) FROM system.clusters FORMAT TSV")
    CLUSTER="${CLUSTER:-default}"
    
    # Вычисление пороговой даты.
    CUTOFF=$(date -d "-${RETENTION_DAYS} days" +%Y%m%d)
    
    # Сбор списка партиций.
    mapfile -t PARTS < <(
      "$CH_CLIENT" \
        --host="$CHB_HOST" --port="$CHB_PORT" \
        --user="$CHB_USER" --password="$CHB_PASS" \
        --query="
          SELECT DISTINCT partition
          FROM system.parts
          WHERE active
            AND database='default'
            AND table LIKE 'EventStorage_%_local'
            AND partition <= '$CUTOFF'
          ORDER BY partition
          FORMAT TSV"
    )
    
    if [ "${#PARTS[@]}" -eq 0 ]; then
      echo "Нет партиций ≤ $CUTOFF для архивации, процесс отменен."
      exit 0
    fi
    
    # Формирование CSV-файла и имени архива с перечислением партиций.
    {
      IFS=','
      PARTS_CSV="${PARTS[*]}"
    }
    
    PARTS_UNDERSCORED="${PARTS_CSV//,/_}"
    BACKUP_NAME="archive_events_${PARTS_UNDERSCORED}"
    
    echo "→ Архивация партиций [$PARTS_CSV] в архив '$BACKUP_NAME'…"
    "$CHB_BIN" create \
      --config "$CHB_CFG" \
      --tables="$TABLE_PATTERN" \
      --partitions="$PARTS_CSV" \
      "$BACKUP_NAME"
    
    PARTS_SQL=$(printf "'%s'," "${PARTS[@]}")
    PARTS_SQL=${PARTS_SQL%,}
    
    echo "→ Удаление партиций из ClickHouse (кластер '$CLUSTER')…"
    # Сбор списка таблиц, из которых надо удалить партиции.
    mapfile -t TABLES < <(
      "$CH_CLIENT" \
        --host="$CHB_HOST" --port="$CHB_PORT" \
        --user="$CHB_USER" --password="$CHB_PASS" \
        --query="
          SELECT DISTINCT concat(database, '.', table)
          FROM system.parts
          WHERE active
            AND database='default'
            AND table LIKE 'EventStorage_%_local'
            AND partition IN (${PARTS_SQL})
          FORMAT TSV"
    )
    
    for tbl in "${TABLES[@]}"; do
      for part in "${PARTS[@]}"; do
        echo "  • ALTER TABLE $tbl ON CLUSTER '$CLUSTER' DROP PARTITION '$part'"
        "$CH_CLIENT" \
          --host="$CHB_HOST" --port="$CHB_PORT" \
          --user="$CHB_USER" --password="$CHB_PASS" \
          --query="ALTER TABLE $tbl ON CLUSTER '$CLUSTER' DROP PARTITION '$part'"
      done
    done
    
    echo "Готово. Архив: $BACKUP_NAME, удалены партиции ≤ $CUTOFF."
  10. Сделайте скрипт исполняемым и выдайте на него права пользователю и группе clickhouse:

    chown clickhouse:clickhouse /usr/local/bin/archive_events.sh
    chmod 750 /usr/local/bin/archive_events.sh
  11. Перейдите к разделу Работа с утилитой для архивирования исторических событий.

Была ли полезна эта страница?

Обратная связь