Экспортируемая схема Oracle

Можно ограничить экспорт БД Oracle отдельной схемой или пространством имён вручную. Если для подключения указан пользователь с ограниченными правами, только соответствующие объекты будут выгружены.

SCHEMA

Директива используется для указания имени схемы, используемой во время экспорта. Например, с указанием SCHEMA APPS будут выгружены объекты, связанные со схемой APPS.

Если включить EXPORT_SCHEMA и не задать имя схемы, ora2pgpro экспортирует все объекты из всех схем экземпляра Oracle, добавляя к именам объектов имя схемы в виде префикса.

EXPORT_SCHEMA

По умолчанию схема Oracle не экспортируется в БД Postgres Pro, а все объекты создаются в пространстве имён Postgres Pro по умолчанию. Если необходимо и экспортировать схему, и создать все объекты в этом пространстве имён, задайте для EXPORT_SCHEMA значение 1. При этом в пути к схеме (search_path) в начале SQL-файла для экспорта будет записана схема, указанная в директиве SCHEMA (по умолчанию pg_catalog). Если вы хотите изменить путь, используйте директиву PG_SCHEMA.

CREATE_SCHEMA

Директива включает/отключает команду CREATE SCHEMA в начале выходного файла. По умолчанию включена, используется с типом экспорта TABLE.

COMPILE_SCHEMA

По умолчанию ora2pgpro экспортирует только рабочий код PL/SQL. Можно перекомпилировать нерабочий код в Oracle, чтобы добиться корректности и в дальнейшем экспортировать его.

Чтобы схема компилировалась в Oracle перед экспортом кода, включите эту директиву. В этом случае, если в SCHEMA задано определённое имя схемы, только нерабочие объекты в этой схеме будут перекомпилированы. Если директива SCHEMA не задана, все схемы будут перекомпилированы. Чтобы принудительно перекомпилировать нерабочие объекты в определённой схеме, укажите в COMPILE_SCHEMA имя этой схемы.

При этом в Oracle отправится запрос на перекомпиляцию кода PL/SQL, который мог стать нерабочим, например, после экспорта/импорта. В результате для функций, процедур, пакетов и пользовательских типов проставляется статус VALID или INVALID. Кроме того, это распространяется на отключённые триггеры.

EXPORT_INVALID

Если предыдущей директивы недостаточно для проверки корректности кода PL/SQL, включите эту директиву, чтобы разрешить экспорт всего кода PL/SQL, даже если он помечен как нерабочий. В результате для функций, процедур, пакетов и пользовательских типов проставляется статус VALID или INVALID.

PG_SCHEMA

Позволяет указать / принудительно использовать схему Postgres Pro. По умолчанию, если для EXPORT_SCHEMA задано значение 1, для параметра search_path в Postgres Pro будет задано имя схемы, указанной в SCHEMA.

Значением может быть список имён схем, разделённых запятыми, но не с типом экспорта TABLE, потому что в этом случае создаётся оператор CREATE SCHEMA, не поддерживающий несколько имён схем. Например, если для PG_SCHEMA указать user_schema, public, путь поиска задаётся следующим образом:

SET search_path = user_schema, public;

В этом случае используется схема (здесь user_schema), отличная от схемы Oracle, которая указана в директиве SCHEMA.

Кроме того, для пользователя Postgres Pro, под именем которого вы подключаетесь к целевой базе данных, можно задать значение search_path по умолчанию следующим образом:

ALTER ROLE username SET search_path TO user_schema, public;

Тогда задавать PG_SCHEMA не понадобится.

SYSUSERS

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

SYSTEM,CTXSYS,DBSNMP,EXFSYS,LBACSYS,MDSYS,MGMT_VIEW,
OLAPSYS,ORDDATA,OWBSYS,ORDPLUGINS,ORDSYS,OUTLN,
SI_INFORMTN_SCHEMA,SYS,SYSMAN,WK_TEST,WKSYS,WKPROXY,
WMSYS,XDB,APEX_PUBLIC_USER,DIP,FLOWS_020100,FLOWS_030000,
FLOWS_040100,FLOWS_010600,FLOWS_FILES,MDDATA,ORACLE_OCM,
SPATIAL_CSW_ADMIN_USR,SPATIAL_WFS_ADMIN_USR,XS$NULL,PERFSTAT,
SQLTXPLAIN,DMSYS,TSMSYS,WKSYS,APEX_040000,APEX_040200,
DVSYS,OJVMSYS,GSMADMIN_INTERNAL,APPQOSSYS,DVSYS,DVF,
AUDSYS,APEX_030200,MGMT_VIEW,ODM,ODM_MTR,TRACESRV,MTMSYS,
OWBSYS_AUDIT,WEBSYS,WK_PROXY,OSE$HTTP$ADMIN,
AURORA$JIS$UTILITY$,AURORA$ORB$UNAUTHENTICATED,
DBMS_PRIVILEGE_CAPTURE,CSMIG,MGDSYS,SDE,DBSFWUSER

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

SYSUSERS        INTERNAL,SYSDBA,BI,HR,IX,OE,PM,SH

В результате пользователи INTERNAL и SYSDBA будут добавлены в список исключений.

FORCE_OWNER

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

FORCE_SECURITY_INVOKER

Для экспорта функций ora2pgpro использует права из Oracle (чаще всего SECURITY DEFINER). Включите эту директиву, если необходимо переопределить права для всех функций на SECURITY INVOKER.

USE_TABLESPACE

Когда директива включена, ora2pgpro экспортирует все таблицы, ограничения и индексы, используя имя пространства имён, указанное в БД Oracle. Не работает с пространствами имён TEMP, USERS и SYSTEM.

WITH_OID

Когда директива включена, при создании таблиц или представлений как таблиц ora2pgpro добавляет указание WITH OIDS. По умолчанию отключена, как и в Postgres Pro.

NO_FUNCTION_METADATA

Отключает поиск объявления функции для ora2pgpro. Обратите внимание, что при этом ora2pgpro не будет перезаписывать вызов функции. Включайте эту директиву, только если поиск функции нарушает экспорт.

Тип экспорта

Директива TYPE определяет выполняемые во время экспорта действия, другие директивы позволяют только уточнить детали экспорта.

TYPE

Для директивы TYPE можно задать следующие значения (по умолчанию TABLE):

  • TABLE: извлекать все таблицы с индексами, первичными ключами, ограничениями уникальности, внешними ключами и ограничениями-проверками.
  • VIEW: извлекать только представления.
  • GRANT: извлекать роли, преобразуемые в группы Postgres Pro, пользователей и права для все объектов.
  • SEQUENCE: извлекать все последовательности и их текущие значения.
  • TABLESPACE: извлекать пространства для таблиц и индексов.
  • TRIGGER: извлекать событийные триггеры.
  • FUNCTION: извлекать функции.
  • PROCEDURE: извлекать процедуры.
  • PACKAGE: извлекать пакеты и тела пакетов.
  • INSERT: извлекать данные через оператор INSERT.
  • COPY: извлекать данные через оператор COPY.
  • PARTITION: извлекать секции по диапазонам и спискам с подсекциями.
  • TYPE: извлекать пользовательские типы Oracle.
  • FDW: извлекать таблицы Oracle как сторонние таблицы для oracle_fdw.
  • MVIEW: эскпортировать материализованные представления.
  • QUERY: автоматически преобразовывать SQL-запросы Oracle.
  • DBLINK: создать сервер обёртки сторонних данных Oracle, чтобы использовать его как dblink.
  • SYNONYM: экспортировать синонимы Oracle как представления на базе других объектов схемы.
  • DIRECTORY: экспортировать каталоги Oracle как объекты расширения external_file.
  • LOAD: отправлять набор запросов с использованием нескольких соединений с Postgres Pro.
  • TEST: выполнить сравнение БД Oracle и Postgres Pro.
  • TEST_COUNT: выполнить сравнение количества строк в таблицах Oracle и Postgres Pro.
  • TEST_VIEW: подсчитать число строк, возвращаемых представлениями на обеих сторонах.
  • TEST_DATA: выполнить проверку корректности строк на обеих сторонах.
  • SHOW_VERSION: показать версию Oracle.
  • SHOW_SCHEMA: вывести список доступных схем.
  • SHOW_TABLE: вывести список доступных таблиц.
  • SHOW_COLUMN: вывести список доступных столбцов таблиц и тип, используемый ora2pgpro при преобразовании из Oracle в Postgres Pro. Кроме того, выводится предупреждение, если в именах объектов Oracle есть зарезервированные слова Postgres Pro.
  • SHOW_REPORT: вывести подробный отчёт о содержимом БД Oracle для оценки размера объектов и стоимости миграции.

Только один тип экспорта можно выполнить за один раз, поэтому директива TYPE должна быть уникальной. Если указать директиву несколько раз, будет использоваться последнее обнаруженное значение.

Результаты экспорта некоторых типов невозможно или не следует загружать в БД Postgres Pro напрямую — требуются дополнительные действия вручную. Это относится к типам экспорта GRANT, TABLESPACE, TRIGGER, FUNCTION, PROCEDURE, TYPE, QUERY и PACKAGE, особенно если есть код PL/SQL или SQL, специфичный для Oracle.

Для типа экспорта TABLESPACE в системе должен существовать путь к файлу, а для SYNONYM — владельцы объектов и схемы должны соответствовать новому проекту БД Postgres Pro.

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

ora2pgpro преобразовывает секции Oracle, используя наследование, триггеры и функции. За дополнительной информацией обратитесь к разделу Секционирование таблиц.

Директива TYPE позволяет экспортировать пользовательские типы Oracle. Если не использовать параметр --plsql в командной строке, пользовательский тип Oracle выгружается как есть, в противном случае ora2pgpro попробует преобразовать его с использованием синтаксиса Postgres Pro.

Пример вывода с использованием SHOW_COLUMN:

[2] TABLE CURRENT_SCHEMA (1 rows) (Warning: 'CURRENT_SCHEMA' is a reserved word in PostgreSQL)
		CONSTRAINT : NUMBER(22) => bigint (Warning: 'CONSTRAINT' is a reserved word in PostgreSQL)
		FREEZE : VARCHAR2(25) => varchar(25) (Warning: 'FREEZE' is a reserved word in PostgreSQL)
	...
	[6] TABLE LOCATIONS (23 rows)
		LOCATION_ID : NUMBER(4) => smallint
		STREET_ADDRESS : VARCHAR2(40) => varchar(40)
		POSTAL_CODE : VARCHAR2(12) => varchar(12)
		CITY : VARCHAR2(30) => varchar(30)
		STATE_PROVINCE : VARCHAR2(25) => varchar(25)
		COUNTRY_ID : CHAR(2) => char(2)

Нижеописанные ключевые слова только показывают запрошенную информацию и прерывают выполнение. Это позволяет узнать, с чем предстоит работать.

С типом SHOW_COLUMN в командной строке разрешается передавать параметры ora2pgpro --allow relname или -a relname, чтобы ограничить выводимую информацию одной таблицей.

С типом SHOW_ENCODING отображаются значения NLS_LANG и CLIENT_ENCODING, которые будет использовать ora2pgpro, и фактическая кодировка БД Oracle с соответствующей кодировкой клиента, которая будет использоваться в Postgres Pro.

ora2pgpro может экспортировать определение таблицы Oracle для использования через обёртку сторонних данных oracle_fdw. Если задать тип FDW, таблицы Oracle экспортируются следующим образом:

CREATE FOREIGN TABLE oratab (
		id        integer           NOT NULL,
		text      character varying(30),
		floating  double precision  NOT NULL
	) SERVER oradb OPTIONS (table 'ORATAB');

Теперь таблицу можно использовать как обычную таблицу Postgres Pro.

Также можно вывести более подробный отчёт с информацией о стоимости миграции, подробнее см. «Оценка стоимости миграции».

ESTIMATE_COST

Активирует оценку стоимости миграции. Используется только с типами экспорта SHOW_REPORT, FUNCTION, PROCEDURE, PACKAGE и QUERY. По умолчанию отключена. Эта же функциональность включается с помощью параметра --estimate_cost командной строки. Обратите внимание, что включение этой директивы активирует PLSQL_PGSQL.

COST_UNIT_VALUE

Задаёт значение в минутах для блока оценки стоимости миграции. По умолчанию 5 минут на блок. Чтобы поменять значение в командной строке, используйте --cost_unit_value.

DUMP_AS_HTML

Если включить эту директиву, ora2pgpro выведет отчёт о миграции в формате HTML. По умолчанию при использовании SHOW_REPORT отчёт выводится в формате простого текста.

HUMAN_DAYS_LIMIT

Используйте эту директиву, чтобы переопределить предел человеко-дней, по достижении которого уровень оценки миграции меняется с B на C. По умолчанию 10 человеко-дней.

JOBS

Эта директива включает поддержку многопоточности для типов экспорта COPY, FUNCTION и PROCEDURE и задаёт число используемых процессов. По умолчанию многопоточность отключена.

Эта директива используется, чтобы указать число ядер для параллельного импорта данных в Postgres Pro. С типом экспорта FUNCTION или PROCEDURE каждая функция будет переведена в PL/pgSQL в новом отдельном процессе, что может дать значительное ускорение при большом количестве функций.

Параллельная обработка ограничивается только числом ядер и производительностью ввода-вывода Postgres Pro.

Не работает с ОС Windows, директива отключена.

ORACLE_COPIES

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

Параллельность построена на разделение запроса по числу ядер, переданному в качестве значения ORACLE_COPIES:

SELECT * FROM MYTABLE WHERE ABS(MOD(COLUMN, ORACLE_COPIES)) = CUR_PROC

Здесь COLUMN — это технический ключ, такой как первичный ключ или уникальный ключ, на основе которого осуществляется разделение и используется текущее ядро (CUR_PROC). В директиве DEFINED_PK можно задать имя используемого столбца.

Не работает с ОС Windows, директива отключена.

DEFINED_PK

Эта директива используется, чтобы определить технический ключ, используемый для разделения запроса по числу ядер, которое задано в переменной ORACLE_COPIES. Например:

DEFINED_PK      EMPLOYEES:employee_id

Предположим, что в -J или ORACLE_COPIES задано значение 8, используется параллельный запрос:

SELECT * FROM EMPLOYEES WHERE ABS(MOD(employee_id, 8)) = N

Здесь N — это текущий дочерний процесс (начиная с 0).

PARALLEL_TABLES

Эта директива используется, чтобы задать число таблиц, обрабатываемых параллельно для извлечения данных. Пределом является число ядер на машине. ora2pgpro устанавливает по одному подключению к БД для каждого параллельного процесса. Если значение этой директивы больше 1, ORACLE_COPIES отключается, но JOBS используется, так что фактическое число процессов = PARALLEL_TABLES * JOBS.

Обратите внимание, что если значение этой директивы больше 1, при экспорте в файлы автоматически активируется FILE_PER_TABLE, чтобы экспортировать таблицы и представления в разные файлы.

Используйте PARALLEL_TABLES, чтобы включить параллельность для действий COPY, INSERT и TEST_DATA. Также полезно для TEST, TEST_COUNT и SHOW_TABLE, если --count_rows используется для подсчёта действительного количества строк.

DEFAULT_PARALLELISM_DEGREE

Если задать для этой директивы значение больше 1, ora2pgpro будет принудительно использовать указание /*+ PARALLEL(tbname, degree) */ в каждом запросе экспорта данных из Oracle. Значение 0 или 1 отключает использование указаний для параллельности. По умолчанию отключена.

FDW_SERVER

Эта директива используется, чтобы указывать имя сервера сторонних данных для команды CREATE SERVER name FOREIGN DATA WRAPPER oracle_fdw. Затем это имя используется в командах CREATE FOREIGN TABLE и в импорте данных с помощью oracle_fdw. По умолчанию сторонний сервер не определён. Директива используется с типами экспорта FDW, COPY и INSERT. Для типа экспорта FDW значение по умолчанию — orcl.

FDW_IMPORT_SCHEMA

Схема, в которой будут созданы сторонние таблицы для миграции данных. Если для миграции данных используются несколько экземпляров ora2pgpro с использованием обёртки сторонних данных, может потребоваться изменять имя схемы для отдельных экземпляров. По умолчанию ora2pg_fdw_import.

DROP_FOREIGN_SCHEMA

По умолчанию перед каждым новым импортом ora2pgpro удаляет временную схему ora2pg_fdw_import, используемую для импорта сторонней схемы Oracle. Отключите директиву, если необходимо сохранить существующую схему из-за внесённых изменений или использования стороннего сервера.

EXTERNAL_TO_FDW

Эта директива (по умолчанию включена) позволяет экспортировать сторонние таблицы Oracle как сторонние таблицы file_fdw. Чтобы не экспортировать такие таблицы, задайте значение 0.

INTERNAL_DATE_MAX

Внутренние отметки времени, получаемые из пользовательских типов, извлекаются в следующем формате: 01-JAN-77 12.00.00.000000 AM. Поскольку точное столетие неизвестно, по умолчанию каждый год меньше 49 относится к 2000, а остальные — к 1900. Эта директива используется, чтобы изменить значение по умолчанию 49. Директива имеет смысл, только если есть пользовательский тип со столбцом timestamp.

AUDIT_USER

Задаёт список разделённых запятыми имён пользователей для фильтрации запросов к таблице DBA_AUDIT_TRAIL. По умолчанию эта таблица не сканируется, и поиск запросов не выполняется. Директива используется только с типами экспорта SHOW_REPORT и QUERY, когда не указан файл с запросами. Обратите внимание, что перед выводом выполняется нормализация текста запроса, в отличие от случаев, когда передаётся входной файл в параметре -i.

FUNCTION_CHECK

Отключите эту директиву, чтобы отключить check_function_bodies.

SET check_function_bodies = false;

При этом отключается проверка корректности строки с телом функции, передаваемой команде CREATE FUNCTION. По умолчанию используется параметр из postgresql.conf, включающий эту функциональность.

ENABLE_BLOB_EXPORT

Экспорт BLOB занимает время, поэтому иногда может потребоваться экспортировать все данные, кроме BLOB. В этом случае отключите эту директиву, и столбцы типа BLOB будут исключены из экспорта. Обратите внимание, что у целевого столбца типа bytea не должно быть ограничения NOT NULL.

DATA_EXPORT_ORDER

По умолчанию экспорт данных выполняется в порядке имён таблиц. Если в базе есть огромные таблицы с именами в конце алфавита, при использовании многопоточности может быть полезно настроить сортировку по размеру, чтобы множество небольших таблиц были обработаны до того, как завершится обработка самых больших таблиц. В этом случае задайте для этой директивы значение size. Возможные значения: name и size. Обратите внимание, что с типами экспорта SHOW_TABLE и SHOW_COLUMN тоже можно использовать сортировку, не только с COPY или INSERT.

Ограничение экспорта

Иногда может потребоваться экспортировать только часть БД Oracle. Нижеописанные директивы позволяют ограничить экспорт отдельными объектами БД.

ALLOW

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

ALLOW           EMPLOYEES SALE_.* COUNTRIES .*_GEOM_SEQ

С таким значением будут экспортированы объекты с именами EMPLOYEES, COUNTRIES, а также с именами, начинающимися на SALE_, и именами, заканчивающимися на _GEOM_SEQ. Типы объектов зависят от типа экспорта. Обратите внимание, что регулярные выражения не сработают в БД 8i, вместо них надо использовать местозаполнители %, чтобы утилита ora2pgpro использовала оператор LIKE.

Так задаются глобальные фильтры для текущего типа экспорта. Можно также задавать расширенные фильтры, применяемые к определённым объектам или для соответствующего типа экспорта. Например:

ora2pgpro -p -c ora2pgpro.conf -t TRIGGER -a 'TABLE[employees]'

При этом будут экспортироваться только триггеры для таблицы employees. Если нужны все триггеры, кроме некоторых INSTEAD OF:

ora2pgpro -c ora2pgpro.conf -t TRIGGER -e 'VIEW[trg_view_.*]'

Или в более сложном виде:

ora2pgpro -p -c ora2pgpro.conf -t TABLE -a 'TABLE[EMPLOYEES]' \
        -e 'INDEX[emp_.*];CKEY[emp_salary_min]'

Эта команда экспортирует определение таблицы employees, но без индексов, начинающихся с emp_, и ограничения CHECK с именем emp_salary_min.

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

ora2pgpro -p -c ora2pgpro.conf -t PARTITION -e 'PARTITION[PART_199.* PART_198.*]'

При этом из экспорта будут исключены секции для лет с 1980 по 1999, но не основная таблица. Кроме того, будут исключены соответствующие триггеры.

С типом экспорта GRANT можно использовать такой расширенный формат, чтобы исключить пользователей из экспорта или ограничить отдельными пользователями:

ora2pgpro -p -c ora2pgpro.conf -t GRANT -a 'USER1 USER2'
or
ora2pgpro -p -c ora2pgpro.conf -t GRANT -a 'GRANT[USER1 USER2]'

Последняя команда ограничит экспорт пользователями USER1 и USER2. Если же нет необходимости экспортировать права этих пользователей на определённые функции, можно использовать, например:

ora2pgpro -p -c ora2pgpro.conf -t GRANT -a 'USER1 USER2' -e 'FUNCTION[adm_.*];PROCEDURE[adm_.*]'

Oracle не допускает использование выражений с предварительным просмотром, поэтому может потребоваться исключить из экспорта некоторые объекты, соответствующие заданному в ALLOW регулярному выражению. Например, если необходимо экспортировать все таблицы, начинающиеся на E, но исключить начинающиеся на EXP, отфильтровать таблицы одним выражением невозможно. Поэтому можно начать регулярное выражением с символа !, чтобы исключить объекты, соответствующие следующему регулярному выражению. Предыдущий пример можно записать следующим образом:

ALLOW   E.* !EXP.*

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

REGEXP_LIKE(..., '^E.*$') AND NOT REGEXP_LIKE(..., '^EXP.*$')
EXCLUDE

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

EXCLUDE         EMPLOYEES TMP_.* COUNTRIES

При этом из экспорта будут исключены объекты с именами EMPLOYEES, COUNTRIESи все таблицы, начинающиеся на tmp_.

Например, с помощью этой директивы можно исключить ненужные функции:

EXCLUDE         write_to_.* send_mail_.*

В вышеприведённом примере из экспорта исключаются все функции, процедуры или функции из пакетов с именами, начинающимися как задано регулярным выражением. Обратите внимание, что регулярные выражения не сработают в БД 8i, вместо них надо использовать местозаполнители %, чтобы утилита ora2pgpro использовала оператор NOT LIKE. Расширенный синтаксис описан выше (см. директиву ALLOW).

NO_EXCLUDED_TABLE

По умолчанию ora2pgpro исключает из экспорта «мусорные» таблицы Oracle, которые никогда не должны включаться. При этом создаётся множество выражений REGEXP_LIKE, что замедляет анализ таблиц при экспорте. Чтобы отключить это поведение, включите данную директиву, но ненужные таблицы придётся впоследствии исключать или удалять вручную. Регулярные выражения для исключения таблиц задаются в массиве @EXCLUDED_TABLES в lib/Ora2Pgpro.pm. Обратите внимание, что это поведение не зависит от директивы EXCLUDE.

VIEW_AS_TABLE

Задаёт представления для экспорта как таблицы. По умолчанию никакие. В значении указывается регулярное выражение или список имён представлений, разделённых пробелами или запятыми. Если имя объекта — это представление и задан тип экспорта TABLE, представление экспортируется как оператор CREATE TABLE. С типом экспорта COPY или INSERT соответствующие данные экспортируются. За подробным описанием обратитесь к разделу Экспорт представлений как таблиц Postgres Pro.

MVIEW_AS_TABLE

Задаёт материализованные представления для экспорта как таблицы. По умолчанию никакие. В значении указывается регулярное выражение или список имён материализованных представлений, разделённых пробелами или запятыми. Если имя объекта — это материализованное представление и задан тип экспорта TABLE, представление экспортируется как оператор CREATE TABLE. С типом экспорта COPY или INSERT соответствующие данные экспортируются.

NO_VIEW_ORDERING

По умолчанию ora2pgpro пытается упорядочить представления во избежание ошибок со вложенными представлениями во время импорта. Если представлений очень много, это может занять много времени, поэтому можно отключить упорядочивание, задав эту директиву.

GRANT_OBJECT

Можно задать список разделённых запятыми объектов, права для которых экспортируются. По умолчанию права экспортируются для всех объектов. Возможные значения: TABLE, VIEW, MATERIALIZED VIEW, SEQUENCE, PROCEDURE, FUNCTION, PACKAGE BODY, TYPE, SYNONYM, DIRECTORY. Разрешается указывать только один тип объектов. Например, для экспорта прав только для таблиц задайте значение TABLE. Значение можно переопределить параметром -g.

WHERE

Эта директива позволяет задавать фильтр по предложению WHERE при выгрузке содержимого таблиц. Значение задаётся в формате TABLE_NAME[WHERE_CLAUSE] или только предложение WHERE при наличии только одного такого предложения на каждую таблицу. Можно задавать оба варианта одновременно. Примеры:

# Глобальное предложение WHERE применяется ко всем таблицам в экспорте
WHERE  1=1

# Предложение WHERE только для таблицы TABLE_NAME
WHERE  TABLE_NAME[ID1='001']

# Два разных предложения для таблиц TABLE_NAME и OTHER_TABLE
# и общее предложение WHERE по DATE_CREATE для всех остальных таблиц
WHERE  TABLE_NAME[ID1='001' OR ID1='002] DATE_CREATE > '2001-01-01' OTHER_TABLE[NAME='test']

Если предложение WHERE указывается не в скобках с именем таблицы, оно применяется для всех экспортируемых таблиц, включая таблицы, указанные в предложении WHERE. Предложения WHERE полезны, если необходимо обратиться к архивным данным или, наоборот, недавно созданным.

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

WHERE   ROWNUM < 1000

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

Параметр -W или --where, передаваемый в командной строке, переопределит значение этой директивы глобально и для отдельных таблиц, если имена таблиц совпадают.

TOP_MAX

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

LOG_ON_ERROR

Включите эту директиву, если хотите продолжать импорт данных в случае ошибки. Когда ora2pgpro получает ошибку в операторах COPY или INSERT в Postgres Pro, этот оператор записывается в файл журнала TABLENAME_error.log в выходном каталоге, и работа продолжается. Можно попробовать корректировать оператор и вручную перезагрузить файл журнала ошибок. По умолчанию импорт прерывается при ошибке.

REPLACE_QUERY

Иногда может потребоваться извлечь данные из таблицы Oracle, но для этого нужен отдельный запрос — не простой запрос SELECT * FROM table от ora2pgpro, а более сложный. Эта директива позволяет переопределить запрос, используемый ora2pgpro для извлечения данных. Формат запроса: TABLENAME[SQL_QUERY]. Если таблиц много, с заменой запроса ora2pgpro можно указать несколько строк REPLACE_QUERY.

REPLACE_QUERY   EMPLOYEES[SELECT e.id,e.fisrtname,lastname FROM EMPLOYEES e JOIN EMP_UPDT u ON (e.id=u.id AND u.cdate>'2014-08-01 00:00:00')]

Управление экспортом полнотекстового поиска

Для управления экспортом индексов для полнотекстового поиска в ora2pgpro предусмотрено несколько директив. По умолчанию индексы CONTEXT экспортируются в Postgres Pro как индексы FTS, а индексы CTXCAT экспортируются с использованием расширения pg_trgm.

CONTEXT_AS_TRGM

Принудительно переводит полнотекстовые индексы Oracle в индексы Postgres Pro с использованием расширения pg_trgm. По умолчанию индексы CONTEXT переводятся в индексы FTS, а индексы CTXCAT — с использованием расширения pg_trgm. Эта директива позволяет использовать pg_trgm, чего достаточно в большинстве случаев. Перед импортом объектов необходимо создать расширение pg_trgm в целевой базе данных.

FTS_INDEX_ONLY

По умолчанию ora2pgpro создаёт индекс на основе функции, чтобы перенести полнотекстовые индексы Oracle.

CREATE INDEX ON t_document
  USING gin(to_tsvector('pg_catalog.french', title));

Необходимо переписать предложение CONTAIN() с использованием to_tsvector(), например:

SELECT id,title FROM t_document
  WHERE to_tsvector(title) @@ to_tsquery('search_word');

Отключите эту директиву, чтобы утилита ora2pgpro создавала дополнительный столбец типа tsvector с выделенными триггерами для индексов FTS. В этом случае ora2pgpro добавляет столбец следующим образом:

ALTER TABLE t_document ADD COLUMN tsv_title tsvector;

Затем столбец обновляется для вычисления векторов FTS, если данные были загружены до команды UPDATE t_document SET tsv_title = to_tsvector('pg_catalog.french', coalesce(title,''));. Чтобы автоматически обновлять столбец при изменении заголовка, ora2pgpro добавляет следующий триггер:

CREATE FUNCTION tsv_t_document_title() RETURNS trigger AS $$
BEGIN
       IF TG_OP = 'INSERT' OR new.title != old.title THEN
               new.tsv_title :=
               to_tsvector('pg_catalog.french', coalesce(new.title,''));
       END IF;
       return new;
END
$$ LANGUAGE plpgsql;
CREATE TRIGGER trig_tsv_t_document_title BEFORE INSERT OR UPDATE
 ON t_document
 FOR EACH ROW EXECUTE PROCEDURE tsv_t_document_title();

Если полнотекстовый индекс Oracle создан по нескольким столбцам, ora2pgpro будет использовать функцию setweight(), чтобы задать вес в порядке объявления столбцов.

FTS_CONFIG

Используйте эту директиву, чтобы принудительно задать конфигурацию текстового поиска. Если директива не задана, ora2pgpro автоматически определяет стеммер, используемый в Oracle для каждого индекса, и pg_catalog.english, если информация не найдена.

USE_UNACCENT

Включите эту директиву, если текстовый поиск должен выполняться без учёта символов ударения или акцента. ora2pgpro создаст вспомогательную функцию на unaccent() и индексы pg_trgm, использующие эту функцию. Для индексов FTS ora2pgpro переопределит конфигурацию текстового поиска, например:

CREATE TEXT SEARCH CONFIGURATION fr (COPY = french);
ALTER TEXT SEARCH CONFIGURATION fr
        ALTER MAPPING FOR hword, hword_part, word WITH unaccent, french_stem;

Затем задайте для директивы FTS_CONFIG в ora2pgpro.conf значение fr вместо pg_catalog.english.

Если директива включена, ora2pgpro создаёт функцию-обёртку:

CREATE OR REPLACE FUNCTION unaccent_immutable(text)
RETURNS text AS
$$
    SELECT public.unaccent('public.unaccent', $1);
$$ LANGUAGE sql IMMUTABLE
   COST 1;

Индексы экспортируются так:

CREATE INDEX t_document_title_unaccent_trgm_idx ON t_document
    USING gin (unaccent_immutable(title) gin_trgm_ops);

Чтобы использовать индекс на основе функции, в запросах необходимо использовать эту же функцию, например:

SELECT * FROM t_document
        WHERE unaccent_immutable(title) LIKE '%donnees%';
USE_LOWER_UNACCENT

То же, что и выше, но вызывается функция lower() в функции unaccent_immutable():

CREATE OR REPLACE FUNCTION unaccent_immutable(text)
RETURNS text AS
$$
    SELECT lower(public.unaccent('public.unaccent', $1));
$$ LANGUAGE sql IMMUTABLE;

Изменение структуры объектов

Гибкость ora2pgpro позволяет перенести БД Oracle в БД Postgres Pro с другой структурой или схемой. Нижеописанные директивы позволяют настроить необходимое для этого сопоставление.

REORDERING_COLUMNS

Включите эту директиву, чтобы переупорядочить столбцы и уменьшить занимаемое место на диске. В результате на страницу поместится больше строк, что играет важную роль для увеличения скорости. По умолчанию отключена (disabled), то есть используется такой же порядок определения таблиц, как в Oracle, — для большинства случаев этого достаточно. Директива используется только с типом экспорта TABLE.

MODIFY_STRUCT

Эта директива позволяет ограничить извлекаемые столбцы для указанной таблицы. В значении задаётся список имён таблиц, разделённых пробелами, с набором столбцов в скобках: MODIFY_STRUCT NOM_TABLE(nomcol1,nomcol2,...) .... Например:

MODIFY_STRUCT   T_TEST1(id,dossier) T_TEST2(id,fichier)

В примере выше извлекаются столбцы id и dossier из таблицы T_TEST1 и столбцы id и fichier из таблицы T_TEST2. Директива может используется только с типами экспорта TABLE, COPY или INSERT. С типом TABLE оператор CREATE TABLE создаёт столбцы по новому списку, и никакие индексы или внешние ключи, связанные с исключёнными столбцами, не экспортируются.

EXCLUDE_COLUMNS

Вместо того, чтобы переопределять структуру таблицы с помощью MODIFY_STRUCT, можно исключить некоторые столбцы из экспорта. В значении задаётся список имён таблиц, разделённых пробелами, с набором столбцов в скобках: EXCLUDE_COLUMNS NOM_TABLE(nomcol1,nomcol2,...) .... Например:

EXCLUDE_COLUMNS T_TEST1(id,dossier) T_TEST2(id,fichier)

В примере выше из экспорта исключаются столбцы id и dossier таблицы T_TEST1 и столбцы id и fichier таблицы T_TEST2. Директива может используется только с типами экспорта TABLE, COPY или INSERT. С типом TABLE оператор CREATE TABLE создаёт столбцы по новому списку, и никакие индексы или внешние ключи, связанные с исключёнными столбцами, не экспортируются.

REPLACE_TABLES

Эта директива позволяет соотнести список имён таблиц Oracle с именами таблиц Postgres Pro. В значении задаётся список имён таблиц, разделённых пробелами:

REPLACE_TABLES  ORIG_TBNAME1:DEST_TBNAME1 ORIG_TBNAME2:DEST_TBNAME2

Таблицы Oracle ORIG_TBNAME1 и ORIG_TBNAME2 будут переименованы в DEST_TBNAME1 и DEST_TBNAME2 соответственно.

REPLACE_COLS

Как и имена таблиц, имена экспортируемых столбцов можно переопределить следующим образом: REPLACE_COLS ORIG_TBNAME(ORIG_COLNAME1:NEW_COLNAME1,ORIG_COLNAME2:NEW_COLNAME2). Например:

REPLACE_COLS    T_TEST(dico:dictionary,dossier:folder)

При этом столбцы Oracle dico и dossier из таблицы T_TEST будут переименованы в dictionary и folder.

REPLACE_AS_BOOLEAN

Если во время экспорта необходимо поменять тип столбцов Oracle на boolean в Postgres Pro, можно указать в этой директиве список таблиц и столбцов, разделённых пробелами:

REPLACE_AS_BOOLEAN     TB_NAME1:COL_NAME1 TB_NAME1:COL_NAME2 TB_NAME2:COL_NAME2

Значения в столбцах типа boolean будут заменены на t и f, при этом используются значения по умолчанию и заданные в директиве BOOLEAN_VALUES.

Обратите внимание, что если имя таблицы и/или имя столбца было изменено директивой REPLACE_TABLES, необходимо использовать имя оригинальной таблицы и/или столбца.

REPLACE_COLS            TB_NAME1(OLD_COL_NAME1:NEW_COL_NAME1)
REPLACE_AS_BOOLEAN      TB_NAME1:OLD_COL_NAME1

Можно также задать тип и точность для преобразования всех полей этого типа в boolean автоматически, например:

REPLACE_AS_BOOLEAN      NUMBER:1 CHAR:1 TB_NAME1:COL_NAME1 TB_NAME1:COL_NAME2

В примере выше все поля типа number(1) или char(1) заменяются на boolean во всех экспортируемых таблицах.

BOOLEAN_VALUES

Используйте эту директиву, чтобы дать дополнительное определение для значений типа boolean в полях Oracle. Необходимо задать список значений вида TRUE:FALSE, разделённых пробелами. По умолчанию ora2pgpro распознает следующие типы значений:

BOOLEAN_VALUES          yes:no y:n 1:0 true:false enabled:disabled

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

REPLACE_ZERO_DATE

Если утилита ora2pgpro находит «нулевую» дату (0000-00-00 00:00:00), то заменяет её на NULL. Это может привести к проблемам, если в столбце есть ограничение NOT NULL. Если удалить ограничение невозможно, используйте эту директиву, чтобы указать произвольную дату для использования вместо NULL. Если фиктивные даты использовать неуместно, можно задать значение -INFINITY.

INDEXES_SUFFIX

Добавляет заданное значение к именам индексов в виде суффикса. Полезно, если имена индексов совпадают с именами таблиц. Например:

INDEXES_SUFFIX          _idx

Ко всем именам индексов в конце добавится _idx. Не самый распространённый случай, но может быть полезно.

INDEXES_RENAMING

Включите эту директиву, чтобы переименовать все индексы в таком формате: tablename_columns_names. Может быть очень полезно в базах данных, где имена индексов совпадают между собой или с именем таблицы, что не допускается в Postgres Pro. По умолчанию отключена.

USE_INDEX_OPCLASS

Классы операторов text_pattern_ops, varchar_pattern_ops и bpchar_pattern_ops поддерживают индексы B-деревья соответствующих типов. Отличие от классов операторов по умолчанию заключается в том, что выполняется строгое посимвольное сравнение, а не по правилам сортировки, определяемым локалью, благодаря чему эти классы операторов удобно использовать в запросах с выражениями поиска по шаблону (регулярные выражения LIKE или POSIX), когда локаль базы данных отличается от используемой по умолчанию C. Если задать значение 1, ora2pgpro будет экспортировать все индексы, построенные по столбцам типа varchar2() и char(), с использованием этих операторов. Если задать значение больше 1, будут изменяться только индексы по столбцам с ограничением по символам больше или равным указанному значению. Например, при значении 128 будут создаваться индексы по столбцам типа varchar2(N), где N >= 128.

RENAME_PARTITION

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

  • Секция: "tablename"_part"pos", где "pos" — это номер секции.
  • Подсекция: "tablename"_part"pos"_subpart"pos".
  • Секция/подсекция: "tablename"_part_default "tablename"_part"pos"_subpart_default.
DISABLE_PARTITION

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

DISABLE_UNLOGGED

По умолчанию ora2pgpro экспортирует таблицы Oracle со свойством NOLOGGING как UNLOGGED. Можно полностью отключить эту функциональность, поскольку данные из таблиц UNLOGGED могут быть потеряны в случае сбоя Postgres Pro. Если задать для директивы значение 1, все таблицы будут экспортировать как таблицы обычного типа.