Upgrade para o Oracle 19c com o AutoUpgrade

Por Rogerio Eguchi
Publicado em Fevereiro 2020


Revisado por Juan Pablo Guizado




Introdução


O objetivo desse artigo é trazer ao conhecimento do DBA um novo mecanismo para upgrade de bases de dados Oracle.

Os métodos antigos ainda são possiveis de serem utilizados porém a recomendação da Oracle de agora em diante é a de utilizarmos o AutoUpgrade.




Definição


Oracle Database AutoUpgrade é um utilitário que visa a automação do processo de upgrade, permitindo o DBA realizar o upgrade de um ou mais bancos de dados sem intervenção humana, executando-se uma única linha comando com a utilização de um arquivo de configuração.




Benefícios


O AutoUpgrade executará as atividades de preupgrade e corrigirá os erros encontrados quando necessário, executará o upgrade da base e as atividades de pós-upgrade. Fará automaticamente o retry e fallback, possibilitando ainda se necessário o agendamento de um upgrade para uma data futura, além de ajustar ou remover parâmetros de inicialização.




Suporte


Como base de dados de origem, a versão mais antiga suportada para upgrade através do AutoUpgrade é a Oracle Database 11.2.0.4

Como base de dados de destino, podemos realizar o upgrade para as versões:

  • Oracle 12.2 (DBJAN2019RU ou superior)
  • Oracle 18c (18.5 ou superior)
  • Oracle 19c (19.3 ou superior)



Download


A Oracle recomenda que seja utilizada a última versão do AutoUpgrade, disponível através do documento My Oracle Support 2485457.1

Nesse momento (Dezembro/2019) a última versão disponível é a 20191125.




Java


O utilitário AutoUpgrade é compatível com a versão Java 8 e esta disponível no home do Oracle nas versões Oracle Database 12c Release 1 (12.1.0.2) ou superiores.

Para verificar a versão Java instalada, execute o comando:

$ORACLE_HOME/jdk/bin/java -version 



Normalmente utiliza-se o Oracle Home da base de origem para a execução do AutoUpgrade, porém, se sua origem for um Oracle Database 11.2.0.4, a versão Java não será compatível e nesse caso deve-se utilizar o Oracle Home da versão de destino.




Config File


O primeiro passo para utilização da ferramente é criar e ajustar o arquivo de configuração.

Podemos criar um arquivo de configuração através do comando:

$ORACLE_HOME/jdk/bin/java -jar autoupgrade.jar  -create_sample_file config



O conteúdo do arquivo gerado será:

cat /home/oracle/stage/sample_config.cfg
#
# sample config file
#
# build version 20191125
# build date    2019/11/25 17:49:18
#
#
# Global configurations
#
# This directory will include the following
#   (1) AutoUpgrade's global directory
#   (2) Any logs, not directly tied to a job
#   (3) Config files
#   (4) progress.json and status.json
global.autoupg_log_dir=/home/oracle/stage/upg_logs


#
# Database number 1
#
upg1.dbname=employee
upg1.start_time=NOW
upg1.source_home=/u01/app/oracle/product/11.2.0/dbhome_1
upg1.target_home=/u01/app/oracle/product/19.1.0/dbhome_1
upg1.sid=emp
upg1.log_dir=/home/oracle/stage/upg_logs/employee
upg1.upgrade_node=c0s64150
upg1.target_version=19
#upg1.run_utlrp=yes
#upg1.timezone_upg=yes

#
# Database number 2
#
#upg2.dbname=database name
#upg2.start_time=11/12/2019 16:23:41
#upg2.source_home=Path to source version of Oracle database
#upg2.target_home=Path to target version of Oracle database
#upg2.sid=Value of Oracle SID
#upg2.log_dir=Path to log dir
#upg2.upgrade_node=c0s64150 # To find out your node name run the hostname utility
#upg2.target_version=12.2
#upg2.run_utlrp=[yes|no]
#upg2.timezone_upg=[yes|no]

#
# You can have as many databases as desired
#
#upgN.dbname=database name
#upgN.start_time=dd/mm/yyyy hh:mm:ss | now
#upgN.source_home=Path to source version of Oracle database
#upgN.target_home=Path to target version of Oracle database
#upgN.sid=Value of Oracle SID
#upgN.log_dir=Path to log dir
#upgN.upgrade_node=upgrade_node # To find out your node name run the hostname utility
#upgN.target_version= 18
#upgN.run_utlrp=[yes|no]
#upgN.timezone_upg=[yes|no]



Podemos adicionar quantas bases quisermos, não há limite!

Veja que temos parametros globais e locais.

Os parametros globais podem ser utilizados para configurações comuns a todas as bases, já os parametros locais serão especificos para uma instalação somente.

Exemplo:

  global.target_home=/u01/app/oracle/product/19
  upg1.source_home=/u01/app/oracle/product/11.2.0.4
  upg2.source_home=/u01/app/oracle/product/12.1.0.2
  



Nesse caso, as bases terão como destino um Oracle 19c e suas origens serão distintas.

Para a demonstração da ferramenta faremos um upgrade de uma base Oracle 12.2 para uma base Oracle 19.3, instalados em mesmo servidor Oracle Enterprise Linux 7.7

O arquivo de configuração utilizado será:

global.autoupg_log_dir=/home/oracle/stage/upg_logs
#
# Database number 1
#
upg1.dbname=DEV02
upg1.start_time=NOW
upg1.source_home=/u01/c0s6/app/oracle/product/12.2.0.1/dbhome_1
upg1.target_home=/u01/c0s6/app/oracle/product/19.3.0.0/dbhome_1
upg1.sid=DEV02
upg1.log_dir=/home/oracle/stage/upg_logs/DEV02
upg1.upgrade_node=c0s64150
upg1.target_version=19
upg1.run_utlrp=yes
upg1.timezone_upg=yes






AutoUpgrade Processing Modes


São quatro modos de processamento que o AutoUpgrade executa:

  1. Analyze
  2. Fixup
  3. Deploy
  4. Upgrade

Analyze: verifica se a base esta pronta para o upgrade.

Exemplo:

$ORACLE_HOME/jdk/bin/java -jar autoupgrade.jar -config sample_config.cfg -mode analyze

AutoUpgrade tool launched with default options
+--------------------------------+
| Starting AutoUpgrade execution |
+--------------------------------+
1 databases will be analyzed
Type 'help' to list console commands
upg> Job 100 completed
------------------- Final Summary --------------------
Number of databases            [ 1 ]

Jobs finished successfully     [1]
Jobs failed                    [0]
Jobs pending                   [0]
------------- JOBS FINISHED SUCCESSFULLY -------------
Job 100 FOR DEV02



Vamos verificar o relatório de execução gerado em:

/home/oracle/stage/upg_logs/DEV02/DEV02/100/prechecks/dev02_preupgrade.html



Exemplo:


Fixup: Realiza os ajustes que devem ser realizados antes do upgrade.


Exemplo:

$ORACLE_HOME/jdk/bin/java -jar autoupgrade.jar -config sample_config.cfg -mode fixups

AutoUpgrade tool launched with default options
+--------------------------------+
| Starting AutoUpgrade execution |
+--------------------------------+
1 databases will be processed
Type 'help' to list console commands
upg> Job 101 completed
------------------- Final Summary --------------------
Number of databases            [ 1 ]

Jobs finished successfully     [1]
Jobs failed                    [0]
Jobs pending                   [0]
------------- JOBS FINISHED SUCCESSFULLY -------------
Job 101 FOR DEV02



Podem existir situações em que esse passo altera e reinicia a base de origem, ou seja, tome cuidado para não reiniciar sua produção em um momento não adequado.

Ajustes finalizados com sucesso. Seguimos para o deploy.

Deploy: Realiza o upgrade e caso necessário roda o fixups.

Exemplo:

$ORACLE_HOME/jdk/bin/java -jar autoupgrade.jar -config sample_config.cfg -mode deploy 



Durante a execução do deploy você pode interagir com a shell do utilitário.

Os comandos mais utilizados são:

lsj - lista os jobs em execução
resume -job <number> - reinica um job
status -job <number> - mostra o status do job
restore -job <number> - restaura uma base a partir de um GRP
abort -job <number> - finaliza um job específico


Exemplo:

upg> help
exit                          // To close and exit
help                         // Displays help
lsj [(-r|-f|-p|-e) | -n <number>]  // list jobs by status up to n elements.
	-f Filter by finished jobs.
	-r Filter by running jobs.
	-e Filter by jobs with errors.
	-p Filter by jobs being prepared.
	-n <number> Display up to n jobs.
lsr                           // Displays the restoration queue
lsa                           // Displays the abort queue
tasks                         // Displays the tasks running
clear                         // Clears the terminal
resume -job <number>          // Restarts a previous job that was running
status [-job <number> [-long]]// Lists all the jobs or a specific job
restore -job <number>         // Restores the database to its state prior to the upgrade
restore all_failed            // Restores all failed jobs to their previous states prior 
								  to the upgrade
logs                          // Displays all the log locations
abort -job <number>           // Aborts the specified job
h[ist]                        // Displays the command line history
/[<number>]                   // Executes the command specified from the history. 
								  The default is the last command
upg>

upg> lsj
+----+-------+---------+---------+-------+--------------+--------+--------+-----------+
|Job#|DB_NAME|    STAGE|OPERATION| STATUS|    START_TIME|END_TIME| UPDATED|    MESSAGE|
+----+-------+---------+---------+-------+--------------+--------+--------+-----------+
| 102|  DEV02|DBUPGRADE|EXECUTING|RUNNING|19/12/11 18:44|     N/A|18:46:26|0%Upgraded |
+----+-------+---------+---------+-------+--------------+--------+--------+-----------+

upg> status
---------------- Config -------------------
User configuration file    [/home/oracle/stage/sample_config.cfg]
General logs location      [/home/oracle/stage/upg_logs/cfgtoollogs/upgrade/auto]
Mode                       [DEPLOY]
DB upg fatal errors        ORA-00600,ORA-07445
DB Post upgrade abort time [60] minutes
DB upg abort time          [1440] minutes
DB restore abort time      [120] minutes
DB GRP abort time          [3] minutes
------------------------ Jobs ------------------------
Total databases in configuration file [1]
Total Non-CDB being processed         [1]
Total CDB being processed             [0]
Jobs finished successfully            [0]
Jobs finished/aborted                 [0]
Jobs in progress                      [1]
Jobs stage summary
    Job ID: 102
    DB name: DEV02
        SETUP             <1 min
        PREUPGRADE        <1 min
        PRECHECKS         <1 min
        GRP               <1 min
        PREFIXUPS         <1 min
        DRAIN             <1 min
        DBUPGRADE         <1 min (IN PROGRESS)
------------ Resources ----------------
Threads in use                        [26]
JVM used memory                       [30] MB
CPU in use                            [13%]
Processes in use                      [18]

upg>



Veja que o passo em execução nesse momento é o DBUPGRADE.

Output após o términio do job:

upg> Job 102 completed
------------------- Final Summary --------------------
Number of databases            [ 1 ]

Jobs finished successfully     [1]
Jobs failed                    [0]
Jobs pending                   [0]
------------- JOBS FINISHED SUCCESSFULLY -------------
Job 102 FOR DEV02

---- Drop GRP at your convenience once you consider it is no longer needed ----
Drop GRP from DEV02: drop restore point AUTOUPGRADE_221145114461854_DEV02



Por padrão o restore point é mantido. Para removê-lo basta executar DROP RESTORE POINT AUTOUPGRADE_221145114461854_DEV02.

O parametro de configuração upg1.drop_grp_after_upgrade=yes pode ser utilizado para remover automaticamente o GRP após o término do upgrade.

Upgrade: Permite o upgrade da base de destino quando não temos acesso a base de origem.


Como o exemplo acima não cai nessa situação, esse passo não será executado.







Logs

   

Após o término do job de upgrade temos um relatório final de status, porém não são exibidos os detalhes do que foi executado.

Para acessar essas informações podemos recorrer aos logs armazenados nos diretórios definidos no arquivo de configuração.

global.autoupg_log_dir=/home/oracle/stage/upg_logs
upg1.log_dir=/home/oracle/stage/upg_logs/DEV02



Em upg_logs temos os diretórios:

cfgtoollogs/
└── upgrade
    └── auto
        ├── config_files
        ├── lock
        └── status -> Logs de status



Em DEV02 temos os diretórios:

DEV02/
└── DEV02
    ├── 100
    │   └── prechecks
    ├── 101
    │   ├── prechecks -> Relatório de precheck
    │   └── prefixups
    ├── 102
    │   ├── dbupgrade -> Logs do upgrade
    │   ├── drain
    │   ├── postchecks
    │   ├── postfixups
    │   ├── postupgrade
    │   ├── prechecks
    │   ├── prefixups
    │   └── preupgrade
    └── temp
        └── DEV02
            └── TimeZone



O arquivo upg_summary.log localizado no diretório dbupgrade reporta os tempos de execução e status dos componentes.

[oracle@c0s64150 dbupgrade]$ cat upg_summary.log

Oracle Database Release 19 Post-Upgrade Status Tool    12-11-2019 19:13:0
Database Name: DEV02

Component                               Current         Full     Elapsed Time
Name                                    Status          Version  HH:MM:SS

Oracle Server                          UPGRADED      19.3.0.0.0  00:10:47
JServer JAVA Virtual Machine           UPGRADED      19.3.0.0.0  00:01:17
Oracle XDK                             UPGRADED      19.3.0.0.0  00:00:55
Oracle Database Java Packages          UPGRADED      19.3.0.0.0  00:00:09
OLAP Analytic Workspace                UPGRADED      19.3.0.0.0  00:00:13
Oracle Label Security                  UPGRADED      19.3.0.0.0  00:00:07
Oracle Database Vault                  UPGRADED      19.3.0.0.0  00:00:20
Oracle Text                            UPGRADED      19.3.0.0.0  00:00:34
Oracle Workspace Manager               UPGRADED      19.3.0.0.0  00:00:33
Oracle Real Application Clusters       UPGRADED      19.3.0.0.0  00:00:00
Oracle XML Database                    UPGRADED      19.3.0.0.0  00:01:29
Oracle Multimedia                      UPGRADED      19.3.0.0.0  00:00:36
Spatial                                UPGRADED      19.3.0.0.0  00:04:01
Oracle OLAP API                        UPGRADED      19.3.0.0.0  00:00:10
Datapatch                                                        00:03:11
Final Actions                                                    00:03:18
Post Upgrade                                                     00:00:13

Total Upgrade Time: 00:25:27

Database time zone version is 26. It is older than current release time
zone version 32. Time zone upgrade is needed using the DBMS_DST package.

Grand Total Upgrade Time:    [0d:0h:35m:34s]



Já no arquivo phase.log, podemos ver que o catctl.pl permanece sendo executado:

[oracle@c0s64150 dbupgrade]$ more phase.log (output truncated)

Argument list for [/u01/c0s6/app/oracle/product/19.3.0.0/dbhome_1/rdbms/admin/catctl.pl]
For Oracle internal use only A = 0
Run in                       c = 0
Do not run in                C = 0
Input Directory              d = /u01/c0s6/app/oracle/product/19.3.0.0/dbhome_1/rdbms/admin
Echo OFF                     e = 1
Simulate                     E = 0
Forced cleanup               F = 0
Log Id                       i = 0
Child Process                I = 0
Log Dir                      l = 0
Priority List Name           L = 0
Upgrade Mode active          M = 0
SQL Process Count            n = 0
SQL PDB Process Count        N = 0
Open Mode Normal             o = 0
Start Phase                  p = 0
End Phase                    P = 0
Reverse Order                r = 0
AutoUpgrade Resume           R = 0
Script                       s = 0
Serial Run                   S = 0
RO User Tablespaces          T = 0
Display Phases               y = 1
Debug catcon.pm              z = 0
Debug catctl.pl              Z = 0






Referências


Oracle Docs:   
https://docs.oracle.com/en/database/oracle/oracle-database/19/upgrd/using-autoupgrade-oracle-database-upgrades.html#GUID-71883C8C-7A34-4E93-8955-040CB04F2109

Mike Dietrich's Blog:
https://mikedietrichde.com/2019/04/29/the-new-autoupgrade-utility-in-oracle-19c/





Rogerio Bacchi Eguchi é um DBA Oracle Sênior com extensa experiência em ambientes OLTP de missão crítica e que empregam as tecnologias da "Oracle Maximum Availability Architecture". Atuou como DBA em empresas como Oracle, UOL, UOLDiveo, PagSeguro e atualmente atua como DBA/DMA na TOTVS. Possui as certificações Oracle OCP 8i, 9i, 10g, 11g, 12c e OCE Exadata. Atua também como SysAdmin/DEVOPS onde é certificado Linux RHCE. Entusiata de novas tecnologias como big data, automações e cloud computing. Compartilha conhecimento no blog reguchi.wordpress.com e twitter @reguchi_br.

Este artigo foi revisto pela equipe de produtos Oracle e está em conformidade com as normas e práticas para o uso de produtos Oracle.