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ável | Valor esperado |
| OCI_USER | Nome de usuário no mesmo formato que é exibido na console OCI (Canto superior direito -> Profile) |
| OCI_TOKEN | Texto secreto gerado na opção Auth Token (Profile -> User settings -> Auth Token -> Generate token) |
| OCI_REGION | Nome da região OCI onde o Bucket foi criado |
| OCI_NAMESPACE | Namespace do Object Storage do Tenancy OCI (Profile -> Tenancy -> Object storage namespace) |
| OCI_BUCKET | Nome 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.
Pingback: Como Executar o Oracle Real Application Testing (RAT) Database Replay no Autonomous Database (OCI) – Blog do Dibiei
Pingback: Testando o Desempenho de Consultas SQL no OCI Autonomous Database Utilizando SQL Performance Analyzer (SPA) – Blog do Dibiei