Today we had a requirement to copy a file from a Linux on-prem server to an AWS RDS Oracle instance. We did this using a DB link and utl_file utility. For the rest of this post, “ONP” will refer to the on-prem instance, and “ADS” will refer to the AWS RDS Oracle instance.
On the AWS RDS Oracle instance, create a DB link to the on-prem instance
create database link AWS_TO_ON_PREM CONNECT TO ONPUSER IDENTIFIED BY SECRET-PASSWORD USING '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = ONPREM.HOST.COM)(PORT = 1776)) ) (CONNECT_DATA = (SERVICE_NAME = ONPDB) ) )' ;
On the AWS RDS Oracle instance, create a directory to store the file
exec rdsadmin.rdsadmin_util.create_directory('ADS_DIRECTORY');
Check that the directory got created
Select * from dba_directories;
As AWS manages the path internally, the above SQL will return the actual directory path.
On the on-prem instance, create a directory pointing to the location of the file that you want to copy to AWS
CREATE OR REPLACE DIRECTORY FOR_AWS AS '/onprem/host/file/location/file_for_aws.bin'; GRANT READ, WRITE ON DIRECTORY FOR_AWS TO ONPUSER;
Now to copy the file from the on-prem instance to the AWS instance. This is accomplished via the below PL/SQL which is to be executed while connected to the AWS RDS Oracle instance. In our case, the data was binary (raw) data
declare ONP utl_file.file_type@AWS_TO_ON_PREM; ADS utl_file.file_type; ldata raw(32767); begin ONP := utl_file.fopen@AWS_TO_ON_PREM(location=>'FOR_ADS', filename=>'file_for_aws.bin', open_mode=>'rb'); ADS := utl_file.fopen(location=>'ADS_DIRECTORY', filename=>'file_for_aws.bin', open_mode=>'wb'); begin loop begin utl_file.get_raw@AWS_TO_ON_PREM(ONP, ldata, 32767); utl_file.put_raw(ADS, ldata, true); exception when no_data_found then exit; end; end loop; end; utl_file.fclose@AWS_TO_ON_PREM (ONP); utl_file.fclose(ADS); exception when others then utl_file.fclose@AWS_TO_ON_PREM(ONP); utl_file.fclose(ADS); raise; end; /
After the above is complete, check that the file size in AWS matches the file size from on-prem with this sql
select filesize, mtime from table(rdsadmin.rds_file_util.listdir('ADS_DIRECTORY')) where filename='file_for_aws.bin' ;
If you need to delete a file in AWS, you can use this command
exec utl_file.fremove('directory-name','file-name');
I am very thankful for your effortsto putt on this article.
This guide is translucent, updated and very informative.
Can I expect you will post this sort of another article in near future?
King regards,
Mead Raahauge