Os scripts abaixo tem como objetivo executar um stop e start home com o comando srvctl em todos os DB Home configurados no arquivo oratab. Essa tarefa poderia ser facilmente executada com um simples “crctl stop crs”, mas o objetivo aqui é parar todas as instâncias de Oracle Database sem parar os serviços do Grid Infrastructure.

A necessidade surgiu ao usar o Fleet Patching and Provisioning para aplicar patch no Grid Infrastructure e enfrentar um problema: Ele para todas as instâncias perfeitamente antes de atualizar o Grid, mas apresenta erro ao tentar voltar as instâncias porque tenta iniciar todas elas a partir do srvctl de um único Oracle Home.

Script

Script para realizar STOP:

for DBHOME in $(grep -v '^#' /etc/oratab | grep -v '^+' | cut -d: -f2 | sort | uniq)
do
 echo "Parando DB Home: $DBHOME"
 mv $DBHOME/state_file.log $DBHOME/state_file.old
 $DBHOME/bin/srvctl stop home -o $DBHOME -s $DBHOME/state_file.log
done

Script para realizar START

for DBHOME in $(grep -v '^#' /etc/oratab | grep -v '^+' | cut -d: -f2 | sort | uniq)
do
 echo "Iniciando DB Home: $DBHOME"
 $DBHOME/bin/srvctl start home -o $DBHOME -s $DBHOME/state_file.log
done

Demonstração

Todas as instâncias estão em online:

[oracle@lab02 ~]$ ps -ef | grep pmon
grid      2669     1  0 19:11 ?        00:00:00 asm_pmon_+ASM
oracle   19036     1  0 21:12 ?        00:00:00 ora_pmon_MCDB
oracle   19040     1  0 21:12 ?        00:00:00 ora_pmon_orcl
oracle   19044     1  0 21:12 ?        00:00:00 ora_pmon_CDB1
oracle   19724     1  0 21:13 ?        00:00:00 ora_pmon_teste
oracle   20115     1  0 21:13 ?        00:00:00 ora_pmon_BDHR
oracle   20121     1  0 21:13 ?        00:00:00 ora_pmon_bdlari
oracle   21119  6795  0 21:15 pts/0    00:00:00 grep --color=auto pmon

Parando todos os DB Homes:

[oracle@lab02 ~]$ ./stop_all_dbhomes.sh
Parando DB Home: /u01/app/oracle/product/11.2.0.4/db_1
Parando DB Home: /u01/app/oracle/product/12.1.0.2/db_1
Parando DB Home: /u01/app/oracle/product/12.2.0.1/db_1
Parando DB Home: /u01/app/oracle/product/19.0.0.0/db_1

Nenhuma instância online:

[oracle@lab02 ~]$ ps -ef | grep pmon
grid      2669     1  0 19:11 ?        00:00:00 asm_pmon_+ASM

Iniciando todos os DB Homes:

[oracle@lab02 ~]$ ./start_all_dbhomes.sh
Iniciando DB Home: /u01/app/oracle/product/11.2.0.4/db_1
Iniciando DB Home: /u01/app/oracle/product/12.1.0.2/db_1
Iniciando DB Home: /u01/app/oracle/product/12.2.0.1/db_1
Iniciando DB Home: /u01/app/oracle/product/19.0.0.0/db_1

Todas as instâncias online novamente:

[oracle@lab02 ~]$ ps -ef | grep pmon
grid      2669     1  0 19:11 ?        00:00:00 asm_pmon_+ASM
oracle   21485     1  0 21:16 ?        00:00:00 ora_pmon_MCDB
oracle   21489     1  0 21:16 ?        00:00:00 ora_pmon_orcl
oracle   21493     1  0 21:16 ?        00:00:00 ora_pmon_CDB1
oracle   22186     1  0 21:16 ?        00:00:00 ora_pmon_teste
oracle   22499     1  0 21:17 ?        00:00:00 ora_pmon_bdlari
oracle   22505     1  0 21:17 ?        00:00:00 ora_pmon_BDHR

Lógica

1) Tudo se baseia no conteúdo do arquivo /etc/oratab, onde são listados todas as instâncias e seus respectivos DB Homes

[oracle@lab02 ~]$ cat /etc/oratab
#Backup file is  /u01/app/grid/crsdata/lab02/output/oratab.bak.lab02.grid line added by Agent
CDB1:/u01/app/oracle/product/12.1.0.2/db_1:N            # line added by Agent
tche:/u01/app/oracle/product/19.0.0.0/db_1:N            # line added by Agent
teste:/u01/app/oracle/product/12.2.0.1/db_1:N           # line added by Agent
db11g:/u01/app/oracle/product/11.2.0.4/db_1:N           # line added by Agent
BDHR:/u01/app/oracle/product/19.0.0.0/db_1:N            # line added by Agent
bdlari:/u01/app/oracle/product/19.0.0.0/db_1:N          # line added by Agent
MCDB:/u01/app/oracle/product/12.1.0.2/db_1:N            # line added by Agent
orcl:/u01/app/oracle/product/12.1.0.2/db_1:N            # line added by Agent
+ASM:/u01/app/product/19.11.0.0/grid:N          # line added by Agent

2) O primeiro grep remove as linhas comentadas (que iniciam com #):

[oracle@lab02 ~]$ grep -v '^#' /etc/oratab
CDB1:/u01/app/oracle/product/12.1.0.2/db_1:N            # line added by Agent
tche:/u01/app/oracle/product/19.0.0.0/db_1:N            # line added by Agent
teste:/u01/app/oracle/product/12.2.0.1/db_1:N           # line added by Agent
db11g:/u01/app/oracle/product/11.2.0.4/db_1:N           # line added by Agent
BDHR:/u01/app/oracle/product/19.0.0.0/db_1:N            # line added by Agent
bdlari:/u01/app/oracle/product/19.0.0.0/db_1:N          # line added by Agent
MCDB:/u01/app/oracle/product/12.1.0.2/db_1:N            # line added by Agent
orcl:/u01/app/oracle/product/12.1.0.2/db_1:N            # line added by Agent
+ASM:/u01/app/product/19.11.0.0/grid:N          # line added by Agent

3) O segundo grep remove as linhas que iniciam com +, para ignorar a instância ASM:

[oracle@lab02 ~]$ grep -v '^#' /etc/oratab | grep -v '^+'
CDB1:/u01/app/oracle/product/12.1.0.2/db_1:N            # line added by Agent
tche:/u01/app/oracle/product/19.0.0.0/db_1:N            # line added by Agent
teste:/u01/app/oracle/product/12.2.0.1/db_1:N           # line added by Agent
db11g:/u01/app/oracle/product/11.2.0.4/db_1:N           # line added by Agent
BDHR:/u01/app/oracle/product/19.0.0.0/db_1:N            # line added by Agent
bdlari:/u01/app/oracle/product/19.0.0.0/db_1:N          # line added by Agent
MCDB:/u01/app/oracle/product/12.1.0.2/db_1:N            # line added by Agent
orcl:/u01/app/oracle/product/12.1.0.2/db_1:N            # line added by Agent

4) O comando cut faz um filtro na linha deixando somente o caminho do DB Home:

[oracle@lab02 ~]$ grep -v '^#' /etc/oratab | grep -v '^+' | cut -d: -f2
/u01/app/oracle/product/12.1.0.2/db_1
/u01/app/oracle/product/19.0.0.0/db_1
/u01/app/oracle/product/12.2.0.1/db_1
/u01/app/oracle/product/11.2.0.4/db_1
/u01/app/oracle/product/19.0.0.0/db_1
/u01/app/oracle/product/19.0.0.0/db_1
/u01/app/oracle/product/12.1.0.2/db_1
/u01/app/oracle/product/12.1.0.2/db_1

5) O comando sort ordena o resultado em ordem alfabética:

[oracle@lab02 ~]$ grep -v '^#' /etc/oratab | grep -v '^+' | cut -d: -f2 | sort
/u01/app/oracle/product/11.2.0.4/db_1
/u01/app/oracle/product/12.1.0.2/db_1
/u01/app/oracle/product/12.1.0.2/db_1
/u01/app/oracle/product/12.1.0.2/db_1
/u01/app/oracle/product/12.2.0.1/db_1
/u01/app/oracle/product/19.0.0.0/db_1
/u01/app/oracle/product/19.0.0.0/db_1
/u01/app/oracle/product/19.0.0.0/db_1

6) O comando uniq remove os valores duplicados, porque iremos fazer um stop no DB Home como todo:

[oracle@lab02 ~]$ grep -v '^#' /etc/oratab | grep -v '^+' | cut -d: -f2 | sort | uniq
/u01/app/oracle/product/11.2.0.4/db_1
/u01/app/oracle/product/12.1.0.2/db_1
/u01/app/oracle/product/12.2.0.1/db_1
/u01/app/oracle/product/19.0.0.0/db_1

7) Usei um for para percorrer a lista de DB Home e chamar o seu respectivo srvctl para executar o “srvctl stop home”, salvando o statefile dentro do próprio DB home (arquivo que contém a lista de instâncias, por exemplo do comando que é executado no final:

/u01/app/oracle/product/12.1.0.2/db_1/bin/srvctl stop home -o /u01/app/oracle/product/12.1.0.2/db_1 -s /u01/app/oracle/product/12.1.0.2/db_1/state_file.log

Leave a Reply

Discover more from Blog do Dibiei

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

Continue reading