Настройка процесса экспорта

Нижеописанные директивы напрямую влияют на процесс экспорта и дают возможность оптимально настроить его.

SKIP

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

  • fkeys: исключить ограничения внешнего ключа.
  • pkeys: исключить первичные ключи.
  • ukeys: исключить ограничения уникальности столбцов.
  • indexes: исключить все остальные типы индексов.
  • checks: исключить ограничения-проверки.
SKIP    indexes,checks

В примере выше из экспорта исключаются индексы и ограничения-проверки.

PKEY_IN_CREATE

Включите эту директиву, если необходимо добавить определение первичного ключа в оператор CREATE TABLE. Если директива отключена (по умолчанию), определение первичного ключа добавляется в оператор ALTER TABLE.

KEEP_PKEY_NAMES

По умолчанию имена первичных и уникальных ключей в исходной БД Oracle игнорируются, они генерируются автоматически в целевой БД Postgres Pro по соответствующим правилам именования. Если необходимо сохранить имена первичных и уникальных ключей из Oracle, задайте для этой директивы значение 1.

FKEY_ADD_UPDATE

Эта директива позволяет добавить параметр ON UPDATE CASCADE для внешнего ключа, когда есть ON DELETE CASCADE или всегда. Oracle не поддерживает эту функциональность, для добавления ON UPDATE CASCADE необходимо использовать триггер. Поскольку в Postgres Pro эта функциональность есть, можно выбрать метод добавления действия внешнего ключа. Для директивы доступны следующие значения:

  • never: внешние ключи объявляются так, как в Oracle.
  • delete: действие ON UPDATE CASCADE добавляется только, если для внешних ключей есть ON DELETE CASCADE.
  • always: внешние ключи определяются во время изменения.
FKEY_DEFERRABLE

При экспорте таблиц ora2pgpro, как правило, экспортирует ограничения как есть: если они неоткладываемые, то экспортируются как неоткладываемые. Однако неоткладываемые ограничения могут вызвать проблемы при попытке импорта данных в Postgres Pro. Задайте для директивы FKEY_DEFERRABLE значение 1, чтобы все ограничения внешнего ключа экспортировались как откладываемые.

DEFER_FKEY

Когда для директивы DEFER_FKEY задано значение 1, добавляется команда для откладывания всех ограничений внешнего ключа во время экспорта, а импорт выполняется в одной транзакции. Это будет работать, только если внешние ключи экспортируются как откладываемые и данные не импортируются в Postgres Pro напрямую (не задана директива PG_DSN). Ограничения проверяются в конце транзакции.

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

DROP_FKEY

Если откладывание внешних ключей не представляется возможным из-за большого объёма данных в одной транзакции, внешние ключи не были экспортированы как откладываемые или импорт в Postgres Pro осуществляется напрямую, можно использовать директиву DROP_FKEY, чтобы удалить все внешние ключи до импорта данных и создать их заново в конце импорта.

DROP_INDEXES

Эта директива позволяет значительно увеличить скорость импорта данных путём удаления всех индексов, не являющихся автоматическими (индексы по первичным ключам), и создания их заново в конце импорта. Рекомендуется не импортировать индексы и ограничения до импорта всех данных.

DISABLE_TRIGGERS

Директива используется для отключения триггеров для всех таблиц при типе экспорта COPY или INSERT. Возможные значения: USER (отключение только пользовательских триггеров) и ALL (включая системные триггеры для ссылочной целостности). Значение по умолчанию 0 — для отключения триггера до импорта данных SQL-операторы не добавляются.

Если необходимо отключить триггеры во время миграции данных, при подключении под именем суперпользователя Postgres Pro задайте значение ALL, в противном случае —USER. Значение 1 равняется USER.

DISABLE_SEQUENCE

Со значением 1 директива отключает изменение последовательностей для всех таблиц, если указан тип экспорта COPY или INSERT. Полезно во избежание изменения последовательности во время миграции данных. Значение по умолчанию — 0, то есть последовательности меняются.

NOESCAPE

По умолчанию все данные типов, отличных от даты или времени, должны экранироваться. Если с этим возникают проблемы, задайте для данной директивы значение 1, чтобы отключить экранирование символов во время экспорта данных. Эта директива используется только с типом экспорта COPY. Включить/отключить экранирование символов для операторов INSERT можно с помощью директивы STANDARD_CONFORMING_STRINGS.

STANDARD_CONFORMING_STRINGS

Эта директива определяет, будет ли обратная косая черта в обычных строковых константах ('...') восприниматься буквально, как того требует стандарт SQL. По умолчанию директива включена, то есть при её ненулевом значении ora2pgpro использует синтаксис спецпоследовательностей (E'...'). Директива работает точно так же, как аналогичный параметр в Postgres Pro, и используется во время экспорта только для операторов INSERT. Включить/отключить экранирование символов для операторов COPY можно с помощью директивы NOESCAPE.

TRIM_TYPE

Если для преобразования CHAR(n) из Oracle в varchar(n) или text в Postgres Pro задана директива DATA_TYPE, может потребоваться усечение данных. Если задать данную директиву, по умолчанию ora2pgpro автоматически находит и удаляет пробельные символы в начале и конце строки (значение BOTH). Если необходимо удалять пробелы только в начале строк, задайте значение LEADING. Если необходимо удалять пробелы только в конце строк, задайте значение TRAILING.

TRIM_CHAR

По умолчанию директива закомментирована, усекаются пробелы. Используйте директиву, чтобы поменять удаляемый символ: например, на -, чтобы усекать - в начале поля типа char(n).

PRESERVE_CASE

Если необходимо сохранить регистр имён объектов Oracle, задайте для этой директивы значение 1. По умолчанию ora2pgpro преобразует все имена объектов Oracle в нижний регистр. Не рекомендуется включать эту директиву, поскольку в таком случае придётся заключать в кавычки все имена объектов во всех SQL-скриптах.

ORA_RESERVED_WORDS

Разрешает экранировать имена столбцов с использованием зарезервированных слов Oracle. В значении указывается список зарезервированных слов, разделённых запятыми. По умолчанию: audit,comment,references.

USE_RESERVED_WORDS

Включите эту директиву, если есть имена таблиц или столбцов, являющиеся зарезервированными словами Postgres Pro. ora2pgpro заключит имена таких объектов в кавычки.

GEN_USER_PWD

Задайте для этой директивы значение 1, чтобы заменить пароль по умолчанию случайным паролем для всех пользователей во время экспорта GRANT.

PG_SUPPORTS_MVIEW

В Postgres Pro материализованные представления создаются с помощью SQL-синтаксиса CREATE MATERIALIZED VIEW. Используйте эту директиву (по умолчанию включена), чтобы в ora2pgpro использовалась встроенная поддержка Postgres Pro. Отключите директиву, чтобы использовать старый вариант синтаксиса с таблицей и набором функций.

PG_VERSION

Задаёт номер мажорной версии целевой БД Postgres Pro. Например: 11 или 16. Значение по умолчанию — последняя мажорная версия на момент релиза.

BITMAP_AS_GIN

Включает использование расширения btree_gin для создания индексов со сканированием битовой карты. Расширение должно быть создано. По умолчанию создаются индексы GIN, когда директива отключена — индексы B-деревья.

LONGREADLEN

Используйте эту директиву, чтобы задать предполагаемый размер самого большого объекта в Oracle по свойству LongReadLen. Значение по умолчанию — 1 МБ, чего может быть недостаточно для извлечения файлов BLOB или CLOB. Если размер LOB превышает LONGREADLEN, DBD::Oracle возвращает ошибку «ORA-24345: A Truncation» (Усечение). По умолчанию: 1023*1024 байт.

Важно

Если увеличить значение этой директивы, по всей вероятности нужно уменьшить значение DATA_LIMIT. Даже если размер файла BLOB составляет 1МБ, при попытке прочитать 10000 таких файлов (значение DATA_LIMIT по умолчанию) понадобится 10 ГБ памяти. Попробуйте извлекать данные из таких таблиц по очереди и задать для DATA_LIMIT значение 500 или ниже, в противном случае может произойти нехватка памяти.

LONGTRUNKOK

Если необходимо обойти ошибку «ORA-24345: A Truncation», задайте для этой директивы значение 1, чтобы данные усекались до значения LONGREADLEN. По умолчанию директива отключена, то есть будет выводиться предупреждение, если для LONGREADLEN задано недостаточно большое значение.

USE_LOB_LOCATOR

Отключите эту директиву, если необходимо загрузить содержимое файлов BLOB и CLOB полностью без использования указателей на LOB. Для этого необходимо выставить подходящее значение LONGREADLEN. Обратите внимание, что при этом скорость экспорта BLOB не увеличится, поскольку большая часть времени уходит на экранирование значений bytea и экспорт происходит построчно, а не блоками по DATA_LIMIT строк. По умолчанию директива включена, используются указатели на LOB.

LOB_CHUNK_SIZE

Oracle рекомендует чтение и запись LOB порциями величиной, кратной размеру блоков LOB. Размер блока по умолчанию составляет 8КБ (8192). Последние тесты показывали улучшение производительности при более высоких значениях, таких как 512KБ или 4МБ.

Результаты быстрого теста на 30120 строках с файлами BLOB разного размера (200x5МБ, 19800x212КБ, 10000x942КБ, 100x17МБ, 20x156МБ) при DATA_LIMIT=100, LONGREADLEN=170МБ и общим размером таблицы 20 ГБ:

no lob locator  : 22m46,218s (1365 sec., avg: 22 recs/sec)
chunk size 8k   : 15m50,886s (951 sec., avg: 31 recs/sec)
chunk size 512k : 1m28,161s (88 sec., avg: 342 recs/sec)
chunk size 4Mb  : 1m23,717s (83 sec., avg: 362 recs/sec)

Таким образом, со значением LOB_CHUNK_SIZE в 4 МБ можно получить ускорение более чем в 10 раз. В этой директиве можно подбирать подходящее значение в зависимости от размера большинства объектов BLOB. Например, если размер большинства объектов LOB меньше 8KБ, достаточно задать для директивы значение 8192 для экономии памяти. Значение LOB_CHUNK_SIZE по умолчанию — 512000.

XML_PRETTY

Указывает использовать функцию getStringVal() вместо getClobVal() для экспорта данных XML. По умолчанию 1, функциональность включена для обратной совместимости. Задайте значение 0, чтобы извлекать данные как CLOB. Обратите внимание, что значение XML, извлекаемое с помощью with getStringVal() не должно превышать заданный в VARCHAR2 предел (4000), в противном случае выдаётся ошибка.

ENABLE_MICROSECOND

Задайте для директивы значение O, если необходимо отключить экспорт миллисекунд из столбцов типа timestamp Oracle. По умолчанию миллисекунды экспортируются с использованием следующего формата:

'YYYY-MM-DD HH24:MI:SS.FF'

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

to_char(..., 'YYYY-MM-DD HH24:MI:SS')

По умолчанию миллисекунды экспортируются.

DISABLE_COMMENT

Задайте для директивы значение 1, чтобы не экспортировать комментарии к таблицам и столбцам. По умолчанию директива включена.