Oracle DB, Oracle APEX, Linux etc.

вторник, 25 октября 2016 г.

Oracle Multitenant: Data Pump + DATA_PUMP_DIR = ORA-39001

Основная фича Oracle 12c -- Multitenant -- вместе с удобством администрирования привнесла и проблемы. Одна из них -- невозможность экспорта из и импорта в подключаемые БД, используя создаваемую по умолчанию директорию DATA_PUMP_DIR:

The default Data Pump directory object, DATA_PUMP_DIR, does not work with PDBs. You must define an explicit directory object within the PDB that you are exporting or importing.

При этом вы можете спокойно использовать эту директорию из подключаемой БД, работая с файлами через UTL_FILE. Похоже, проблема в том, что Data Pump фильтрует доступные в БД директории по ORIGIN_CON_ID:

SQL> select origin_con_id
  2    from dba_directories
  3   where directory_name = 'DATA_PUMP_DIR'
  4  /

ORIGIN_CON_ID
-------------
            1

SQL> show con_id

CON_ID
-------------
3 

Проблема решается одним из двух способов:
  1. Создать свою директорию в подключаемой БД и дать права на её чтение и запись отдельному пользователю, если требуется:

    SQL> create directory pdb1_data_pump_dir as '/path/to/dir';
    
    Directory created.
    
    SQL> grant read, write on directory pdb1_data_pump_dir to system;
    
    Grant succeeded.
  2. Удалить директорию DATA_PUMP_DIR в корневом контейнере и создать её там с параметром сессии "_oracle_script"=FALSE, а затем создать её же в каждой подключаемой БД (и в шаблоне БД):
    SQL> conn / as sysdba
    Connected.
    SQL> show con_id
    
    CON_ID
    ----------------
    1
    
    SQL> drop directory data_pump_dir;
    
    Directory dropped.
    
    SQL> alter session set "_oracle_script" = false;
    
    Session altered.
    
    SQL> create directory data_pump_dir as '/path/to/dir';
    
    Directory created.
    
    SQL> grant read, write on directory data_pump_dir to system;
    
    Grant succeeded.
    
    SQL> alter session set container = pdb1;
    
    Session altered.
    
    SQL> create directory data_pump_dir as '/path/to/dir';
    
    Directory created.
    
    SQL> grant read, write on directory data_pump_dir to system;
    
    Grant succeeded.

Читать далее