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, чтобы избежать проблем с кроссплатформенной совместимостью утилиты. В частности, рекомендуется использовать следующие драйверы:
Oracle:
go-ora, https://github.com/sijms/go-oraPostgreSQL:
pgx, https://github.com/jackc/pgx
Важные замечания #
Поскольку для команды
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, можно указать снимок, для которого будет выполняться загрузка данных. Для этого выполните следующие шаги:
В источнике начните транзакцию с уровнем изоляции
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. Необязательные параметры заключены в квадратные скобки.
config generate #
procopy config generate [-f|--formatjson|yaml] [-o|--outputимя_файла]
Генерирует файл конфигурации для procopy.
-fjson|yaml--formatjson|yamlУказывает формат файла конфигурации: JSON или YAML. По умолчанию используется YAML.
-oимя_файла--outputимя_файлаУказывает имя файла конфигурации. По умолчанию файл выводится в стандартный поток вывода (stdout).
load #
load -f|--fileимя_файла[--log-levelerror|warn|info|debug] [-s|--queue-sizeчисло_пакетов] [-q|--quiet] [-r|--reload-fromметка_времени] [--dry-run|--read-only]
Запускает загрузку данных между базами данных.
-fимя_файла--fileимя_файлаИмя файла конфигурации. Обязательный параметр.
--log-levelerror|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, кроме чтения из источника. Используется для анализа производительности чтения.