Had and old export dump file I wanted to import into RDS.
I first tried to use S3 as a hosting site for the .dmp file and use rdsadmin.rdsadmin_s3_tasks.download_from_s3 to copy the file to the RDS database then import it with DBMS_DATAPUMP.
Unfortunately DBMS_DATAPUMP only works with expdp files so instead of using DBMS_DATAPUMP , I got the old “imp” binary and used it with TWO_TASK to the RDS database I wanted it loaded into.
For the record here were the steps I took
First put the file into an S3 bucket called
kylelf-datadump
Create an IAM policy to allow Amazon RDS access to an Amazon S3 bucket
https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/oracle-s3-integration.html#oracle-s3-integration.preparing
My policy looks like
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:ListBucket" ], "Resource": "arn:aws:s3:::kylelf-datadump" } ] }
Create an IAM role to allow Amazon RDS access to an Amazon S3 bucket
again, see: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/oracle-s3-integration.html#oracle-s3-integration.preparing
add the role to the database you want to import into
-
Sign in to the AWS Management Console and open the Amazon RDS console at https://console.aws.amazon.com/rds/. Choose the Oracle DB instance name to display its details. On the Connectivity & security tab, in the Manage IAM roles section, choose the role to add under Add IAM roles to this instance. For Feature, choose S3_INTEGRATION.
create s3 option group
- create an option group
- add s3 integration to option group
- modify instance, change option group to s3 option group
Then download the dump file from S3.
SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3( p_bucket_name => 'kylelf-datadump', p_directory_name => 'DATA_PUMP_DIR') AS TASK_ID FROM DUAL;
TASK_ID
——————————————————————————–
1583185124793-43
Check status of download
SELECT text FROM
table(rdsadmin.rds_file_util.read_text_file(‘BDUMP’,’dbtask-1583185124793-43.log’));
Check to see the file is there
select * from table(RDSADMIN.RDS_FILE_UTIL.LISTDIR('DATA_PUMP_DIR')) order by mtime;
FILENAME- TYPE FILESIZE MTIME
---------- ---------- ---------
TC1.dmp file 39829504 02-MAR-20
My file is the TC1.dmp file
Now import it
DECLARE hdnl NUMBER; BEGIN hdnl := DBMS_DATAPUMP.OPEN( operation => 'IMPORT', job_mode => 'SCHEMA', job_name=>null); DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'TC1.dmp', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_dump_file); DBMS_DATAPUMP.METADATA_FILTER(hdnl,'SCHEMA_EXPR','IN (''KYLELF'')'); DBMS_DATAPUMP.START_JOB(hdnl); END; /
This gave me the error
ORA-39001: invalid argument value ORA-06512: at "SYS.DBMS_SYS_ERROR", line 79 ORA-06512: at "SYS.DBMS_DATAPUMP", line 3507 ORA-06512: at "SYS.DBMS_DATAPUMP", line 3756 ORA-06512: at line 5
Not very informative.
Found an example to get more verbose error messaging on
https://stackoverflow.com/questions/45348688/oracle-datapump-export-error-invalid-argument-value
SET VERIFY OFF SET FEEDBACK OFF SET SERVEROUTPUT ON DECLARE ind NUMBER; fileType NUMBER; value VARCHAR2(2048); infoTab KU$_DUMPFILE_INFO := KU$_DUMPFILE_INFO(); BEGIN -- -- Get the information about the dump file into the infoTab. -- BEGIN DBMS_DATAPUMP.GET_DUMPFILE_INFO('TC1.dmp','DATA_PUMP_DIR',infoTab,fileType); DBMS_OUTPUT.PUT_LINE('---------------------------------------------'); DBMS_OUTPUT.PUT_LINE('Information for file: TC1.dmp'); -- -- Determine what type of file is being looked at. -- CASE fileType WHEN 1 THEN DBMS_OUTPUT.PUT_LINE('TC1.dmp is a Data Pump dump file'); WHEN 2 THEN DBMS_OUTPUT.PUT_LINE('TC1.dmp is an Original Export dump file'); WHEN 3 THEN DBMS_OUTPUT.PUT_LINE('TC1.dmp is an External Table dump file'); ELSE DBMS_OUTPUT.PUT_LINE('TC1.dmp is not a dump file'); DBMS_OUTPUT.PUT_LINE('---------------------------------------------'); END CASE; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('---------------------------------------------'); DBMS_OUTPUT.PUT_LINE('Error retrieving information for file: ' || 'TC1.dmp'); DBMS_OUTPUT.PUT_LINE(SQLERRM); DBMS_OUTPUT.PUT_LINE('---------------------------------------------'); fileType := 0; END; -- -- If a valid file type was returned, then loop through the infoTab and -- display each item code and value returned. -- IF fileType > 0 THEN DBMS_OUTPUT.PUT_LINE('The information table has ' || TO_CHAR(infoTab.COUNT) || ' entries'); DBMS_OUTPUT.PUT_LINE('---------------------------------------------'); ind := infoTab.FIRST; WHILE ind IS NOT NULL LOOP -- -- The following item codes return boolean values in the form -- of a '1' or a '0'. Display them as 'Yes' or 'No'. -- value := NVL(infoTab(ind).value, 'NULL'); IF infoTab(ind).item_code IN (DBMS_DATAPUMP.KU$_DFHDR_MASTER_PRESENT, DBMS_DATAPUMP.KU$_DFHDR_DIRPATH, DBMS_DATAPUMP.KU$_DFHDR_METADATA_COMPRESSED, DBMS_DATAPUMP.KU$_DFHDR_DATA_COMPRESSED, DBMS_DATAPUMP.KU$_DFHDR_METADATA_ENCRYPTED, DBMS_DATAPUMP.KU$_DFHDR_DATA_ENCRYPTED, DBMS_DATAPUMP.KU$_DFHDR_COLUMNS_ENCRYPTED) THEN CASE value WHEN '1' THEN value := 'Yes'; WHEN '0' THEN value := 'No'; END CASE; END IF; -- -- Display each item code with an appropriate name followed by -- its value. -- CASE infoTab(ind).item_code -- -- The following item codes have been available since Oracle -- Database 10g, Release 10.2. -- WHEN DBMS_DATAPUMP.KU$_DFHDR_FILE_VERSION THEN DBMS_OUTPUT.PUT_LINE('Dump File Version: ' || value); WHEN DBMS_DATAPUMP.KU$_DFHDR_MASTER_PRESENT THEN DBMS_OUTPUT.PUT_LINE('Master Table Present: ' || value); WHEN DBMS_DATAPUMP.KU$_DFHDR_GUID THEN DBMS_OUTPUT.PUT_LINE('Job Guid: ' || value); WHEN DBMS_DATAPUMP.KU$_DFHDR_FILE_NUMBER THEN DBMS_OUTPUT.PUT_LINE('Dump File Number: ' || value); WHEN DBMS_DATAPUMP.KU$_DFHDR_CHARSET_ID THEN DBMS_OUTPUT.PUT_LINE('Character Set ID: ' || value); WHEN DBMS_DATAPUMP.KU$_DFHDR_CREATION_DATE THEN DBMS_OUTPUT.PUT_LINE('Creation Date: ' || value); WHEN DBMS_DATAPUMP.KU$_DFHDR_FLAGS THEN DBMS_OUTPUT.PUT_LINE('Internal Dump Flags: ' || value); WHEN DBMS_DATAPUMP.KU$_DFHDR_JOB_NAME THEN DBMS_OUTPUT.PUT_LINE('Job Name: ' || value); WHEN DBMS_DATAPUMP.KU$_DFHDR_PLATFORM THEN DBMS_OUTPUT.PUT_LINE('Platform Name: ' || value); WHEN DBMS_DATAPUMP.KU$_DFHDR_INSTANCE THEN DBMS_OUTPUT.PUT_LINE('Instance Name: ' || value); WHEN DBMS_DATAPUMP.KU$_DFHDR_LANGUAGE THEN DBMS_OUTPUT.PUT_LINE('Language Name: ' || value); WHEN DBMS_DATAPUMP.KU$_DFHDR_BLOCKSIZE THEN DBMS_OUTPUT.PUT_LINE('Dump File Block Size: ' || value); WHEN DBMS_DATAPUMP.KU$_DFHDR_DIRPATH THEN DBMS_OUTPUT.PUT_LINE('Direct Path Mode: ' || value); WHEN DBMS_DATAPUMP.KU$_DFHDR_METADATA_COMPRESSED THEN DBMS_OUTPUT.PUT_LINE('Metadata Compressed: ' || value); WHEN DBMS_DATAPUMP.KU$_DFHDR_DB_VERSION THEN DBMS_OUTPUT.PUT_LINE('Database Version: ' || value); -- -- The following item codes were introduced in Oracle Database 11g -- Release 11.1 -- WHEN DBMS_DATAPUMP.KU$_DFHDR_MASTER_PIECE_COUNT THEN DBMS_OUTPUT.PUT_LINE('Master Table Piece Count: ' || value); WHEN DBMS_DATAPUMP.KU$_DFHDR_MASTER_PIECE_NUMBER THEN DBMS_OUTPUT.PUT_LINE('Master Table Piece Number: ' || value); WHEN DBMS_DATAPUMP.KU$_DFHDR_DATA_COMPRESSED THEN DBMS_OUTPUT.PUT_LINE('Table Data Compressed: ' || value); WHEN DBMS_DATAPUMP.KU$_DFHDR_METADATA_ENCRYPTED THEN DBMS_OUTPUT.PUT_LINE('Metadata Encrypted: ' || value); WHEN DBMS_DATAPUMP.KU$_DFHDR_DATA_ENCRYPTED THEN DBMS_OUTPUT.PUT_LINE('Table Data Encrypted: ' || value); WHEN DBMS_DATAPUMP.KU$_DFHDR_COLUMNS_ENCRYPTED THEN DBMS_OUTPUT.PUT_LINE('TDE Columns Encrypted: ' || value); -- -- For the DBMS_DATAPUMP.KU$_DFHDR_ENCRYPTION_MODE item code a -- numeric value is returned. So examine that numeric value -- and display an appropriate name value for it. -- WHEN DBMS_DATAPUMP.KU$_DFHDR_ENCRYPTION_MODE THEN CASE TO_NUMBER(value) WHEN DBMS_DATAPUMP.KU$_DFHDR_ENCMODE_NONE THEN DBMS_OUTPUT.PUT_LINE('Encryption Mode: None'); WHEN DBMS_DATAPUMP.KU$_DFHDR_ENCMODE_PASSWORD THEN DBMS_OUTPUT.PUT_LINE('Encryption Mode: Password'); WHEN DBMS_DATAPUMP.KU$_DFHDR_ENCMODE_DUAL THEN DBMS_OUTPUT.PUT_LINE('Encryption Mode: Dual'); WHEN DBMS_DATAPUMP.KU$_DFHDR_ENCMODE_TRANS THEN DBMS_OUTPUT.PUT_LINE('Encryption Mode: Transparent'); END CASE; -- -- The following item codes were introduced in Oracle Database 12c -- Release 12.1 -- -- -- For the DBMS_DATAPUMP.KU$_DFHDR_COMPRESSION_ALG item code a -- numeric value is returned. So examine that numeric value and -- display an appropriate name value for it. -- END CASE; ind := infoTab.NEXT(ind); END LOOP; END IF; END; /
Now I can see the error better:
39001: ORA-39001: invalid argument value -39000: ORA-39000: bad dump file specification -39143: ORA-39143: dump file "/rdsdbdata/datapump/TC1.dmp" may be an original export dump file
Looking this up via google, indicates that this is an old “exp” dump file and is not compatible with “impdp”
Thus have use old imp tool
Off of OTN
https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html
I got
oracle-instantclient19.6-basic-19.6.0.0.0-1.x86_64.rpm oracle-instantclient19.6-sqlplus-19.6.0.0.0-1.x86_64.rpm oracle-instantclient19.6-tools-19.6.0.0.0-1.x86_64.rpm
Installed these on an EC2
sudo rpm -ivh
sudo rpm -ivh oracle-instantclient19.6-basic-19.6.0.0.0-1.x86_64.rpm sudo rpm -ivh oracle-instantclient19.6-sqlplus-19.6.0.0.0-1.x86_64.rpm sudo rpm -ivh oracle-instantclient19.6-tools-19.6.0.0.0-1.x86_64.rpm
Then copy the TC1.dmp file to the EC2
Then use TWO_TASK to point to my database
export TWO_TASK='(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=ora19.xxxxxxxx.us-east-1.rds.amazonaws.com)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl)))‘
/usr/lib/oracle/19.6/client64/bin/imp user/pw file=TC1.dmp FROMUSER=’scott’ TOUSER=’kylelf’
also had a hiccup because the first database I used was 11.2 and the imp is from 19.0 distribution so got error
IIMP-00003: ORACLE error 942 encountered ORA-00942: table or view does not exist IMP-00023: Import views not installed, please notify your DBA IMP-00000: Import terminated unsuccessfully
So bad to create a version 19 Oracle database and then the import worked