Benutzer-Werkzeuge

Webseiten-Werkzeuge


cloud:import_data_adb_oracle_cloud_26_ai

In eine Oracle 26ai ADB Datenbank Daten wie einen Export wieder importieren

Aufgabe

Daten aus einer 23ai Free Edition onPremise in eine Oracle 26ai in einer Cloud Umgebung umziehen.

Ablauf:

  • Daten mit expdp „normal“ aus der Datenbank auf Platte exportieren
  • Daten in die Cloud hochladen
  • URL auf die Datei erzeugen um ohne Credentials diese laden zu können
  • Daten in die Zieldaten direkt aus dem Cloud Store laden
Demnächst mehr

Daten exportieren

Problem in der 23ai Free Edition;

..
ORA-31693: Table data object "IGMTARIF"."THESAURUS_PHRASES" failed to load/unload and is being skipped due to error:
ORA-00923: FROM keyword not found where expected
..

Lösung: alle Annotation auf Spalten und Tabelle dieser Tabelle löschen! etwas in dem Text mag expdb (DBMS_METADATA?) nicht!


Daten hochladen und freigeben

In meiner Cloud haben ich einen Object Store, in dem ich den Export hochlanden kann.

In der Cloud wird dieser dann freigeben mit „Create pre-authenticated request“ (Drei Punkte Menü auf der hochgeladenen Datei ) freigeben und die dabei generierte URL kann im Datapump für den Import genützt werden.


Datapump Import Routine anlegen

Siehe auch Oracle 12c - Datapump Export mit PL/SQL - Import/Export aus der Datenbank starten

Procedure für den Import anlegen:

CREATE OR REPLACE PROCEDURE dp_import_user_schema (
    p_objectstorage_url   VARCHAR2,
    p_import_from_user   VARCHAR2,
    p_import_to_user     VARCHAR2
 
) IS
    v_dp_handle       NUMBER;
    v_job_name        VARCHAR2(256) := USER || '_IMPORT_' || TO_CHAR(SYSDATE, 'DD_HH24');
    v_log_file_name   VARCHAR2(256) := 'dp_import_' || TO_CHAR(SYSDATE, 'YYYYMMDD_HH24MISS') || '.log';
    v_job_status VARCHAR2(32000);
BEGIN
 
    DBMS_OUTPUT.PUT_LINE('--- Data Pump Import gestartet ---');
 
    DBMS_OUTPUT.PUT_LINE('Dump-Datei: '  || p_objectstorage_url);
    DBMS_OUTPUT.PUT_LINE('Von Schema: '  || p_import_from_user);
    DBMS_OUTPUT.PUT_LINE('Nach Schema: ' || p_import_to_user);
 
    -- Öffne Data Pump Job
    v_dp_handle := DBMS_DATAPUMP.OPEN(
        operation   => 'IMPORT',
        job_mode    => 'SCHEMA',
        job_name    => v_job_name
    );
 
    -- Dump-Datei hinzufügen
    DBMS_DATAPUMP.ADD_FILE(
        handle      => v_dp_handle,
        filename    => p_objectstorage_url,
        -- nicht verwenden bei URI sonst ORA-31631: privileges are required !!    directory   => 'DATA_PUMP_DIR',
        filetype    =>  DBMS_DATAPUMP.ku$_file_type_uridump_file  -- für direkte Datei importe Typ KU$_FILE_TYPE_DUMP_FILE
    );
 
    -- Log-Datei hinzufügen
    DBMS_DATAPUMP.ADD_FILE(
        handle      => v_dp_handle,
        filename    => v_log_file_name,
        directory   => 'DATA_PUMP_DIR',
        filetype    => DBMS_DATAPUMP.KU$_FILE_TYPE_LOG_FILE,
        reusefile   => 1
    );
 
    -- Filter: Nur das Quell-Schema importieren
    DBMS_DATAPUMP.METADATA_FILTER(
        handle => v_dp_handle,
        name   => 'SCHEMA_EXPR',
        VALUE  => 'IN (''' || p_import_from_user || ''')'
    );
 
 
    -- Remap Schema 
    DBMS_DATAPUMP.METADATA_REMAP(
        handle    => v_dp_handle,
        name      => 'REMAP_SCHEMA',
        old_value => p_import_from_user,
        VALUE     => p_import_to_user
    );
 
    -- Storage-Eigenschaften ignorieren
    DBMS_DATAPUMP.METADATA_TRANSFORM(
        handle => v_dp_handle,
        name   => 'DISABLE_STORAGE',
        VALUE  => 'Y'
    );
 
    -- Setze Parallelität auf 1
    DBMS_DATAPUMP.SET_PARALLEL(v_dp_handle, 1);
 
    -- Job starten
    DBMS_DATAPUMP.START_JOB(v_dp_handle);
 
    -- wait for import for this job
 
    dbms_datapump.wait_for_job(handle => v_dp_handle, job_state => v_job_status);
 
    DBMS_OUTPUT.PUT_LINE('--- '||v_job_status);
 
    DBMS_OUTPUT.PUT_LINE('--- Data Pump Import abgeschlossen ---');
END;
/

Import durchführen

SET serveroutput ON
BEGIN
dp_import_user_schema (
    p_objectstorage_url   => 'https://objectstorage.eu-frankfurt-1.oraclecloud.com/p/xxxxx/data01.dmp',
    p_import_from_user    => 'DATAGPI',
    p_import_to_user      => 'GPI_DATA'
);
END;
/

Problem

ORA-31631: privileges are required

Als Admin User ausgeführt! Hat die Rolle (SELECT * FROM SESSION_ROLES;) DATAPUMP_CLOUD_IMP.

Im ersten Schritt folgender Maßen die Daten aus meinen Cloud Speicher geladen und dann versucht diese zu importieren.

BEGIN
   DBMS_CLOUD.GET_OBJECT(
      object_uri => 'https://objectstorage.eu-frankfurt-1.oraclecloud.com/p/xxxxxxxxxxxxxx/data01.dmp',
      directory_name => 'DATA_PUMP_DIR'
   );
END;
/
 
SELECT * FROM DBMS_CLOUD.LIST_FILES('DATA_PUMP_DIR');

Import mit plsql:

..
 -- Dump-Datei aus DATA_PUMP_DIR hinzufügen
    DBMS_DATAPUMP.ADD_FILE(
        handle      => v_dp_handle,
        filename    => p_import_file_name,
        directory   => 'DATA_PUMP_DIR',
        filetype    => DBMS_DATAPUMP.KU$_FILE_TYPE_DUMP_FILE
    );
..    

In einer normalen DB würde das funktionieren, in der ADB ist hier wohl stärker eingeschränkt!

Nach dem Fehlschlag wieder löschen mit:

BEGIN
   DBMS_CLOUD.DELETE_FILE(
      directory_name =>  'DATA_PUMP_DIR',
      file_name => 'data01.dmp' );
   END;
/

Quellen

Web:

Bei Job Problemen:

  • How To Cleanup Orphaned DataPump Jobs In DBA_DATAPUMP_JOBS ? (Doc ID 336014.1)
Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
"Autor: Gunther Pipperr"
cloud/import_data_adb_oracle_cloud_26_ai.txt · Zuletzt geändert: von gpipperr