Aufgabe
Daten aus einer 23ai Free Edition onPremise in eine Oracle 26ai in einer Cloud Umgebung umziehen.
Ablauf:
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!
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.
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; /
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; /
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; /
Web:
Bei Job Problemen: