Olá a todos. Neste post irei mostrar um passo-a-passo de como realizar a migração e upgrade de uma base de dados do 11g para o 12c.

 

1 – Considerações Iniciais

– A base de origem está na versão 11.2.0.4
– A base de destino está na versão 12.1.0.2
– Ambos os servidores são Oracle Linux 7, mantendo o mesmo “Endian Format”
– A base migrada será do tipo non-CDB. Ela deverá ser plugada em um CDB posteriormente.
– Enquanto a base de destino (12c) vai sendo criada, a base de origem (11g) continua online atendendo as aplicações.
– Os diskgroups de origem e destino se mantiveram com os mesmos nomes (+DGDATA e +DGFRA). Caso sejam diferentes, deve-se usar a clausula “SET NEWNAME FOR DATAFILE n” no restore e renomear os REDO Log Files no destino (ALTER DATABASE RENAME FILE ‘nome_antigo’ TO ‘novo_nome’), antes de abrir a base com o RESETLOGS. Também deve-se mudar os parâmetros de destino dos archives, caso necessário.

 

2 – Passos

2.1) [ORIGEM] Realizar um backup FULL + archives da base 11g:

[et_pb_dmb_code_snippet code=”Uk1BTj4gUlVOIHsKQUxMT0NBVEUgQ0hBTk5FTCBDSDAxIERFVklDRSBUWVBFIERJU0s7CkFMTE9DQVRFIENIQU5ORUwgQ0gwMiBERVZJQ0UgVFlQRSBESVNLOwpCQUNLVVAgREFUQUJBU0UgRk9STUFUIOKAmC9iYWNrdXAvZGJtaWdyYS9ia3BfZnVsbF9kYm1pZ3JhXyVVLmJrcOKAmSBUQUcg4oCYQktQX0ZVTExfREJNSUdSQeKAmTsKQkFDS1VQIEFSQ0hJVkVMT0cgQUxMIEZPUk1BVCDigJgvYmFja3VwL2RibWlncmEvYmtwX2Z1bGxfYXJjaHNfZGJtaWdyYV8lVS5ia3DigJkgVEFHIOKAmEJLUF9GVUxMX0FSQ0hTX0RCTUlHUkHigJk7Cn0=” _builder_version=”4.0.6″]Uk1BTj4gUlVOIHsKQUxMT0NBVEUgQ0hBTk5FTCBDSDAxIERFVklDRSBUWVBFIERJU0s7CkFMTE9DQVRFIENIQU5ORUwgQ0gwMiBERVZJQ0UgVFlQRSBESVNLOwpCQUNLVVAgREFUQUJBU0UgRk9STUFUIOKAmC9iYWNrdXAvZGJtaWdyYS9ia3BfZnVsbF9kYm1pZ3JhXyVVLmJrcOKAmSBUQUcg4oCYQktQX0ZVTExfREJNSUdSQeKAmTsKQkFDS1VQIEFSQ0hJVkVMT0cgQUxMIEZPUk1BVCDigJgvYmFja3VwL2RibWlncmEvYmtwX2Z1bGxfYXJjaHNfZGJtaWdyYV8lVS5ia3DigJkgVEFHIOKAmEJLUF9GVUxMX0FSQ0hTX0RCTUlHUkHigJk7Cn0=[/et_pb_dmb_code_snippet]

2.2) [ORIGEM] Criar um BACKUP COPY do Controlfile, para que seja possível montar a base no destino.

RMAN> BACKUP AS COPY CURRENT CONTROLFILE FORMAT ‘/backup/dbmigra/bkp_control_dbmigra.bkp’

 

[et_pb_dmb_code_snippet code=”Uk1BTj4gQkFDS1VQIEFTIENPUFkgQ1VSUkVOVCBDT05UUk9MRklMRSBGT1JNQVQg4oCYL2JhY2t1cC9kYm1pZ3JhL2JrcF9jb250cm9sX2RibWlncmEuYmtw4oCZ” _builder_version=”4.0.6″]Uk1BTj4gQkFDS1VQIEFTIENPUFkgQ1VSUkVOVCBDT05UUk9MRklMRSBGT1JNQVQg4oCYL2JhY2t1cC9kYm1pZ3JhL2JrcF9jb250cm9sX2RibWlncmEuYmtw4oCZ[/et_pb_dmb_code_snippet]

 

2.3) [ORIGEM] Copiar os backups e o controlfile para o ambiente de destino, via scp, por exemplo.

OBS1: O diretório dos backups, no servidor de destino é: “/aux/restore/dbmigra”. Será necessário catalogar esses backups após subir a base no modo MOUNT

 

2.4) [ORIGEM] Gerar um PFILE da base de origem e copia-lo para o destino.

[et_pb_dmb_code_snippet code=”U1FMPiBDUkVBVEUgUEZJTEU94oCZL2NhbWluaG9fcGZpbGVfMTFnLm9yYeKAmSBGUk9NIFNQRklMRTs=” _builder_version=”4.0.6″]U1FMPiBDUkVBVEUgUEZJTEU94oCZL2NhbWluaG9fcGZpbGVfMTFnLm9yYeKAmSBGUk9NIFNQRklMRTs=[/et_pb_dmb_code_snippet]

2.5) [DESTINO] Editar o PFILE criado no passo 2.4, de acordo com o novo ambiente. Mudar o parâmetro COMPATIBLE para “12.1.0.2.0”

 

2.6) [DESTINO] Iniciar a base em modo NOMOUNT usando o PFILE editado no passo 5. Antes, deve-se definir o ORACLE_SID no novo ambiente com o SID da baseque está sendo migrada. O ORACLE_HOME deve ser o do Oracle 12c:

[et_pb_dmb_code_snippet code=”U1FMPiBzdGFydHVwIG5vbW91bnQgcGZpbGU94oCZL2NhbWluaG8vcGZpbGUub3Jh4oCZOw==” _builder_version=”4.0.6″]U1FMPiBzdGFydHVwIG5vbW91bnQgcGZpbGU94oCZL2NhbWluaG8vcGZpbGUub3Jh4oCZOw==[/et_pb_dmb_code_snippet]

OBS1: Definir no parâmetro CONTROL_FILES do pfile, o controlfile gerado no passo 2 e copiado no passo 3 para o servidor de destino.

 

2.7) [DESTINO] Montar a base de dados usando o controlfile gerado no passo 2.2.

 

2.8) [DESTINO] Catalogar os backups e archives gerados no passo 1 e copiados no passo 3. Ex:

[et_pb_dmb_code_snippet code=”Uk1BTj4gQ0FUQUxPRyBTVEFSVCBXSVRIIOKAmC9jYW1pbmhvL2JhY2t1cHMvZnVsbOKAmTsKUk1BTj4gQ0FUQUxPRyBTVEFSVCBXSVRIIOKAmC9jYW1pbmhvL2JhY2t1cHMvYXJjaGl2ZXPigJk7″ _builder_version=”4.0.6″]Uk1BTj4gQ0FUQUxPRyBTVEFSVCBXSVRIIOKAmC9jYW1pbmhvL2JhY2t1cHMvZnVsbOKAmTsKUk1BTj4gQ0FUQUxPRyBTVEFSVCBXSVRIIOKAmC9jYW1pbmhvL2JhY2t1cHMvYXJjaGl2ZXPigJk7[/et_pb_dmb_code_snippet]

2.9) [DESTINO] Após o catalogo de todos os backupsets, iniciar o restore/recover da base de dados. A base de exemplo possui 6 datafiles apenas:

[et_pb_dmb_code_snippet code=”Uk1BTj4gUlVOIHsKQUxMT0NBVEUgQ0hBTk5FTCBDSDAxIERFVklDRSBUWVBFIERJU0s7CkFMTE9DQVRFIENIQU5ORUwgQ0gwMiBERVZJQ0UgVFlQRSBESVNLOwpTRVQgTkVXTkFNRSBGT1IgREFUQUZJTEUgMSBUTyDigJgrREdEQVRB4oCZOwpTRVQgTkVXTkFNRSBGT1IgREFUQUZJTEUgMiBUTyDigJgrREdEQVRB4oCZOwpTRVQgTkVXTkFNRSBGT1IgREFUQUZJTEUgMyBUTyDigJgrREdEQVRB4oCZOwpTRVQgTkVXTkFNRSBGT1IgREFUQUZJTEUgNCBUTyDigJgrREdEQVRB4oCZOwpTRVQgTkVXTkFNRSBGT1IgREFUQUZJTEUgNSBUTyDigJgrREdEQVRB4oCZOwpTRVQgTkVXTkFNRSBGT1IgREFUQUZJTEUgNiBUTyDigJgrREdEQVRB4oCZOwpSRVNUT1JFIERBVEFCQVNFOwpTV0lUQ0ggREFUQUZJTEUgQUxMOwpSRVNUT1JFIERBVEFCQVNFOwp9″ _builder_version=”4.0.6″]Uk1BTj4gUlVOIHsKQUxMT0NBVEUgQ0hBTk5FTCBDSDAxIERFVklDRSBUWVBFIERJU0s7CkFMTE9DQVRFIENIQU5ORUwgQ0gwMiBERVZJQ0UgVFlQRSBESVNLOwpTRVQgTkVXTkFNRSBGT1IgREFUQUZJTEUgMSBUTyDigJgrREdEQVRB4oCZOwpTRVQgTkVXTkFNRSBGT1IgREFUQUZJTEUgMiBUTyDigJgrREdEQVRB4oCZOwpTRVQgTkVXTkFNRSBGT1IgREFUQUZJTEUgMyBUTyDigJgrREdEQVRB4oCZOwpTRVQgTkVXTkFNRSBGT1IgREFUQUZJTEUgNCBUTyDigJgrREdEQVRB4oCZOwpTRVQgTkVXTkFNRSBGT1IgREFUQUZJTEUgNSBUTyDigJgrREdEQVRB4oCZOwpTRVQgTkVXTkFNRSBGT1IgREFUQUZJTEUgNiBUTyDigJgrREdEQVRB4oCZOwpSRVNUT1JFIERBVEFCQVNFOwpTV0lUQ0ggREFUQUZJTEUgQUxMOwpSRVNUT1JFIERBVEFCQVNFOwp9[/et_pb_dmb_code_snippet]

OBS1: O restore encerrará com um erro dizendo que precisa de um archive para continuar. Nesse momento deve-se desligar a base de origem e abrir ela em modo MOUNT, depois realizar um backup dos archives, copiar e catalogar no destino, e recuperar a base de destino. Com isso, a base de origem e destino estarão sincronizadas.

 

2.10) [DESTINO] Após o término do restore/recover, deve-se iniciar a base com a opção UPGRADE e executar os scripts. Neste passo, após o MOUNT, é que seria necessário alterar o nome dos REDO Log Members, caso os caminhos dos arquivos sejam diferentes:

[et_pb_dmb_code_snippet code=”U1FMPiBTVEFSVFVQIE5PTU9VTlQgUEZJTEU94oCZL2NhbWluaG8vcGZpbGUub3Jh4oCZOwpTUUw+IEFMVEVSIERBVEFCQVNFIE1PVU5UOwpTUUw+IEFMVEVSIERBVEFCQVNFIE9QRU4gUkVTRVRMT0dTIFVQR1JBREU7ClNRTD4gRVhJVAoKIyMjIGFjZXNzYXIgbyBkaXJldMOzcmlvIGFiYWl4bwpjZCAkT1JBQ0xFX0hPTUUvcmRibXMvYWRtaW4KCiMjIyBleGVjdXRhciBvIHNjcmlwdAojIyMgZXNzZSBwcm9jZWRpbWVudG8gcG9kZSBkZW1vcmFyCiRPUkFDTEVfSE9NRS9wZXJsL2Jpbi9wZXJsIGNhdGN0bC5wbCBjYXR1cGdyZC5zcWw=” _builder_version=”4.0.6″]U1FMPiBTVEFSVFVQIE5PTU9VTlQgUEZJTEU94oCZL2NhbWluaG8vcGZpbGUub3Jh4oCZOwpTUUw+IEFMVEVSIERBVEFCQVNFIE1PVU5UOwpTUUw+IEFMVEVSIERBVEFCQVNFIE9QRU4gUkVTRVRMT0dTIFVQR1JBREU7ClNRTD4gRVhJVAoKIyMjIGFjZXNzYXIgbyBkaXJldMOzcmlvIGFiYWl4bwpjZCAkT1JBQ0xFX0hPTUUvcmRibXMvYWRtaW4KCiMjIyBleGVjdXRhciBvIHNjcmlwdAojIyMgZXNzZSBwcm9jZWRpbWVudG8gcG9kZSBkZW1vcmFyCiRPUkFDTEVfSE9NRS9wZXJsL2Jpbi9wZXJsIGNhdGN0bC5wbCBjYXR1cGdyZC5zcWw=[/et_pb_dmb_code_snippet]

OBS1: É possíve paralelizar a execução do “catctl.pl”. “X” indica o grau de paralelização: $ORACLE_HOME/perl/bin/perl catctl.pl -n X catupgrd.sql

OBS2: Após a execução do “catctl.pl”, a base de dados será automaticamente desligada.

 

2.11) [DESTINO] Após o término da execução do script “catctl.pl”, iniciar normalmente a base de dados, que já deverá estar atualizada:

[et_pb_dmb_code_snippet code=”U1FMPiBTVEFSVFVQIE5PTU9VTlQgUEZJTEU94oCZL2NhbWluaG8vcGZpbGUub3Jh4oCZOwpTUUw+IEFMVEVSIERBVEFCQVNFIE1PVU5UOwpTUUw+IEFMVEVSIERBVEFCQVNFIE9QRU47″ _builder_version=”4.0.6″]U1FMPiBTVEFSVFVQIE5PTU9VTlQgUEZJTEU94oCZL2NhbWluaG8vcGZpbGUub3Jh4oCZOwpTUUw+IEFMVEVSIERBVEFCQVNFIE1PVU5UOwpTUUw+IEFMVEVSIERBVEFCQVNFIE9QRU47[/et_pb_dmb_code_snippet]

2.12) [DESTINO] Executar o script “utlu121s.sql” para checar se todos os componentes foram atualizados, e se existe algum erro:

[et_pb_dmb_code_snippet code=”Y2QgJE9SQUNMRV9IT01FL3JkYm1zL2FkbWluCnNxbHBsdXMgLyBhcyBzeXNkYmEKU1FMPiBAdXRsdTEyMXMuc3FsCgojIyMgY2FzbyBvY29ycmEgYWxndW0gZXJybyBkdXJhbnRlIG8gcHJvY2Vzc28gZGUgdXBncmFkZSwgbyBzZWd1aW50ZSBzY3JpcHQgZGV2ZSBzZXIgZXhlY3V0YWRvIG1hbnVhbG1lbnRlOgoKU1FMPiBAY2F0dXBwc3Quc3Fs” _builder_version=”4.0.6″]Y2QgJE9SQUNMRV9IT01FL3JkYm1zL2FkbWluCnNxbHBsdXMgLyBhcyBzeXNkYmEKU1FMPiBAdXRsdTEyMXMuc3FsCgojIyMgY2FzbyBvY29ycmEgYWxndW0gZXJybyBkdXJhbnRlIG8gcHJvY2Vzc28gZGUgdXBncmFkZSwgbyBzZWd1aW50ZSBzY3JpcHQgZGV2ZSBzZXIgZXhlY3V0YWRvIG1hbnVhbG1lbnRlOgoKU1FMPiBAY2F0dXBwc3Quc3Fs[/et_pb_dmb_code_snippet]

2.13) [DESTINO] Esse passo não é obrigatório, mas recomenda-se recompilar os objetos inválidos:

[et_pb_dmb_code_snippet code=”Y2QgJE9SQUNMRV9IT01FL3JkYm1zL2FkbWluCnNxbHBsdXMgLyBhcyBzeXNkYmEKU1FMPiBAdXRscnAuc3FsClNRTD4gQHV0bHVpb2JqLnNxbApTUUw+IHV0bHUxMjFzLnNxbCAjIyMgY2hlY2FuZG8gbm92YW1lbnRlIHNlIHRvZG9zIG9zIGNvbXBvbmVudGVzIGVzdMOjbyBjb20gbyBzdGF0dXMg4oCcVkFMSUTigJ0=” _builder_version=”4.0.6″]Y2QgJE9SQUNMRV9IT01FL3JkYm1zL2FkbWluCnNxbHBsdXMgLyBhcyBzeXNkYmEKU1FMPiBAdXRscnAuc3FsClNRTD4gQHV0bHVpb2JqLnNxbApTUUw+IHV0bHUxMjFzLnNxbCAjIyMgY2hlY2FuZG8gbm92YW1lbnRlIHNlIHRvZG9zIG9zIGNvbXBvbmVudGVzIGVzdMOjbyBjb20gbyBzdGF0dXMg4oCcVkFMSUTigJ0=[/et_pb_dmb_code_snippet]

2.14) Após isso, a base de dados atualizada já podera ser usada normalmente. Lembrando que a base migrada e atualizada é do tipo “non-CDB”. É possível pluga-la em um CDB usando o pacote DBMS_PDB. Falarei sobre esse procedimento em outro post.

 

3 – Notas 

N1: A base ainda estará usando um PFILE para iniciar. Deve-se criar um SPFILE a partir desse PFILE dentro do ASM.

 

N2: A base de dados estará montada usando apenas um controlfile, localizado no filesystem. Após o procedimento de upgrade, deve-se desligar a base e copiar o controlfile usado para dentro do ASM, atualizando o parâmetro CONTROL_FILES de acordo.

 

N3: A base restaurada não será registrada automaticamente no Clusterware. Neste caso, deve-se criar um serviço manualmente. Abaixo segue um exemplo tomando como referência a base DBMIGRA, que foi usada em todo este documento. O comando foi executado com o usuário “oracle”:

[et_pb_dmb_code_snippet code=”c3J2Y3RsIGFkZCBkYXRhYmFzZSAtZCBkYm1pZ3JhIC1uIGRibWlncmEgLWEg4oCcREdEQVRBLERHRlJB4oCdIC1yIHByaW1hcnkgLXMgb3BlbiAtbyAvdTAyL2FwcC9vcmFjbGUvcHJvZHVjdC8xMi4xLjAvZGJob21lXzEgLXAgK0RHREFUQS9EQk1JR1JBL1BBUkFNRVRFUkZJTEUvc3BmaWxlLjI5My44ODg1MTE3MDk=” _builder_version=”4.0.6″]c3J2Y3RsIGFkZCBkYXRhYmFzZSAtZCBkYm1pZ3JhIC1uIGRibWlncmEgLWEg4oCcREdEQVRBLERHRlJB4oCdIC1yIHByaW1hcnkgLXMgb3BlbiAtbyAvdTAyL2FwcC9vcmFjbGUvcHJvZHVjdC8xMi4xLjAvZGJob21lXzEgLXAgK0RHREFUQS9EQk1JR1JBL1BBUkFNRVRFUkZJTEUvc3BmaWxlLjI5My44ODg1MTE3MDk=[/et_pb_dmb_code_snippet]

Bom, é isso por enquanto. Lembrando que a base migrada será do tipo “non-CDB”. Ela poderá ser posteriormente plugada em um CDB usando o pacote DBMS_PDB. Esse procedimento ficará para um outro post. Obrigado a todos.