Script upload_to_oci.sh – Simplificando o Upload de Múltiplos Arquivos Para um Bucket OCI usando CURL

Em 2021 eu escrevi o post “Dica Rápida: Copiando Múltiplos Dumpfiles para um Bucket no OCI Object Storage via OCI Command Line” demonstrando como utilizar o OCI CLI para fazer o upload de múltiplos arquivos para um Bucket na OCI. Hoje estou disponibilizando um Shell Script simples que criei para conseguir realizar a mesma tarefa, mas usando o CURL, um utilitário disponível na maioria das distribuições Linux.

Nessa abordagem, não há necessidade de instalar e configurar o OCI CLI no servidor de banco de dados, ou ter que copiar os arquivos para um servidor intermediário que já possua o OCI CLI.

O meu caso de uso comum é para fazer upload de arquivos de export de DataPump e capturas do Oracle RAT, onde é necessário carregar todos os arquivos na íntegra para o Bucket OCI, da mesma forma que foram gerados no Filesystem local.

Script:

#!/bin/bash
# upload_to_oci.sh v2
# Maicon Carneiro - 10/02/2023
# Maicon Carneiro - 22/06/2023 - Added support for single file upload

######### User & Object Storage Information ###########
export OCI_USER="oracleidentitycloudservice/account@example.com"
export OCI_TOKEN="XXXYYYZZZWWWW@#$%"
export OCI_REGION="sa-saopaulo-1"
export OCI_NAMESPACE="abcdefghij"
export OCI_BUCKET="adb-rat"
######################################################

export LOCAL_DIR=$1
export IS_OK="NO"

if [ -z $LOCAL_DIR ]; then
 LOCAL_DIR=$(pwd)
fi

if [ -d $LOCAL_DIR ] || [ -f $LOCAL_DIR ]; then
 IS_OK="YES"
fi

if [ "$IS_OK" == "NO" ] || [ "$LOCAL_DIR" == "/" ]; then
echo "Source file or directory is not valid."
exit 1
fi

# get the folder name to be created in the Bucket
if [ -d $LOCAL_DIR ]; then
 export LOCAL_DIR_TYPE='FOLDER'
 export FOLDER_NAME=$(basename "$LOCAL_DIR")
else
 export LOCAL_DIR_TYPE="FILE"
 export FOLDER_NAME=$(basename $(dirname "$LOCAL_DIR") )
fi

# generate the URL template for OCI Bucket
export URL_BASE="https://swiftobjectstorage.$OCI_REGION.oraclecloud.com/v1/$OCI_NAMESPACE/$OCI_BUCKET/$FOLDER_NAME"

echo "Mode: $LOCAL_DIR_TYPE"
echo ""; 
echo "URL template:"
echo $URL_BASE
echo "";

for FILE_NAME in $(find $LOCAL_DIR); do

 FILE_NAME_BUCKET=$(echo ${FILE_NAME/$LOCAL_DIR/""})
 URL="${URL_BASE}/${FILE_NAME_BUCKET}"

 if [ -f $FILE_NAME ]; then
  echo "$(date +"%d/%m/%Y %H:%M:%S") -> Uploading file $FILE_NAME ..."
  curl -u $OCI_USER:$OCI_TOKEN -X PUT $URL -T $FILE_NAME
 fi

done;

Atualizado: 22/06/2023.

Informações básicas que precisam ser ajustadas com os dados corretos da sua conta OCI:

VariávelValor esperado
OCI_USERNome de usuário no mesmo formato que é exibido na console OCI (Canto superior direito -> Profile)
OCI_TOKENTexto secreto gerado na opção Auth Token (Profile -> User settings -> Auth Token -> Generate token)
OCI_REGIONNome da região OCI onde o Bucket foi criado
OCI_NAMESPACENamespace do Object Storage do Tenancy OCI (Profile -> Tenancy -> Object storage namespace)
OCI_BUCKETNome do Bucket criado no Object Storage

Como usar:

./upload_to_oci.sh <diretorio>

Exemplo:

[oracle@lab01 ~]$ ./upload_to_oci.sh /u01/capture/

URL template:
https://swiftobjectstorage.sa-saopaulo-1.oraclecloud.com/v1/grupbuuadgbc/adb-rat/capture
11/02/2023 20:10:52 -> Uploading file /u01/capture/cap/wcr_scapture.wmd ...
11/02/2023 20:10:53 -> Uploading file /u01/capture/cap/wcr_fcapture.wmd ...
11/02/2023 20:10:53 -> Uploading file /u01/capture/cap/wcr_cr.html ...
11/02/2023 20:10:54 -> Uploading file /u01/capture/cap/wcr_cr.text ...
11/02/2023 20:10:54 -> Uploading file /u01/capture/capfiles/inst1/aa/wcr_fb2dwh0000000.rec ...
11/02/2023 20:10:55 -> Uploading file /u01/capture/capfiles/inst1/aa/wcr_fb2dyh0000001.rec ...
11/02/2023 20:10:55 -> Uploading file /u01/capture/capfiles/inst1/aa/wcr_fb2fph0000002.rec ...
11/02/2023 20:10:55 -> Uploading file /u01/capture/capfiles/inst1/aa/wcr_fb2ghh0000004.rec ...
11/02/2023 20:10:56 -> Uploading file /u01/capture/capfiles/inst1/aa/wcr_fb2hxh0000005.rec ...
11/02/2023 20:10:56 -> Uploading file /u01/capture/capfiles/inst1/aa/wcr_fb2qah0000007.rec ...
11/02/2023 20:10:56 -> Uploading file /u01/capture/capfiles/inst1/aa/wcr_fb2frh0000003.rec ...
11/02/2023 20:10:57 -> Uploading file /u01/capture/capfiles/inst1/aa/wcr_fb2vzh0000008.rec ...
11/02/2023 20:10:57 -> Uploading file /u01/capture/capfiles/inst1/aa/wcr_fb2jhh0000006.rec ...

Os arquivos e diretórios são carregados no Bucket na mesma estrutura em que são lidos no filesystem local (o último diretório do caminho fornecido ao script é usado como diretório inicial no Bucket ):

O script tem uma limitação técnica em que ele não carrega os diretórios vazios, mas isso não tem sido um problema nos meus casos de uso. Exemplo: O RAT gera uma estrutura de diretórios aa, ab, ac, ad, etc. Mas se somente o diretório aa tiver arquivos de captura, somente este diretório é carregado para o Bucket.

A vantagem de usar essa abordagem é que o único requisito é que o servidor tenha saída para internet, não sendo necessário instalar nenhum pacote ou cliente no servidor de banco de dados. Uma vez ajustado as variáveis de ambiente, o script pode ser facilmente copiado de um servidor para o outro e reutilizado sem muito esforço de configuração. Espero que o script seja útil para você, e se não atender integralmente suas necessidades, que sirva como um ponto de partida para uma abordagem mais customizada.

2 thoughts on “Script upload_to_oci.sh – Simplificando o Upload de Múltiplos Arquivos Para um Bucket OCI usando CURL”

  1. Pingback: Como Executar o Oracle Real Application Testing (RAT) Database Replay no Autonomous Database (OCI) – Blog do Dibiei

  2. Pingback: Testando o Desempenho de Consultas SQL no OCI Autonomous Database Utilizando SQL Performance Analyzer (SPA) – Blog do Dibiei

Leave a Reply

Scroll to Top

Discover more from Blog do Dibiei

Subscribe now to keep reading and get access to the full archive.

Continue reading