Olá amigos e amigas, sejam bem-vindos! Hoje, vou demonstrar como realizar o rename de um diskgroup (DG) e seus discos no Oracle RAC 19c. Esse procedimento faz-se necessário quando utilizamos técnicas de cópia de bancos via storage, onde as propriedades dos diskgroups e discos são replicadas, podendo gerar conflitos de nomes se houver múltiplas cópias no mesmo servidor.
Logicamente, você pode adaptar este procedimento ao seu cenário e sua necessidade. Aqui, estou explicando o meu motivo para essa renomeação, mas o processo pode ser ajustado conforme sua realidade.
Exemplo prático:
No cenário proposto, será copiado via storage (Flash Copy) o banco de dados IBGE_PRD, que está no servidor de produção, para o servidor de testes, onde os bancos de destino serão IBGE_HOM e IBGE_DEV. Ou seja, teremos uma origem e dois destinos. Este post não abordará o contexto da cópia, mas focará apenas no processo de renomeação dos diskgroups e discos e as alterações necessárias para restabelecer os ambientes afetados.

Objetivo:
Renomear o diskgroup DATA para DATA_IBGE_HOM e atualizar as configurações do banco de dados de maneira adequada, garantindo que o ambiente continue funcional.
Vamos assumir que os bancos de dados de destino (IBGE_HOM e IBGE_DEV) já foram excluídos e que o Passo 01 da ilustração já foi executado. O banco de dados IBGE_PRD já foi replicado no destino como IBGE (IBGE_HOM) e está funcional. A partir desse ponto, todos os procedimentos serão realizados no ambiente de destino.
1. Fazer Backup do Controlfile, SPFILE e Parar os DataBases
Antes de qualquer alteração, faça o backup do controlfile e do SPFILE de todos os bancos envolvidos.
Backup do Controlfile
SQL> ALTER DATABASE BACKUP CONTROLFILE TO TRACE AS '/tmp/controlfile_bkp_IBGE.sql';
Backup do PFILE
SQL> CREATE PFILE='/tmp/init_bkp_IBGE.ora' FROM SPFILE;
ParaR os Bancos de Dados
[oracle@srv1 ~]$ srvctl status database -d IBGE
[oracle@srv1 ~]$ srvctl stop database -d IBGE
[oracle@srv1 ~]$ srvctl status database -d IBGE
Repita os comandos para todos os bancos que utilizam o diskgroup.

3. Verificar o Estado do Diskgroup, Listar Discos e Desmontar o Diskgroup
Verificar o Estado do Diskgroup
SQL> SELECT name, state FROM v$asm_diskgroup WHERE name = 'DATA';
Verificar os Discos do Diskgroup
SQL> SELECT path FROM v$asm_disk WHERE group_number = (SELECT group_number FROM v$asm_diskgroup WHERE name = 'DATA');
Desmontar o Diskgroup
[grid@srv1 ~]$ srvctl status diskgroup -g DATA
[grid@srv1 ~]$ srvctl stop diskgroup -g DATA
[grid@srv1 ~]$ srvctl status diskgroup -g DATA

3. Renomear o Diskgroup com Renamedg
Considerações:
Renomear um diskgroup e seus discos envolve um grau de risco. Caso algo não saia como planejado, há a possibilidade de comprometer o acesso ao diskgroup e aos bancos que dependem dele. Portanto, a execução desse procedimento deve ser feita de forma controlada e de preferencia em um ambiente de testes.
É importante lembrar que a responsabilidade total recai sobre o executor. O rename de diskgroups e discos pode causar inconsistências se não for feito corretamente, então certifique-se de seguir todas as etapas cuidadosamente e, sempre tenha um plano de recuperação.
Além disso, não há um comando direto para reverter o processo de renomeação, portanto, se for necessário desfazer a operação, você terá que realizar manualmente o processo inverso.
Rename DG:
Agora que o diskgroup DATA foi desmontado e os riscos foram considerados, utilize o comando renamedg
para renomeá-lo para DATA_IBGE_HOM. Este comando deve ser executado como usuário root
:
[root@srv1 ~]# renamedg dgname=DATA newdgname=DATA_IBGE_HOM confirm=TRUE asm_diskstring='/dev/oracleasm/disks/*' verbose=TRUE
dgname
: O nome do diskgroup que será renomeado. No nosso caso, o diskgroup atual é DATA.
newdgname
: O novo nome que será atribuído ao diskgroup. Vamos renomear para DATA_IBGE_HOM.
confirm=TRUE
: Este parâmetro confirma a execução da renomeação. Sem essa confirmação, o comando não será executado.
asm_diskstring='/dev/oracleasm/disks/*'
: Informa ao comando renamedg
onde procurar os discos do ASM. Neste exemplo, usamos /dev/oracleasm/disks/*
como o caminho para todos os discos.
verbose=TRUE
: Este parâmetro garante que a execução do comando será acompanhada de detalhes a respeito da execução.
Documentação renamedg
documentação oficial da Oracle.

5. Renomear o Disco no ASMLib
Depois de renomear o diskgroup, também precisamos renomear o disco no ASMLib. Conforme verificamos no passo 3, o único disco desse diskgroup DATA é o DISK2. O rename deve ser feito como usuário root.
oracleasm querydisk
mostra informações sobre o disco, como o número que o identifica. Depois, usamos ls -l /dev
com grep
para encontrar o disco certo no sistema com base nesses números. Por fim, o comando oracleasm renamedisk
faz a renomeação do disco no ASMLib.
[root@srv1 ~]# oracleasm querydisk -d DISK2
[root@srv1 ~]# ls -l /dev | grep " $(oracleasm querydisk -d DISK2 | grep -o '[0-9]\+,[0-9]\+' | cut -d',' -f1)," | grep " $(oracleasm querydisk -d DISK2 | grep -o '[0-9]\+,[0-9]\+' | cut -d',' -f2)"
[root@srv1 ~]# oracleasm renamedisk -f DISK2 DATA_IBGE_HOM_DISK2
[root@srv1 ~]# oracleasm querydisk -d DATA_IBGE_HOM_DISK2
[root@srv1 ~]# ls -l /dev | grep " $(oracleasm querydisk -d DATA_IBGE_HOM_DISK2| grep -o '[0-9]\+,[0-9]\+' | cut -d',' -f1)," | grep " $(oracleasm querydisk -d DATA_IBGE_HOM_DISK2 | grep -o '[0-9]\+,[0-9]\+' | cut -d',' -f2)"


6. Ajustar Metadados dos Discos Usando kfed
Embora este passo não seja sempre obrigatório, eu costumo realizá-lo para garantir que não haverá conflitos ou inconsistências nos metadados após o processo de renomeação. Já tive diversos problemas, especialmente com versões mais antigas do Oracle, onde, mesmo seguindo todo o procedimento padrão, o ASM não reconhecia corretamente o disco ou surgiam inconsistências nos metadados. Para resolver isso, utilizo o utilitário kfed para ajustar manualmente os metadados dos discos.
Aqui está o script para fazer a leitura e substituição dos nomes do diskgroup nos metadados:
busca=DATA
: Este é o nome antigo do diskgroup que será substituído nos metadados. Altere se o nome do diskgroup antigo for diferente.troca=DATA_IBGE_HOM
: Este é o novo nome do diskgroup. Certifique-se de ajustar essa variável conforme o novo nome do seu diskgroup.
Verifique se o caminho dos discos está correto: O script trabalha com os discos em /dev/oracleasm/disks/DATA_IBGE_HOM_DISK*
. Se os discos tiverem outro nome ou caminho, ajuste isso também.
[root@srv1 ~]# for disco in /dev/oracleasm/disks/DATA_IBGE_HOM_DISK*
do
echo "Processando o disco $disco ..."
busca=DATA
troca=DATA_IBGE_HOM
tamanho=`echo $troca | wc -m`
let tamanho=$tamanho-1
nome=`echo $disco | cut -f 6 -d /`
kfed op=read dev=$disco | sed -e '24,24s/ '$busca' / '$troca' /' -e '24,24s/length=.*/length='$tamanho'/' > /tmp/$nome.kfed
kfed op=write dev=$disco text=/tmp/$nome.kfed CHKSUM=YES
done
Este script lê os metadados de cada disco associado ao diskgroup, troca o nome antigo pelo novo (ajustando também o comprimento do nome), e grava as mudanças de volta no disco com um checksum atualizado. Ele garante que os metadados do diskgroup sejam consistentes com o novo nome.
6. Montar o Novo Diskgroup e Remover o Antigo
Antes de montar o novo diskgroup, é importante garantir que todos os nodes do RAC reconheçam os discos corretamente. Para isso, você deve executar os comandos scandisks e listdisks em todos os nodes do RAC.
##NODE 01
[root@srv1 ~]# /etc/init.d/oracleasm scandisks
[root@srv1 ~]# /etc/init.d/oracleasm listdisks
##NODE 02
[root@srv2 ~]# /etc/init.d/oracleasm scandisks
[root@srv2 ~]# /etc/init.d/oracleasm listdisks

[root@srv1 ~]# srvctl remove diskgroup -g DATA -f
[root@srv1 ~]# su - grid
[grid@srv1 ~]$ sqlplus / as sysasm
SQL> alter diskgroup DATA_IBGE_HOM mount;
SQL> quit
[grid@srv1 ~]$ exit
[root@srv1 ~]# srvctl config database -d IBGE |grep "Disk Groups"
[root@srv1 ~]# srvctl modify database -d IBGE -diskgroup "DATA_IBGE_HOM,RECO"
[root@srv1 ~]# srvctl config database -d IBGE |grep "Disk Groups"
[root@srv1 ~]# srvctl status diskgroup -g DATA_IBGE_HOM
[root@srv1 ~]# srvctl stop diskgroup -g DATA_IBGE_HOM
[root@srv1 ~]# srvctl start diskgroup -g DATA_IBGE_HOM
[root@srv1 ~]# srvctl status diskgroup -g DATA_IBGE_HOM
[root@srv1 ~]# crsctl stat res -t


6. Atualizar o SPFILE
Agora que o novo diskgroup DATA_IBGE_HOM foi montado e o diskgroup antigo DATA foi removido, precisamos garantir que o banco de dados reconheça essa mudança. Para isso, devemos atualizar o SPFILE e recriar o controlfile. Vale lembrar que o backup do controlfile e do SPFILE já foi realizado na etapa 1, portanto, não há necessidade de repetir esse procedimento.
Atualizar o PFILE:
[oracle@srv1 ~]$ vi /tmp/init_bkp_IBGE.ora

Gerando SPFILE com base no PFILE que foi alterado:
[oracle@srv1 ~]$ srvctl config database -d IBGE | grep spfile
[oracle@srv1 ~]$ sqlplus / as sysdba
SQL> create spfile='+DATA_IBGE_HOM/spfileIBGE.ora' from pfile='/tmp/init_bkp_IBGE.ora';
SQL> exit
[oracle@srv1 ~]$ srvctl modify database -d IBGE -spfile +DATA_IBGE_HOM/spfileIBGE.ora
[oracle@srv1 ~]$ srvctl config database -d IBGE | grep spfile

7. Recriar o Controlfile
Agora que o SPFILE foi recriado no novo diskgroup DATA_IBGE_HOM, é necessário recriar o controlfile para refletir as alterações no diskgroup. Isso garante que o Oracle reconheça os novos caminhos dos datafiles e outros componentes associados ao diskgroup. Lembrando que o backup do controlfile já foi realizado na etapa 1.
Abra o arquivo gerado no passo 1
O arquivo /tmp/controlfile_bkp_IBGE.sql foi gerado no passo 1 como backup do controlfile. Agora, abra esse arquivo para editá-lo e realizar as modificações necessárias nos caminhos dos diskgroups.
Substitua todas as referências ao antigo diskgroup DATA pelo novo DATA_IBGE_HOM. Isso inclui os caminhos de datafiles, redo logs e outros componentes que estão associados ao diskgroup antigo.
[oracle@srv1 ~]$ vi /tmp/controlfile_bkp_IBGE.sql
O Acácio (https://www.linkedin.com/in/acaciolr/) me enviou um script que facilita a troca automática de strings no controlfile ou qualquer outro arquivo. Após separar o pedaço do controlfile que você vai utilizar, você pode aplicar esse script para fazer a substituição de forma automática:
#!/bin/bash
if [ $# -lt 3 ]; then
echo "Uso: $0 /caminho/absoluto/para/o/arquivo 'string_antiga' 'string_nova'"
exit 1
fi
arquivo="$1"
string_antiga="$2"
string_nova="$3"
if [ ! -f "$arquivo" ]; then
echo "Erro: Arquivo '$arquivo' não encontrado."
exit 1
fi
alteracoes=$(grep -o "$string_antiga" "$arquivo" | wc -l)
# Faz a troca
sed -i "s/$string_antiga/$string_nova/g" "$arquivo"
echo "Troca de '$string_antiga' por '$string_nova' concluída em: $arquivo"
echo "Número de alterações feitas: $alteracoes"


Recriar o controlfile:
Após ajustar o arquivo com os novos caminhos do diskgroup, salve as alterações e execute o script para recriar o controlfile:
[oracle@srv1 ~]$ sqlplus / as sysdba
SQL> STARTUP NOMOUNT;
SQL> alter system set cluster_database=FALSE scope=spfile sid='*';
SQL> SHUT ABORT;
SQL> STARTUP NOMOUNT;
SQL> @/tmp/controlfile_bkp_IBGE.sql;
SQL> ALTER DATABASE OPEN RESETLOGS;
SQL> alter system set cluster_database=TRUE scope=spfile sid='*';
SQL> SHUT IMMEDIATE;
SQL> EXIT;
[oracle@srv1 ~]$ srvctl start database -d IBGE
[oracle@srv1 ~]$ srvctl status database -d IBGE


8. Validar a Integridade do Banco de Dados
Após recriar o controlfile e abrir o banco de dados, é importante validar a integridade do banco de dados, verificando se todos os datafiles e logs estão consistentes:
[oracle@srv1 ~]$ rman target /
RMAN> VALIDATE DATABASE;
—
Esse processo de renomeação de diskgroups e discos no Oracle RAC 19c funcionou bem no meu ambiente, com as configurações e variáveis que uso no dia a dia. É uma técnica que já me ajudou em situações reais, principalmente quando precisei lidar com múltiplas cópias de bancos via storage, evitando problemas de conflito de nomes.
No entanto, cada ambiente tem suas particularidades. O que funcionou bem para mim pode precisar de ajustes no seu caso, dependendo da versão do Oracle e das configurações diversas. Por isso, é sempre uma boa ideia testar tudo antes em um ambiente controlado para garantir que está tudo certo.
🎂🍭#20241008 #DBASobrinho #GuinaNãoTinhaDó #BóBó #CaceteDeAgulha #OracleACE #ShampooJoico #FeriasArraial #TnsPing #CabeloMaluco #TheovinoSemBrinquedo 🎂🍭