[Документация Yandex Cloud](../../index.md) > [Практические руководства](../index.md) > [Построение Data Platform](index.md) > Перенос данных из Object Storage в Managed Service for MySQL® с использованием Data Transfer

# Миграция данных из Yandex Object Storage в Yandex Managed Service for MySQL® с помощью Yandex Data Transfer

# Миграция данных из Object Storage в кластер Yandex Managed Service for MySQL® с помощью Yandex Data Transfer


С помощью сервиса Data Transfer вы можете перенести данные из объектного хранилища Object Storage в кластер-приемник Managed Service for MySQL®.

Чтобы перенести данные:

1. [Подготовьте тестовые данные](#prepare-data).
1. [Подготовьте и активируйте трансфер](#prepare-transfer).
1. [Проверьте работоспособность трансфера](#verify-transfer).

Если созданные ресурсы вам больше не нужны, [удалите их](#clear-out).


## Необходимые платные ресурсы {#paid-resources}

* Бакет Object Storage: использование хранилища и выполнение операций с данными ([тарифы Object Storage](../../storage/pricing.md)).
* Кластер Managed Service for MySQL®: выделенные хостам вычислительные ресурсы, объем хранилища и резервных копий ([тарифы Managed Service for MySQL®](../../managed-mysql/pricing.md)).
* Публичные IP-адреса, если для хостов кластера включен публичный доступ ([тарифы Virtual Private Cloud](../../vpc/pricing.md)).


## Перед началом работы {#before-you-begin}

Подготовьте инфраструктуру:

{% list tabs group=resources %}

- Вручную {#manual}

    1. [Создайте бакет Yandex Object Storage](../../storage/operations/buckets/create.md).

    
    1. [Создайте сервисный аккаунт](../../iam/operations/sa/create.md#create-sa) с именем `storage-viewer` и ролью `storage.viewer`. Трансфер будет использовать его для доступа к бакету.
    1. [Создайте статический ключ доступа](../../iam/operations/authentication/manage-access-keys.md#create-access-key) для сервисного аккаунта `storage-viewer`.


    1. [Создайте кластер-приемник Managed Service for MySQL®](../../managed-mysql/operations/cluster-create.md) любой подходящей конфигурации со следующими настройками:

        * **Имя БД** — `db1`.
        * **Имя пользователя** — `mmy-user`.
        * **Пароль** — `<пароль_пользователя>`.

    1. [Назначьте пользователю MySQL® роль](../../managed-mysql/operations/grant.md#grant-role) `ALL_PRIVILEGES` для базы-приемника.

- Terraform {#tf}

    1. Если у вас еще нет Terraform, [установите его](../infrastructure-management/terraform-quickstart.md#install-terraform).
    1. [Получите данные для аутентификации](../infrastructure-management/terraform-quickstart.md#get-credentials). Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера.
    1. [Настройте и инициализируйте провайдер](../infrastructure-management/terraform-quickstart.md#configure-provider). Чтобы не создавать конфигурационный файл с настройками провайдера вручную, [скачайте его](https://github.com/yandex-cloud-examples/yc-terraform-provider-settings/blob/main/provider.tf).
    1. Поместите конфигурационный файл в отдельную рабочую директорию и [укажите значения параметров](../infrastructure-management/terraform-quickstart.md#configure-provider). Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.

    1. Скачайте в ту же рабочую директорию файл конфигурации [data-transfer-objs-mmy.tf](https://github.com/yandex-cloud-examples/yc-data-transfer-from-object-storage-to-mysql/tree/master/data-transfer-objs-mmy.tf).

        В этом файле описаны:

        * [сеть](../../vpc/concepts/network.md#network);
        * [подсеть](../../vpc/concepts/network.md#subnet);
        * [группа безопасности](../../vpc/concepts/security-groups.md) и правило, необходимое для подключения к кластеру Managed Service for MySQL®;
        * сервисный аккаунт, который будет использоваться для создания бакета и дальнейшего доступа к нему;
        * секрет Yandex Lockbox, в котором будет храниться статический ключ сервисного аккаунта для настройки эндпоинта-источника;
        * бакет-источник Object Storage;
        * кластер-приемник Managed Service for MySQL®;
        * эндпоинт для приемника;
        * трансфер.

    1. Укажите в файле `data-transfer-objs-mmy.tf`:

        * `folder_id` — [идентификатор каталога](../../resource-manager/operations/folder/get-id.md), в котором будут созданы ресурсы.
        * `bucket_name` — имя бакета в соответствии с [правилами именования](../../storage/concepts/bucket.md#naming).
        * `mmy_password` — пароль пользователя MySQL®.

    1. Проверьте корректность файлов конфигурации Terraform с помощью команды:

        ```bash
        terraform validate
        ```

        Если в файлах конфигурации есть ошибки, Terraform на них укажет.

    1. Создайте необходимую инфраструктуру:

        1. Выполните команду для просмотра планируемых изменений:
        
           ```bash
           terraform plan
           ```
        
           Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
        
        1. Если вас устраивают планируемые изменения, внесите их:
           1. Выполните команду:
        
              ```bash
              terraform apply
              ```
        
           1. Подтвердите изменение ресурсов.
           1. Дождитесь завершения операции.

        В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в [консоли управления](https://console.yandex.cloud).

{% endlist %}

## Подготовьте тестовые данные {#prepare-data}

1. Создайте на рабочей машине текстовый файл `data.csv` и наполните его тестовыми данными. В качестве примера используются показатели датчиков автомобиля:

    ```csv
    1;99101;2022-06-05 17:27:00;55.70329032;37.65472196;427.5;52.3;23.5;17.;52.
    2;95106;2022-06-06 09:49:54;55.71294467;37.66542005;429.13;55.5;21.;18.;32.
    3;117890;2023-06-07 06:21:29;55.71294467;37.66542005;429.13;56.2;20.;18.7;45.
    4;99101;2022-06-07 08:15:32;55.29194467;37.66542005;429.13;59.1;21.;18.;20.
    ```

1. [Загрузите](../../storage/operations/objects/upload.md#simple) файл в созданный ранее бакет Object Storage.

## Подготовьте и активируйте трансфер {#prepare-transfer}

1. [Создайте эндпоинт для источника](../../data-transfer/operations/endpoint/index.md#create) со следующими настройками:

    * **Тип базы данных** — `Object Storage`.
    * **Бакет** — имя бакета в Object Storage.

    
    * **Идентификатор ключа доступа AWS** — открытая часть статического ключа сервисного аккаунта. Если вы создали инфраструктуру с помощью Terraform, [скопируйте значение ключа из секрета Yandex Lockbox](../../lockbox/operations/secret-get-info.md#secret-contents).
    * **Секретный ключ доступа AWS** — закрытая часть статического ключа сервисного аккаунта. Если вы создали инфраструктуру с помощью Terraform, [скопируйте значение ключа из секрета Yandex Lockbox](../../lockbox/operations/secret-get-info.md#secret-contents).


    * **Эндпоинт** — `https://storage.yandexcloud.net`.
    * **Регион** — `ru-central1`.
    * **Формат данных** — `CSV`.
    * **Разделитель** — знак точки с запятой `;`.
    * **Таблица** — `measurements`.
    * **Добавить системные колонки** — выключите опцию.
    * **Схема результирующей таблицы** — выберите `Вручную` и укажите имена полей и тип данных:

        * `id`: `INT64`, признак **Ключ**;
        * `device_id`: `INT32`;
        * `datetime`: `DATETIME`;
  
           {% note info %}

           Эндпоинт-приемник записывает данные с типом `DATETIME` в часовом поясе UTC+0.

           {% endnote %}

        * `latitude`: `DOUBLE`;
        * `longitude`: `DOUBLE`;
        * `altitude`: `DOUBLE`;
        * `speed`: `DOUBLE`;
        * `battery_voltage`: `DOUBLE`;
        * `cabin_temperature`: `DOUBLE`;
        * `fuel_level`: `DOUBLE`.

    Остальные параметры оставьте по умолчанию.

1. Создайте эндпоинт для приемника и трансфер:

    {% list tabs group=resources %}

    - Вручную {#manual}

        1. [Создайте эндпоинт для приемника](../../data-transfer/operations/endpoint/target/postgresql.md):

            * **Тип базы данных** — `MySQL`.
            * **Параметры эндпоинта**:

              * **Настройки подключения**:
                * **Тип подключения** — `Кластер Managed Service for MySQL`.

                   Выберите кластер-источник из списка и укажите настройки подключения к нему.

        1. [Создайте трансфер](../../data-transfer/operations/transfer.md#create) типа **_Копирование и репликация_**, использующий созданные эндпоинты.
        1. [Активируйте](../../data-transfer/operations/transfer.md#activate) его.

    - Terraform {#tf}

        1. Укажите в файле `data-transfer-objs-mmy.tf` переменные:

            * `source_endpoint_id` — значение идентификатора эндпоинта для источника;
            * `transfer_enabled` – значение `1` для создания трансфера.

        1. Проверьте корректность файлов конфигурации Terraform с помощью команды:

            ```bash
            terraform validate
            ```

            Если в файлах конфигурации есть ошибки, Terraform на них укажет.

        1. Создайте необходимую инфраструктуру для трансфера:

            1. Выполните команду для просмотра планируемых изменений:
            
               ```bash
               terraform plan
               ```
            
               Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
            
            1. Если вас устраивают планируемые изменения, внесите их:
               1. Выполните команду:
            
                  ```bash
                  terraform apply
                  ```
            
               1. Подтвердите изменение ресурсов.
               1. Дождитесь завершения операции.

            Трансфер активируется автоматически после создания.

    {% endlist %}

## Проверьте работоспособность трансфера {#verify-transfer}

1. Дождитесь перехода трансфера в статус **Реплицируется**.
1. [Подключитесь к базе данных в кластере-приемнике Managed Service for MySQL®](../../managed-mysql/operations/connect/index.md).
1. Чтобы убедиться, что данные успешно перенесены, выполните запрос:

    ```sql
    SELECT * FROM db1.measurements;
    ```

    {% cut "Пример ответа" %}

    ```text
     id | device_id |     datetime        |  latitude | longitude | altitude | speed | battery_voltage | cabin_temperature | fuel_level
    ----------------+---------------------+-----------+-----------+----------+-------+-----------------+-------------------+----------+
      1 |     99101 | 2022-06-05T17:27:00 | 55.703289 |  37.66542 |   427.50 | 52.29 |            23.5 |              17.0 |     52.0 |
      2 |     95106 | 2022-06-06T09:49:54 | 55.712944 |  37.66542 |   429.13 | 55.50 |            21.0 |              18.0 |     32.0 |
      3 |    117890 | 2023-06-07T06:21:29 | 55.712944 |  37.66542 |   429.13 | 56.20 |            20.0 |              18.7 |     45.0 |
      4 |     99101 | 2022-06-05 17:27:00 | 55.291944 |  37.66542 |   429.13 | 59.09 |            21.0 |              18.0 |     20.0 |
    ```

    {% endcut %}

1. Создайте текстовый файл `data2.csv`, в котором содержатся новые данные:

    ```csv
    7;95106;2022-06-07 09:54:32;47.71294467;37.66542005;429.13;62.2;21.;20.4;27.
    9;117890;2022-06-07 11:56:27;52.71294467;37.66542005;429.13;65.5;19.;19.;38.
    10;117890;2022-06-07 12:36:27;57.71294467;37.66542005;429.13;72.1;19.;20.;25.
    11;99101;2022-06-07 15:22:27;59.71294467;37.66542005;429.13;35.5;19.;18.;12.
    ```

1. Загрузите файл в бакет Object Storage для трансфера.
1. Убедитесь, что в таблицу `db1.measurements` базы-приемника MySQL® добавились новые данные.

## Удалите созданные ресурсы {#clear-out}

{% note info %}

Перед тем как удалить созданные ресурсы, [деактивируйте трансфер](../../data-transfer/operations/transfer.md#deactivate).

{% endnote %}

Чтобы снизить потребление ресурсов, которые вам не нужны, удалите их:

1. [Удалите трансфер](../../data-transfer/operations/transfer.md#delete).
1. [Удалите эндпоинт](../../data-transfer/operations/endpoint/index.md#delete) для приемника.
1. Остальные ресурсы удалите в зависимости от способа их создания:

   {% list tabs group=resources %}

   - Вручную {#manual}

       1. [Удалите эндпоинт](../../data-transfer/operations/endpoint/index.md#delete) для источника.
       1. [Удалите бакет Object Storage](../../storage/operations/buckets/delete.md).
       1. [Удалите кластер Managed Service for MySQL®](../../managed-mysql/operations/cluster-delete.md).

       
       1. Если при создании эндпоинта для приемника вы создавали сервисный аккаунт, [удалите его](../../iam/operations/sa/delete.md).


   - Terraform {#tf}

       1. В терминале перейдите в директорию с планом инфраструктуры.
       
           {% note warning %}
       
           Убедитесь, что в директории нет Terraform-манифестов с ресурсами, которые вы хотите сохранить. Terraform удаляет все ресурсы, которые были созданы с помощью манифестов в текущей директории.
       
           {% endnote %}
       
       1. Удалите ресурсы:
       
           1. Выполните команду:
       
               ```bash
               terraform destroy
               ```
       
           1. Подтвердите удаление ресурсов и дождитесь завершения операции.
       
           Все ресурсы, которые были описаны в Terraform-манифестах, будут удалены.

   {% endlist %}