[Документация Yandex Cloud](../../index.md) > [Yandex Managed Service for Sharded PostgreSQL](../index.md) > Вопросы и ответы > Миграция

# Миграция данных в Managed Service for Sharded PostgreSQL

* [Можно ли шардировать по композитному ключу?](#composite-sharding-key)

* [Можно ли создать "шард по умолчанию" для непривязанных ключей?](#default-shard-for-unbound-keys)

* [Как добавить новый шард и перебалансировать данные?](#how-to-add-new-shard)

* [Как происходит перебалансировка данных при добавлении нового шарда?](#data-rebalancing-for-new-shard)

* [Как загружать большие объемы данных?](#how-to-upload-big-chunks-of-data)

* [Как ускорить миграцию больших объемов данных?](#how-to-improve-migration-of-big-chunks-of-data)

* [Что происходит при сбое во время миграции данных?](#data-migration-failure)

* [Как переименовать таблицу, сохранив ее доступность?](#how-to-rename-table-and-keep-it-available)

#### Можно ли шардировать по композитному ключу? {#composite-sharding-key}

Да. Для этого создайте композитный ключ:

```sql
CREATE DISTRIBUTION <имя_правила_шардирования> COLUMN TYPES integer, varchar;
ALTER DISTRIBUTION <имя_правила_шардирования> ATTACH RELATION orders DISTRIBUTION KEY user_id, order_date;
```

Подробнее о композитных ключах шардирования в [документации SPQR](https://docs.pg-sharding.tech/sharding/composite_keys).

#### Можно ли создать шард по умолчанию для непривязанных ключей? {#default-shard-for-unbound-keys}

Да. Для этого используйте команду:

```sql
ALTER DISTRIBUTION <имя_правила_шардирования> ADD DEFAULT SHARD <имя_шарда>;
```

Подробнее о шардах по умолчанию в [документации SPQR](https://docs.pg-sharding.tech/sharding/default_shard).

#### Как добавить новый шард и перебалансировать данные? {#how-to-add-new-shard}

1. [Создайте новый шард](../operations/shards.md#create-shard).
1. Используйте команду `SYNC REFERENCE TABLES` для копирования справочных таблиц.
1. Перераспределите диапазоны ключей. Используйте команды:
    * `SPLIT KEY RANGE` — чтобы разделить диапазон ключей.
    * `REDISTRIBUTE KEY RANGE` — чтобы перенести данные автоматически.

#### Как происходит перебалансировка данных при добавлении нового шарда? {#data-rebalancing-for-new-shard}

При добавлении нового шарда нужно запустить ручной перенос данных с помощью команды `REDISTRIBUTE KEY RANGE`. В этом случае Sharded PostgreSQL перемещает небольшие диапазоны данных, чтобы минимизировать недоступность кластера на запись.

#### Как загружать большие объемы данных? {#how-to-upload-big-chunks-of-data}

Для загрузки больших объемов данных доступны два варианта:

* `COPY` с виртуальным параметром `/* __spqr__allow_multishard: true */`.

    Например, для загрузки из CSV-файла:

    ```sql
    COPY <имя_таблицы> FROM 'data.csv' WITH DELIMITER ',' /* __spqr__allow_multishard: true */;
    ```

    {% note warning %}

    Использование `COPY` может приводить к высокой нагрузке на роутер. Если вы регулярно используете `COPY`, рекомендуется создать для этой задачи отдельный роутер.

    {% endnote %}

* Одновременная вставка нескольких строк в таблице (batch insert) с виртуальным параметром `/* __spqr__engine_v2: true */`. В таком случае роутер анализирует каждую строку, определяет целевой шард на основе ключа шардирования и преобразовывает запрос в отдельные команды `INSERT` для каждого шарда.

    Например, команда:

    ```sql
    INSERT INTO users (id, name) VALUES
      (1, 'Alice'),      -- отправляется на шард sh1
      (100, 'Bob'),      -- отправляется на шард sh2
      (2, 'Charlie')     -- отправляется на шард sh1
    /* __spqr__engine_v2: true */;
    -- NOTICE: send query to shard(s) : sh1,sh2
    ```

    будет преобразована в:

    * `INSERT INTO users (id, name) VALUES (1, 'Alice'), (2, 'Charlie');` для шарда `sh1`.
    * `INSERT INTO users (id, name) VALUES (100, 'Bob');` для шарда `sh2`.

Виртуальные параметры можно задавать комментариями в SQL или через `SET`.

Подробнее о вставке больших объемов данных в [документации SPQR](https://docs.pg-sharding.tech/sharding/bulk).

#### Как ускорить миграцию больших объемов данных? {#how-to-improve-migration-of-big-chunks-of-data}

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

#### Что происходит при сбое во время миграции данных? {#data-migration-failure}
Sharded PostgreSQL обеспечивает атомарность на уровне диапазона. При сбое данные могут временно находиться на обоих шардах. Операция будет отменена или возобновлена после восстановления.

#### Как переименовать таблицу, сохранив ее доступность? {#how-to-rename-table-and-keep-it-available}

Выполните последовательность `ALTER TABLE` в одной транзакции. Для включения этой возможности используйте виртуальный параметр `/* __spqr__multishard_ddl: true */`.

```sql
ALTER TABLE ... /* __spqr__multishard_ddl: true */;
```

{% note warning}

Действие не транзакционно. Переименование таблиц требует осторожности.

{% endnote %}

Виртуальные параметры можно задавать комментариями в SQL или через `SET`.