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