procopy

procopy — консольная утилита для высокопроизводительной загрузки данных из базы данных-источника в приёмник

Синтаксис

procopy config generate [параметр...]

procopy load [параметр...]

Описание #

procopy — это утилита для быстрой загрузки данных из баз данных-источников, таких как Oracle, PostgreSQL, MySQL и другие, в базы данных-приёмники, такие как PostgreSQL, Postgres Pro Enterprise и т.д. Список поддерживаемых источников и приёмников приведён в Таблице 4.1.

procopy не отвечает за:

  • Перенос схемы базы данных.

  • Проигрывание изменений, произошедших в ходе загрузки данных.

  • Сохранение целостности данных. Поэтому рекомендуется, по возможности, временно удалить существующие ограничения и восстановить их после завершения работы prosync.

  • Проверку данных после миграции.

procopy разработана на языке Go для эффективного использования ресурсов при миграции баз данных объёмом от 10 ТБ и более. На высоком уровне procopy представляет собой пул считывателей, пул загрузчиков и встроенную шину для обмена данными между считывателями и загрузчиками:

Рекомендуемые драйверы #

Рекомендуется использовать драйверы, реализованные на языке Pure Go, чтобы избежать проблем с кроссплатформенной совместимостью утилиты. В частности, рекомендуется использовать следующие драйверы:

Важные замечания #

  • Поскольку для команды COPY используется двоичный формат загрузки, добавление новых типов данных требует наличия соответствующих кодировщиков.

  • Загрузка объектов типов BLOB и BFILE выполняется медленнее по сравнению с другими типами данных, поскольку для каждой строки требуется как минимум два SQL-запроса. Это значительно медленнее, чем просто использование команды COPY.

Ограничения #

  • procopy не поддерживает представления и материализованные представления в качестве источника.

Использование #

В процессе работы ProGate выполняются задачи различных типов. Задача может относиться к типу Query, Schema или Table. Раздел tasks файла конфигурации позволяет настраивать задачи утилиты procopy.

Типы задач #

  • Table (таблица).

    Задачи данного типа предназначены для загрузки данных из конкретной таблицы с возможностью задания фильтрации и сопоставления столбцов.

  • Schema (схема).

    Задачи данного типа предназначены для переноса всех объектов схемы с возможностью фильтрации и сопоставления таблиц.

  • Query (запрос).

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

    Важно

    В procopy задачи типа Query (запрос) имеют ограничения: после перезапуска их выполнение не возобновляется.

Создание начального файла конфигурации #

Чтобы создать файл конфигурации, выполните команду config-generate. Позже вы сможете изменить параметры конфигурации вручную. Структура файла конфигурации описана в Разделе 5.2.

Запуск загрузки данных из базы данных-источника в базу данных-приёмник #

Чтобы запустить загрузку данных из источника в приёмник, выполните команду load, указав файл конфигурации.

При запуске загрузки данных файл конфигурации проверяется следующим образом:

  • Если указаны некорректные имена параметров конфигурации, procopy завершается ошибкой.

  • Проверяются значения параметров конфигурации (например, корректность IP-адресов и имён хостов).

  • Если заданы не все обязательные параметры, procopy завершается ошибкой.

  • Если заданы несовместимые параметры конфигурации, procopy завершается ошибкой.

Остановка procopy #

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

Чтобы остановить работающую procopy, нажмите Ctrl+C. Однократное нажатие Ctrl+C запускает корректное завершение работы: утилита завершает выполнение и сохраняет всю информацию, необходимую для последующего возобновления. Этот процесс может занять несколько минут. Повторное нажатие Ctrl+C приводит к принудительной остановке. При следующем запуске в этом случае возможны многочисленные ошибки «unique constraint violation» (нарушение ограничения уникальности). Несмотря на это, procopy продолжит выполнение, однако восстановление может занять значительное время.

Обработка ошибок #

Если по какой-либо причине procopy не может применить строку, она сохраняет её ключ и сообщение об ошибке в CSV-файл <task_id>_index.csv в каталоге problem_rows.local.save_dir/<timestamp>. Если параметр problem_rows.local.save_dir не задан, используется каталог /tmp/<timestamp>/*.csv.

По умолчанию проблемные строки пропускаются, однако на практике такой подход чаще всего оказывается неприемлемым. В подобных случаях можно настроить параметр procopy_options, указав, где сохранять пакеты с проблемными строками, с помощью следующей настройки:

{
  "version": 1,
  "procopy_options": {
    "problem_rows": {
      "local": {
        "save_dir": "path_to_save_dir"
      }
    }
  }
}

При возникновении ошибки, которая приводит к сбою в работе procopy, диагностическая информация сохраняется в файл Procopy_panic_data_<текущее_время>.tar.gz.

Повторная загрузка проблемных строк #

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

procopy load --file filename --reload-from TIMESTAMP

Здесь TIMESTAMP — имя каталога, в котором хранятся файлы-индексы для проблемных строк.

Примечание

Повторной загрузке подлежат только строки из файлов *_index.csv. Новые строки, добавленные в таблицы после сохранения этих файлов, обработаны не будут.

Если опять возникают ошибки, будут созданы новые файлы *_index.csv в каталоге с новой меткой времени TIMESTAMP.

Возобновление загрузки #

Утилита procopy поддерживает возобновление загрузки данных с точки последней остановки для задач типа Schema (схема), а также для задач типа Table (таблица), если соответствующие таблицы имеют ключи.

Если задача типа Query (запрос) не была завершена, её выполнение нельзя возобновить. Перед повторной загрузкой необходимо выполнить команду TRUNCATE.

В случае незавершённой задачи типа Table для таблицы без ключей (кучи) перед повторной загрузкой следует выполнить команду TRUNCATE, чтобы избежать дублирования строк.

Если параметр procopy_options.truncate имеет значение true или для конкретной задачи truncate установлен в true, соответствующая таблица будет очищена и загрузка данных начнётся с нуля.

Настройка параллелизма загрузки #

Распараллеливание процесса загрузки достигается за счёт:

  • настройки процессов чтения и записи,

  • настройки разделения задач на подзадачи,

  • обработки секционированных таблиц.

Установите глобальные ограничения на количество потоков для чтения данных из источника и их загрузки в приёмник в параметрах конфигурации procopy_options.readers и procopy_options.loaders соответственно. По умолчанию оба параметра равны NumCPU/2.

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

Для каждой секции секционированной таблицы создаётся отдельная задача.

Настройка задач типа Table #

Параметры, относящиеся к задачам этого типа, задаются в разделе tasks.table файла конфигурации. Например:

tasks:
    - id: tab1
      table:
        source_table: source_table
        destination_table: destination_table
        exclude_columns:
            - field4
        include_columns:
            - field1
            - field2
            - field3
            - field4
        column_mapping:
            field1: field2
            field2: field1
        where: (COL1 IS NULL OR COL1 > 10) AND COL2 <> 'value'
      batch_bytes: 976.6KiB
      truncate: false
      transform:
        field1:
            null_to_value: ""
        field2:
            values_to_null:
                - "NULL"
                - NULL_VAL
                - INVALID
        field3:
            null_char_replace: "\n"
      snapshot_id: null

Чтобы настроить задачи типа Table (таблица), определите столбцы, которые в итоге будут загружены в таблицу в приёмнике:

  • Для загрузки только выбранных столбцов используйте параметр include_columns. По умолчанию загружаются все столбцы.

  • Для исключения столбцов из загрузки используйте параметр exclude_columns.

  • Для переименования загружаемых столбцов используйте параметр column_mapping.

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

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

Настройка задач типа Schema #

Параметры, относящиеся к задачам этого типа, задаются в разделе tasks.schema файла конфигурации. Например:

tasks:
    - id: schema_task
      schema:
        source_schema: schema1
        destination_schema: schema2
        exclude_tables:
            - TABLE1
        include_tables:
            - TABLE1
            - TABLE2
            - TABLE2
        table_mapping:
            TABLE2: main_table
      batch_bytes: 976.6KiB
      truncate: false
      snapshot_id: null

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

  • Для загрузки только выбранных таблиц используйте параметр include_tables. По умолчанию загружаются все таблицы.

  • Для исключения таблиц из загрузки используйте параметр exclude_tables.

  • Для переименования загружаемых таблиц используйте параметр table_mapping.

Настройка задач типа Query #

Задачи типа Query (запрос) загружают в приёмник данные, полученные в результате выполнения запроса в источнике. Параметры, относящиеся к задачам этого типа, задаются в разделе tasks.query файла конфигурации. Например:

tasks:
    - id: tab2
      query:
        sql: SELECT id, name FROM users ORDER BY id
        destination_table: users_table
        destination_columns:
            - id
            - login
      batch_bytes: 976.6KiB
      truncate: false
      snapshot_id: null

При настройке задач типа Query в параметре tasks.query.destination_columns перечислите столбцы в том же порядке, в котором они указаны в запросе.

Настройка задач с указанием снимка #

В задачах, загружающих данные из PostgreSQL/Postgres Pro, можно указать снимок, для которого будет выполняться загрузка данных. Для этого выполните следующие шаги:

  1. В источнике начните транзакцию с уровнем изоляции REPEATABLE READ.

  2. Получите идентификатор снимка с помощью запроса

    SELECT pg_export_snapshot()
  3. В разделе файла конфигурации, соответствующем данной задаче, установите полученное значение для параметра snapshot_id.

Пример фрагмента файла конфигурации для данной задачи может выглядеть следующим образом:

tasks:
- id: query_task
  query:
    sql: SELECT id, name FROM users ORDER BY id
    destination_table: users_table
    destination_columns:
        - id
        - login
  batch_bytes: 1000000
  truncate: false
  snapshot_id: 00000006-0000000000002007-1

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

Для автоматического создания снимка при запуске загрузки данных задайте для параметра конфигурации procopy_options.enable_auto_snapshot значение true.

Перенос объектов типа BFILE #

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

Справка по командной строке #

В этом разделе описываются команды procopy. Необязательные параметры заключены в квадратные скобки.

config generate #

procopy config generate [-f|--format json|yaml] [-o|--output имя_файла]

Генерирует файл конфигурации для procopy.

-f json|yaml
--format json|yaml

Указывает формат файла конфигурации: JSON или YAML. По умолчанию используется YAML.

-o имя_файла
--output имя_файла

Указывает имя файла конфигурации. По умолчанию файл выводится в стандартный поток вывода (stdout).

load #

load -f|--file имя_файла [--log-level error|warn|info|debug]
[-s|--queue-size число_пакетов] [-q|--quiet]
[-r|--reload-from метка_времени] [--dry-run|--read-only]

Запускает загрузку данных между базами данных.

-f имя_файла
--file имя_файла

Имя файла конфигурации. Обязательный параметр.

--log-level error|warn|info|debug

Уровень ведения журнала. По умолчанию используется уровень info.

Важно

Слишком подробное ведение журнала может негативно сказаться на производительности. Уровень debug рекомендуется включать только при расследовании ошибок.

-s число_пакетов
--queue-size число_пакетов

Размер очереди между считывателями и загрузчиками, используемой procopy. По умолчанию — 128.

Важно

Это значение может чрезмерно увеличить объём используемой памяти. Обычно достаточно установить его равным NumLoaders × 2. Если при загрузке данных в приёмник procopy начинает замедляться, объём памяти может превысить число_пакетов × batch_bytes байт.

-q
--quiet

Отключает вывод информации о ходе выполнения procopy.

-r метка_времени
--reload-from метка_времени

Запускает повторную загрузку проблемных строк. Значение метка_времени указывает на метку времени одного из предыдущих запусков загрузки. Если этот параметр задан, procopy попытается загрузить только те строки, с которыми ранее возникли ошибки при загрузке с указанной меткой времени метка_времени. Узнать значение этой метки можно из журналов или найти соответствующий каталог в директории, заданной в параметре конфигурации problem_rows.local.save_dir.

--dry-run

Отключает запись в приёмник. procopy выполнит все операции, кроме самой записи. Этот флаг полезен для оценки производительности операции записи.

--read-only

Отключает выполнение всех операций procopy, кроме чтения из источника. Используется для анализа производительности чтения.