Why do I need to “easily” connect to my Autonomous Database from Cloud Shell? Moreover, why do I need to “easily” generate a Database Link?

Establishing a connection to your Autonomous Database through the Oracle Cloud Infrastructure Cloud Shell may seem overwhelming, especially for new users. The task of gathering the required infromation can be a daunting task. Moreover, integrating a Database Link into the mix adds an additional layer of complexity.

This blog aims to simplify this process. By ensuring you have key information at hand, namely, your Compartment Name, Database Name, Bucket Name, and Username & Password for your Autonomous Databases, you can effortlessly set up a connection and generate a script that can be used to create a database link. 

This post adds additional context to both “Simple steps to manage Autonomous Database from OCI Cloud Shell” by Dan Yadav and “Connecting to Your Autonomous Database Has Never Been Easier” by Can Tuzla.

Log into your Tenancy, then open the Cloud Shell.

Connect to Cloud Shell

Edit a few simple variables, then run this to connect to your Autonomous Database.

# EDIT THESE
my_compartment='development'
my_adw='ADAMADW' ## CASE IS IMPORTANT
my_adw_user='ADMIN'
my_adw_pw='Welcome_12345'

# THIS WILL SETUP A CONNECTION TO YOUR AUTONOMOUS DATABASE, EDITING IS NOT ADVISED
oci db autonomous-database generate-wallet --autonomous-database-id $(oci db autonomous-database list\
  --compartment-id $(oci iam compartment list --all --include-root --access-level ACCESSIBLE |\
  jq -r '.data[] | select(.name=="'${my_compartment,,}'") | .id') |\
  jq -r '.data[] | select(."display-name"=="'${my_adw}'") | .id') \
--password ${my_adw_pw} --file ${my_adw}_wallet.zip
mkdir ${my_adw}_wallet ; unzip ${my_adw}_wallet.zip -d ${my_adw}_wallet ; rm ${my_adw}_wallet.zip
sed -i.bak "s|(DIRECTORY=\"?/network/admin\")|(DIRECTORY=\"${HOME}/${my_adw}_wallet\")|g"\
~/${my_adw}_wallet/sqlnet.ora
export TNS_ADMIN=~/${my_adw}_wallet

sql ${my_adw_user,,}/${my_adw_pw}@${my_adw}_high

Edit a few simple variables, then Generate a script to create a Database Link.

# EDIT THESE
my_compartment='test'
my_adw='SCOTTADW' ## CASE IS IMPORTANT
my_adw_user='ADMIN'
my_adw_pw='Welcome_12345'
my_bucket='jawhite-bucket'
 
# THIS WILL SETUP A CONNECTION TO YOUR AUTONOMOUS DATABASE, EDITING IS NOT ADVISED
# MORE IMPORTANTLY IT WILL MAKE THE cwallet.sso FILE AVAILABLE TO UPLOAD TO CLOUD STORE
oci db autonomous-database generate-wallet --autonomous-database-id $(oci db autonomous-database list\
  --compartment-id $(oci iam compartment list --all --include-root --access-level ACCESSIBLE |\
  jq -r '.data[] | select(.name=="'${my_compartment,,}'") | .id') |\
  jq -r '.data[] | select(."display-name"=="'${my_adw}'") | .id') \
--password ${my_adw_pw} --file ${my_adw}_wallet.zip
mkdir ${my_adw}_wallet ; unzip ${my_adw}_wallet.zip -d ${my_adw}_wallet ; rm ${my_adw}_wallet.zip
sed -i.bak "s|(DIRECTORY=\"?/network/admin\")|(DIRECTORY=\"${HOME}/${my_adw}_wallet\")|g"\
~/${my_adw}_wallet/sqlnet.ora
 
# ADDING A BIT HERE TO UPLOAD cwallet.sso FILE TO OBJECT STORE
oci os object put --bucket-name ${my_bucket} --namespace $(oci os ns get --query "data" \
--raw-output) --file ${HOME}/${my_adw}_wallet/cwallet.sso --name ${my_adw,,}/cwallet.sso
 
# THIS WILL GENERATE THE SCRIPT, EDITING IS NOT ADVISED
my_adw_string=$(oci db autonomous-database list --compartment-id $(oci iam compartment list --all --include-root \
--access-level ACCESSIBLE | jq -r '.data[] | select(.name=="'${my_compartment,,}'") | .id')|\
jq -r '.data[] | select((."id" == "'$(oci db autonomous-database list --compartment-id \
$(oci iam compartment list --all --include-root --access-level ACCESSIBLE |\
jq -r '.data[] | select(.name=="'${my_compartment,,}'") | .id') |\
jq -r '.data[] | select(."display-name"=="'${my_adw}'") | .id')'")) | ."connection-strings"."all-connection-strings".HIGH')
 
echo -e "CREATE OR REPLACE DIRECTORY ${my_adw^^}_DIR AS '${my_adw,,}_dir';\n\n\
BEGIN\n\tDBMS_CLOUD_ADMIN.DROP_DATABASE_LINK('${my_adw^^}DBLINK');\nEXCEPTION WHEN OTHERS THEN NULL;\nEND;\n/\n\n\
BEGIN\n\tDBMS_CLOUD.DROP_CREDENTIAL('${my_adw^^}_DBLINK_CRED');\nEXCEPTION WHEN OTHERS THEN NULL;\nEND;\n/\n\n\
BEGIN\n\tDBMS_CLOUD.CREATE_CREDENTIAL(\n\t\tcredential_name => '${my_adw^^}_DBLINK_CRED',\n\t\tusername =>\
 '${my_adw_user^^}',\n\t\tpassword => '${my_adw_pw}');\nEND;\n/\n\n\
BEGIN\n\tDBMS_CLOUD.DROP_CREDENTIAL(\n\t\tcredential_name => 'OCI_NATIVE_CRED');\nEXCEPTION WHEN OTHERS THEN NULL;\nEND;\n/\n\n\
BEGIN\n\tDBMS_CLOUD.CREATE_CREDENTIAL(\n\t\tcredential_name => 'OCI_NATIVE_CRED',\n\t\tuser_ocid => '${OCI_CS_USER_OCID}',\
\n\t\ttenancy_ocid => '${OCI_TENANCY}',\n\t\tprivate_key => '$(cat $(awk -F'key_file=' '/key_file=/ {print $2}' ~/.oci/config)|\
tr -d '\n' | sed 's/-----BEGIN PRIVATE KEY-----//;' | sed 's/-----END PRIVATE KEY-----//;')',\n\t\tfingerprint => \
'$(grep '^fingerprint=' .oci/config | sed -e 's/^fingerprint=//')');\nEND;\n/\n\n\
BEGIN\n\tDBMS_CLOUD.GET_OBJECT(\n\t\tobject_uri => \
'https://objectstorage.${OCI_REGION}.oraclecloud.com/n/$(oci os ns get --query "data" --raw-output)/b/${my_bucket}/o/${my_adw,,}%2Fcwallet.sso',\n\t\tcredential_name => 'OCI_NATIVE_CRED',\n\t\tdirectory_name => '${my_adw^^}_DIR');\nEND;\n/\n\n\
BEGIN\n\tDBMS_CLOUD_ADMIN.CREATE_DATABASE_LINK(\n\t\tdb_link_name => '${my_adw^^}DBLINK',\n\t\thostname => \
'$(echo ${my_adw_string}|cut -d':' -f1)',\n\t\tport => \
'$(echo ${my_adw_string}|cut -d':' -f2|cut -d'/' -f1)',\n\t\t\
service_name => '$(echo ${my_adw_string}|cut -d'/' -f2)',\n\t\tcredential_name => '${my_adw^^}_DBLINK_CRED',\n\t\t\
directory_name => '${my_adw^^}_DIR');\nEND;\n/\n\nexit;"|expand -t 2 > ${my_adw,,}_dblink.sql
chmod go-rw ${my_adw,,}_dblink.sql
  
unset my_adw my_adw_pw my_adw_user my_compartment my_bucket

Display the output of the Database Link Script that was generated.

echo ${my_adw,,}_dblink.sql
scottadw_dblink.sql

more scottadw_dblink.sql

CREATE OR REPLACE DIRECTORY SCOTTADW_DIR AS 'scottadw_dir';

BEGIN
  DBMS_CLOUD_ADMIN.DROP_DATABASE_LINK('SCOTTADWDBLINK');
EXCEPTION WHEN OTHERS THEN NULL;
END;
/

BEGIN
  DBMS_CLOUD.DROP_CREDENTIAL('SCOTTADW_DBLINK_CRED');
EXCEPTION WHEN OTHERS THEN NULL;
END;
/

BEGIN
  DBMS_CLOUD.CREATE_CREDENTIAL(
    credential_name => 'SCOTTADW_DBLINK_CRED',
    username => 'ADMIN',
    password => 'Welcome_12345');
END;
/

BEGIN
  DBMS_CLOUD.DROP_CREDENTIAL('OCI_NATIVE_CRED');
EXCEPTION WHEN OTHERS THEN NULL;
END;
/

BEGIN
  DBMS_CLOUD.CREATE_CREDENTIAL(
    credential_name => 'OCI_NATIVE_CRED',
    user_ocid => 'ocid1.user.oc1..blahblahblahblahblahblahblahblahblahblahblahblahblahblahblah',
    tenancy_ocid => 'ocid1.tenancy.oc1..blahblahblahblahblahblahblahblahblahblahblahblahblahblahblahb'
    private_key =>  'blahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahb
lahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahbla
hblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahb
lahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahbla
hblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahb
lahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahbla
hblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahb
lahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahbla
hblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahb
lahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahbla
hblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahb
lahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahbla
hblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahb
lahblahblahblahblahblahblahblahblahblah',
    fingerprint => 'bl:ah:bl:ah:bl:ah:bl:ah:bl:ah:bl:ah:bl:ah:bl:ah'
  );
END;
/

BEGIN
  DBMS_CLOUD.GET_OBJECT(
    object_uri => 'https://objectstorage.us-ashburn-1.oraclecloud.com/n/blahblahblah/b/jawhite-bucket/o/scottadw%2Fcwallet.sso',
    credential_name => 'OCI_NATIVE_CRED',
    directory_name => 'SCOTTADW_DIR');
END;
/

BEGIN
  DBMS_CLOUD_ADMIN.CREATE_DATABASE_LINK(
    db_link_name => 'SCOTTADWDBLINK',
    hostname => 'adb.us-ashburn-1.oraclecloud.com',
    port => '1522',
    service_name => 'blahblahblahbla_scottadw_high.adb.oraclecloud.com',
    credential_name => 'SCOTTADW_DBLINK_CRED',
    directory_name => 'SCOTTADW_DIR');
END;
/

exit;

Create a Database Link to ScottADW from AdamADW

my_adw='ADAMADW' ## CASE IS IMPORTANT 
my_adw_user='ADMIN' 
my_adw_pw='Welcome_12345'

export TNS_ADMIN=~/${my_adw}_wallet 
sql ${my_adw_user,,}/${my_adw_pw}@${my_adw}_high @ scottadw_dblink.sql
unset my_adw my_adw_pw my_adw_user