Восстановление внутренних баз данных

Требования

  • База данных развернута внутри кластера Kubernetes, в котором установлена система.

  • S3-совместимое хранилище для хранения резервных копий, например: MinIO, AWS S3, Yandex Object Storage.

  • Остановлены все приложения, которые записывали данные в восстанавливаемую базу данных.

  • Доступ к утилитам kubectl, helm и evoctl.

Восстановление базы данных PostgreSQL

Доступны следующие сценарии восстановления базы данных PostgreSQL:

При восстановлении все текущие данные в базе данных будут удалены. Рекомендуется предварительно проверить восстановление на тестовом кластере.

Восстановление из последней резервной копии

Чтобы восстановить базу данных:

  1. Подключитесь к кластеру, в котором развернута база данных.

  2. Запустите процесс восстановления, выполнив команду:

    helm upgrade postgresql /opt/r-vision/infra/helm/postgresql \
      --reuse-values \
      --set backupWrapper.restore.enabled=true --set primary.replicaCount=0 \
      --set backupWrapper.restore.cleanDataDir=true \
      --timeout 30m
    После применения команды все текущие данные в базе данных PostgreSQL будут удалены.
    Если у вас большое количество данных, рекомендуется увеличить значение параметра --timeout.
  3. После восстановления базы данных запустите под PostgreSQL и уберите флаги восстановления. Для этого выполните команду:

    helm upgrade postgresql /opt/r-vision/infra/helm/postgresql \
      --reuse-values \
      --set primary.replicaCount=1 \
      --set backupWrapper.restore.enabled=false
  4. Дождитесь восстановления пода базы данных PostgreSQL.

Восстановление из конкретной резервной копии

Чтобы восстановить базу данных:

  1. Подключитесь к кластеру, в котором развернута база данных.

  2. Посмотрите список резервных копий, выполнив команду:

    kubectl exec -it <postgresql> -c backup-wrapper -- wal-g backup-list

    Здесь:

    • <postgresql> — имя пода, на котором развернута база данных PostgreSQL. Например, postgresql-0.

  3. Восстановите базу данных, выполнив команду:

    helm upgrade <postgresql> . --reuse-values \
      --set primary.replicaCount=0 \
      --set backupWrapper.restore.enabled=true \
      --set backupWrapper.restore.backupName=<backup_name> \
      --timeout 30m
    После применения команды все текущие данные в базе данных PostgreSQL будут удалены.
    Если у вас большое количество данных, рекомендуется увеличить значение параметра --timeout.

    Здесь:

    • <postgresql> — имя пода, на котором развернута база данных PostgreSQL. Например, postgresql-0.

    • <backup_name> — название резервной копии, например, base_000000010000000000000005.

  4. После восстановления запустите под PostgreSQL и уберите флаги восстановления. Для этого выполните команду:

    helm upgrade <postgresql> --reuse-values \
      --set primary.replicaCount=1 \
      --set backupWrapper.restore.enabled=false

    Здесь:

    • <postgresql> — имя пода, на котором развернута база данных PostgreSQL. Например, postgresql-0.

  5. Дождитесь восстановления пода базы данных PostgreSQL.

Восстановление базы данных ClickHouse

При восстановлении все текущие данные в базе данных будут удалены. Рекомендуется предварительно проверить восстановление на тестовом кластере.

Чтобы восстановить базу данных:

  1. Подключитесь к кластеру, в котором развернута база данных.

  2. Укажите переменные окружения для задачи (job) восстановления, выполнив команду:

    JOB_NAME="restore-ch-$(date +%s)"
    NAMESPACE="<namespace>"

    Здесь:

    • <namespace> — название пространства имен, в котором установлена система.

  3. Создайте новую задачу из существующего контроллера CronJob, выполнив команду:

    kubectl get cronjob clickhouse-backup-shard0 -n "$NAMESPACE" -o json | \
      jq --arg name "$JOB_NAME" '{
        apiVersion: "batch/v1",
        kind: "Job",
        metadata: {name: $name, namespace: .metadata.namespace},
        spec: .spec.jobTemplate.spec
      }
      | .spec.template.spec.containers[0].command = ["/bin/sh", "-c", "echo READY && sleep 7200"]
      | .spec.template.spec.containers[0].args = []
      | .spec.activeDeadlineSeconds = 7200
      | .spec.template.spec.restartPolicy = "Never"
      ' | kubectl apply -n "$NAMESPACE" -f -
  4. Дождитесь запуска задания (job). Для отслеживания статуса выполните команду:

    kubectl wait --for=condition=Ready pod -l "job-name=$JOB_NAME" \
      -n "$NAMESPACE" --timeout=120s
  5. Подключитесь к поду заданий (job), выполнив команду:

    kubectl exec -it -n "$NAMESPACE" "job.batch/$JOB_NAME" -- /bin/sh
  6. Задайте в переменной S3_PATH путь до директории S3-совместимого хранилища, где хранятся резервные копии. Для этого выполните команду:

    export S3_PATH="<path_to_backups>"

    Здесь:

    • <path_to_backups> — путь до директории S3-совместимого хранилища с резервными копиями. Например, backups/clickhouse/shard0/2026/02/09.

  7. Откройте список доступных резервных копий, выполнив команду:

    clickhouse-backup list remote
  8. Восстановите базу данных, выполнив команду:

    clickhouse-backup restore_remote <backup_name>

    Здесь:

    • <backup_name> — название резервной копии.

    После применения команды все текущие данные в базе данных ClickHouse будут удалены.

    Для восстановления конкретной таблицы в базе данных выполните команду:

    clickhouse-backup restore_remote <backup_name> --tables "<database>.<table_pattern>"

    Здесь:

    • <backup_name> — название резервной копии.

    • <database> — название базы данных.

    • <table_pattern> — название или шаблон названия таблицы.

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

    clickhouse-backup list local
  10. После завершения отключитесь от пода, выполнив команду:

    exit
  11. Удалите задание (job) восстановления базы данных, выполнив команду:

    kubectl delete job "$JOB_NAME" -n "$NAMESPACE"

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

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