procopy — консольная утилита для высокопроизводительной загрузки данных из базы данных-источника в приёмник
procopy config generate [параметр...]
procopy load [параметр...]
procopy — это утилита для быстрой загрузки данных из баз данных-источников, таких как Oracle, PostgreSQL, MySQL и другие, в базы данных-приёмники, такие как PostgreSQL, Postgres Pro Enterprise и т.д. Список поддерживаемых источников и приёмников приведён в Таблице 4.1.
procopy не отвечает за:
Перенос схемы базы данных.
Проигрывание изменений, произошедших в ходе загрузки данных.
Сохранение целостности данных. Поэтому рекомендуется, по возможности, временно удалить существующие ограничения и восстановить их после завершения работы prosync.
Проверку данных после миграции.
procopy разработана на языке Go для эффективного использования ресурсов при миграции баз данных объёмом от 10 ТБ и более. На высоком уровне procopy представляет собой пул считывателей, пул загрузчиков и встроенную шину для обмена данными между считывателями и загрузчиками:

Поскольку для команды 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, нажмите 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, указав, где сохранять пакеты с проблемными строками, с помощью следующей настройки:
...
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, можно указать снимок, для которого будет выполняться загрузка данных. Для этого выполните следующие шаги:
В источнике начните транзакцию с уровнем изоляции REPEATABLE READ.
Получите идентификатор снимка с помощью запроса
SELECT pg_export_snapshot()
В разделе файла конфигурации, соответствующем данной задаче, установите полученное значение для параметра 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. Необязательные параметры заключены в квадратные скобки.
procopy config generate [-f|--formatjson|yaml] [-o|--outputимя_файла]
Генерирует файл конфигурации для procopy.
-f json|yaml--format json|yamlУказывает формат файла конфигурации: JSON или YAML. По умолчанию используется YAML.
-o имя_файла--output имя_файлаУказывает имя файла конфигурации. По умолчанию файл выводится в стандартный поток вывода (stdout).
load -f|--fileимя_файла[--log-levelerror|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, кроме чтения из источника. Используется для анализа производительности чтения.