Cenário
Um banco de dados BITESTE configurado com Transparent Data Encryption foi convertido de Single Instance para RAC, originalmente a wallet era mantida e em sua localização default: $ORACLE_BASE/admin/<DB_UNIQUE_NAME>/wallet.
Em RAC, a wallet deve ser acessível por todas as instâncias do banco de dados no cluster, senão, o status poderá ficar OPEN em uma instância e CLOSED na outra, gerando erro na execução de SQL das sessões que conectam na segunda instância.
A solução mais simples seria copiar a wallet para o segundo nó, colocando no mesmo diretório. O lado negativo dessa abordagem seria o esforço adicional em manter uma cópia da wallet sempre atualizada em cada node.
A solução utilizada foi armazenar a wallet em um ACFS compartilhado entre os nodes e ajustar o parâmetro ENCRYPTION_WALLET_LOCATION no sqlnet.ora apontando para o novo diretório. O ponto de atenção aqui é que esse parâmetro afeta outros bancos de dados vinculados com o mesmo ORACLE_HOME, caso existam outros bancos de dados com TDE, eles precisam ser configurados seguindo o mesmo padrão.
Pré requisitos
Transparent Data Encryption já deve estar configurado, apenas demonstro como centralizar a wallet;
Filesystem ACFS previamente configurado, não abordarei essa etapa;
Passo a passo
1) Criar diretório para o banco de dados no filesystem compartilhado:
mkdir -p /opt/oracle/dcs/commonstore/BITESTE/wallet
Nota: /opt/oracle/dcs/commonstore/ é o filesystem ACFS
2) Cópia dos arquivos da wallet para o novo destino:
cp /u01/app/oracle/admin/BITESTE/wallet/* /opt/oracle/dcs/commonstore/BITESTE/wallet/
3) Editamos o arquivo sqlnet.ora de cada node incluindo o parâmetro ENCRYPTION_WALLET_LOCATION, apesar desse parâmetro aplicar-se a todas as instâncias que executam no mesmo ORACLE_HOME, a utilização da variável de ambiente ORACLE_UNQNAME resulta caminhos absolutos diferentes para cada banco de dados de forma dinâmica:
ENCRYPTION_WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/opt/oracle/dcs/commonstore/$ORACLE_UNQNAME/wallet)))
4) Por ter mais de um banco no mesmo cluster, não podemos definir a variável ORACLE_UNQNAME no .bash_profile do oracle, devemos configurar no profile do banco no Clusterware para definir a variável de ambiente ao iniciar as instâncias desse banco de dados:
srvctl setenv database -d biteste -t "ORACLE_UNQNAME=BITESTE"
5) Reiniciamos o banco de dados para as instâncias subirem com a nova configuração (também pode baixar e subir uma instância por vez):
srvctl stop database -d biteste
srvctl start database -d biteste
Consultando o caminho e o status da wallet na view GV$ENCRYPTION_WALLET:
SQL> SELECT * FROM GV$ENCRYPTION_WALLET;
INST_ID WRL_TYPE WRL_PARAMETER STATUS
---------- ---------- ---------------------------------------------------------------------- --------------------
2 file /opt/oracle/dcs/commonstore/$ORACLE_UNQNAME/wallet OPEN
1 file /opt/oracle/dcs/commonstore/$ORACLE_UNQNAME/wallet OPEN
Observação:
Essa á uma abordagem recomendada até a versão 12cR2, a partir do 18c temos a possibilidade de configurar o caminho da wallet através do parâmetro WALLET_ROOT no spfile, simplificando e tornando a configuração mais flexível.
Referência do parâmetro WALLET_ROOT no 19c:
[…] Se for um Oracle RAC, a wallet precisa estar acessível para todas as instâncias. Você pode copiar os arquivos de um node para o outro, mas o ideal é centralizar em um Cluster File Sync, conforme demonstro nesse post: TDE: Mover Wallet para localização centralizada no Oracle RAC […]
[…] Se for um Oracle RAC, a wallet precisa estar acessível para todas as instâncias. Você pode copiar os arquivos de um node para o outro, mas o ideal é centralizar em um Cluster File System, conforme demonstro nesse post: TDE: Mover Wallet para localização centralizada no Oracle RAC […]