---
metadata:
  - name: generator
    content: Diplodoc Platform v5.63.0
alternate:
  - en/cookbook/migrations
  - ru/cookbook/migrations
  - href: ru/cookbook/migrations.md
    type: text/markdown
    title: Markdown version
csp:
  - script-src:
      - https://mc.yandex.ru
    img-src:
      - https://mc.yandex.ru
    connect-src:
      - https://mc.yandex.ru
      - wss://mc.yandex.ru
    child-src:
      - 'blob:'
      - https://mc.yandex.ru
    frame-src:
      - 'blob:'
      - https://mc.yandex.ru
    frame-ancestors:
      - 'blob:'
      - https://mc.yandex.ru
canonical: ru/cookbook/migrations.html
title: Миграция и резервное копирование в DataLens On-premises
description: "Из статьи вы узнаете, как выполнить резервное копирование, восстановление и\_миграцию в DataLens On-premises."
vcsPath: ru/cookbook/migrations.md
---

# Миграция и резервное копирование

## Два подхода к переносу данных {#migration-methods}

**Резервное копирование и восстановление (полное)**. Создание полной копии **метаданных** всей системы. Используется для Disaster Recovery (восстановления после сбоя) или для клонирования среды (например, dev → test).

**Экспорт и импорт (частичный)**. Это перенос отдельных **объектов** (воркбуков с их содержимым). Используется для переноса готовых отчетов между средами (например, test → prod) или для миграции из облака.

## Резервное копирование и восстановление БД PostgreSQL {#dump-restore}

Вся конфигурация DataLens (пользователи, дашборды, права) хранится в служебной базе PostgreSQL. Бэкап этой БД — это и есть бэкап всей системы. Скрипт `./init.sh` предоставляет для этого удобные команды:

* **Создать бэкап:**

    ```shell
    ./init.sh --dump-postgres 
    ```

    Эта команда создаст SQL-дамп базы данных и выведет его в `stdout`, который перенаправляется в файл. Регулярное выполнение этой команды — основа стратегии бэкапов.

* **Восстановить из бэкапа:**

    ```shell
    ./init.sh --restore-postgres datalens_enterprise_<...>.dump
    ```

    Эта команда развернет данные из указанного SQL-файла в базу данных.

    Восстановление БД не возвращает удаленные воркбуки, поскольку флаги `is_deleted` не перезаписываются.

    Бэкап нужен, например, при переносе DataLens на другой сервер или возникновении инцидентов с БД. Для возвращения удаленных воркбуков используйте следующий способ.

* **Восстановить из бэкапа с полной предварительной очисткой старых объектов в базе данных:**

    ```shell
    ./init.sh --restore-postgres-with-clear datalens_enterprise_<...>.dump
    ```

### Важность `CONTROL_API_CRYPTO_KEY` {#api-crypto-key}

При восстановлении из бэкапа на **новой** инсталляции DataLens есть критичный нюанс. Пароли и токены в подключениях зашифрованы ключом `CONTROL_API_CRYPTO_KEY`, который сбросится при бэкапе, и DataLens не сможет расшифровать старые секреты. Все подключения перестанут работать — нужно будет указывать пароли заново.

При миграции через бэкап и восстановление важно перенести не только дамп БД, но и значение `CONTROL_API_CRYPTO_KEY` из секрета Kubernetes старой системы в новую. Для этого используйте команду:

```shell
./init.sh --kubectl get secret datalens-enterprise-secrets -o jsonpath='{.data.CONTROL_API_CRYPTO_KEY}' | base64 -d; echo
```

### Что делать, если случайно удалили воркбук {#workbook-restore}

Поскольку бэкапирование через `--restore-postgres` не восстанавливает удаленные воркбуки, вам может понадобиться восстановить воркбук, который удалили случайно.

Для этого есть вспомогательные команды:

```shell
# Выполните эту команду, чтобы вернуть список удаленных воркбуков
./init.sh --pg sh -c 'psql -U "${POSTGRES_USER}" -d "${POSTGRES_DB_US}" -c "SELECT encode_id(workbook_id) AS workbook_id, title, deleted_at FROM workbooks WHERE deleted_at IS NOT NULL"'
```

```shell
# Узнав нужный ID воркбука, подставьте его в команду ниже для восстановления (вместо <WORKBOOK_ID>)
./init.sh --kubectl exec -it deploy/datalens-enterprise-us -- node -e "fetch('http://localhost:8080/private/v2/workbooks/<WORKBOOK_ID>/restore',{method:'POST',headers:{'content-type':'application/json','x-us-master-token':process.env.MASTER_TOKEN}}).then(r=>r.json()).then(console.log)"
```

### Экспорт и импорт воркбуков {#workbook-export-import}

Этот механизм предназначен для переноса конкретного контента. Он требует, чтобы на обеих инсталляциях была включена функция `export`. Процесс выглядит следующим образом.

1. **На исходной системе**

    Пользователь с правами на воркбук выбирает опцию **Экспортировать**. DataLens формирует ZIP-архив со всеми объектами внутри воркбука.

1. **На целевой системе**

    Пользователь с ролью администратора или редактора выбирает **Импортировать** и загружает полученный архив.

### Сценарий миграции: Yandex Cloud → On-premises {#install-migration}

Это частая задача, если компания переносит аналитику в свой контур. Поскольку прямого доступа к служебной БД облачного DataLens нет, используется метод экспорта и импорта.

**План миграции:**

1. **Подготовка**

    Развернуть и настроить DataLens On-premises, включая авторизацию и сетевые доступы к источникам данных.

1. **Экспорт**

    В облачном DataLens последовательно экспортировать необходимые воркбуки в JSON-файлы.

1. **Импорт**

    В On-premises-окружении импортировать полученные JSON-файлы.

1. **Проверка подключений**

    Открыть воркбуки и проверить, что подключения работают, если нет — отредактировать. Проверить сетевую доступность, сертификаты и адрес до баз данных.

1. **Перепривязка**

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

## Кейс {#case-example}

Администратор случайно удалил важный воркбук. У него есть свежий дамп базы данных, сделанный до удаления. Он выполняет команду `./init.sh --restore-postgres datalens_enterprise_<...>.dump`, но воркбук по-прежнему не появляется. Почему?

* Дамп поврежден или создан после удаления воркбука.
* Для восстановления нужно предварительно перенести `CONTROL_API_CRYPTO_KEY` из дампа, иначе объекты не расшифровываются и не отображаются.
* Команда `--restore-postgres` не перезаписывает флаги `is_deleted`.
* Нужно дополнительно выполнить `./init.sh --restore-postgres-with-clear` для каждого удаленного воркбука отдельно.

{% cut "Узнать ответ" %}

* Дамп поврежден или создан после удаления воркбука.

    Неверно. По условию задачи дамп свежий и создан до удаления. Проблема не в дампе.

* Для восстановления нужно предварительно перенести `CONTROL_API_CRYPTO_KEY` из дампа, иначе объекты не расшифровываются и не отображаются.

    Неверно. Ключи `CONTROL_API_CRYPTO_KEY` влияют на расшифровку паролей в подключениях, но не на видимость или наличие воркбуков.

* Команда `--restore-postgres` не перезаписывает флаги `is_deleted`.

    Верно. Восстановление через `--restore-postgres` не возвращает удалённые воркбуки, так как флаги `is_deleted` не перезаписываются. Для этого случая нужно использовать `--restore-postgres-with-clear` или команду точечного восстановления конкретного воркбука по его ID.

* Нужно дополнительно выполнить `./init.sh --restore-postgres-with-clear` для каждого удаленного воркбука отдельно.

    Неверно. Команда `--restore-postgres-with-clear` применяется ко всей базе данных целиком, а не к отдельным воркбукам. Для точечного восстановления конкретного воркбука существует отдельная процедура.

{% endcut %}

## Итоги {#results}

Вы освоили критически важные навыки: резервное копирование, восстановление и миграцию. Теперь вы умеете развертывать, настраивать DataLens On-premises и обеспечивать его стабильную работу в долгосрочной перспективе.
