Migrandos as bases legadas para o Oracle 19c
Neste artigo, não abordarei a atualização do banco de dados no mesmo servidor utilizando o DBUA (Database Upgrade Assistant), pois esse procedimento já é amplamente documentado.
Em vez disso, meu foco será a migração para um novo servidor, explorando estratégias que garantam integridade dos dados, continuidade operacional e eficiência no processo. Apresentarei métodos que minimizam o tempo de indisponibilidade, assegurando uma transição segura e bem planejada para o Oracle 19c.
Para ilustrar o processo, simularei um ambiente de produção baseado no Oracle 11g, que servirá como ponto de partida para a migração. O objetivo é demonstrar a transição para três cenários distintos:
- Migração para File System
- Migração para ASM (Automatic Storage Management)
- Migração via IMPDP utilizando a rede
Além disso, abordarei estratégias avançadas de migração, como o uso do Data Guard e do GoldenGate, destacando suas vantagens e aplicabilidade para cenários que exigem mínima ou nenhuma indisponibilidade.
Todas as bases legadas devem ser previamente atualizadas para a versão 11.2.0.4 antes de prosseguir com a migração para o Oracle Database 19c.
Criando o ambiente no Oracle 11g
Estou simulando um ambiente de produção em menor escala no oracle 11g
— Verificar onde esta os datafiles
select name from v$datafile;
— Verifique se o parâmetro está devidamente configurado. Caso não esteja, ajuste-o corretamente com base no resultado da consulta acima.
show parameter db_create_file_dest
alter system set db_create_file_dest='/u02/oradata' scope=both sid='*';
— Criando as tablespaces
create tablespace ts1 datafile size 1m autoextend on next 1m maxsize unlimited;
create tablespace ts2 datafile size 1m autoextend on next 1m maxsize unlimited;
create tablespace ts3 datafile size 1m autoextend on next 1m maxsize unlimited;
create tablespace ts4 datafile size 1m autoextend on next 1m maxsize unlimited;
— Criando owner e usuarios de cada Aplicação
create USER owner1 identified by senha default tablespace ts1 quota unlimited on ts1;
create USER owner2 identified by senha default tablespace ts2 quota unlimited on ts2;
create USER owner3 identified by senha default tablespace ts3 quota unlimited on ts3;
create USER owner4 identified by senha default tablespace ts4 quota unlimited on ts4;
create USER USER1 identified by senha default tablespace ts1 quota unlimited on ts1;
create USER USER2 identified by senha default tablespace ts2 quota unlimited on ts2;
create USER USER3 identified by senha default tablespace ts3 quota unlimited on ts3;
create USER USER4 identified by senha default tablespace ts4 quota unlimited on ts4;
— Criando 1 tabela para cada owner
create table owner1.tabela1 tablespace ts1 as select * from all_objects;
create table owner2.tabela2 tablespace ts2 as select * from all_objects;
create table owner3.tabela3 tablespace ts3 as select * from all_objects;
create table owner4.tabela4 tablespace ts4 as select * from all_objects;
— Criando 1 role para cada Aplicação
create role role1;
create role role2;
create role role3;
create role role4;
— Dando permissões roles, owners e usuarios.
GRANT SELECT ON OWNER1.TABELA1 TO ROLE1;
GRANT SELECT ON OWNER2.TABELA2 TO ROLE2;
GRANT SELECT ON OWNER3.TABELA3 TO ROLE3;
GRANT SELECT ON OWNER4.TABELA4 TO ROLE4;
GRANT DBA TO OWNER1,OWNER2,OWNER3,OWNER4;
GRANT CONNECT,ROLE1 TO USER1;
GRANT CONNECT,ROLE2 TO USER2;
GRANT CONNECT,ROLE3 TO USER3;
GRANT CONNECT,ROLE4 TO USER4;
Neste momento, o ambiente está totalmente preparado para a migração para o Oracle 19c. Agora, o que será migrado?
Esta consulta é fundamental para garantir o sucesso da migração.
column PROPERTY_NAME format a35
column PROPERTY_NAME format a20
column DESCRIPTION format a20
SQL> select * from database_properties where PROPERTY_NAME in ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');
O banco de dados Oracle 19c deve estar configurado com NLS_CHARACTERSET WE8MSWIN1252. Embora não seja um requisito obrigatório, essa configuração aumenta as chances de uma migração bem-sucedida.
select tablespace_name from dba_tablespaces order by 1;
Criando 2 bases 19c
orcl1 será asm
dbca -silent -createDatabase -templateName General_Purpose.dbc -gdbName orcl1 -sid orcl1 -characterSet WE8MSWIN1252 -sysPassword senha -systemPassword senha -storageType ASM -datafileDestination DG_DATA -redoLogFileSize 50 -createAsContainerDatabase true -numberOfPDBs 1 -pdbName PDB1 -pdbAdminPassword Oracle_#123 -emConfiguration NONE
orcl2 será file system
dbca -silent -createDatabase -templateName General_Purpose.dbc -gdbName orcl2 -sid orcl2 -characterSet WE8MSWIN1252 -sysPassword senha -systemPassword senha -storageType FS -datafileDestination /u01/app/oracle/oradata -redoLogFileSize 50 -createAsContainerDatabase true -numberOfPDBs 1 -pdbName PDB1 -pdbAdminPassword Oracle_#123 -emConfiguration NONE
Preparando o novo ambiente para a recepção dos dados do Oracle 11g.
Show pdbs
select name from v$datafile;
show parameter db_create_file_dest
alter system set db_create_file_dest='/u01/app/oracle/oradata' scope=both sid='*';
CREATE PLUGGABLE DATABASE fs_11g ADMIN USER PDBADMIN IDENTIFIED BY PDBADMIN ;
ALTER PLUGGABLE DATABASE fs_11g OPEN;
ALTER PLUGGABLE DATABASE fs_11g SAVE STATE;
ALTER SESSION SET CONTAINER=fs_11g;
select tablespace_name from dba_tablespaces;
Essas tablespaces não serão incluídas no processo de migração do Oracle 11g. Portanto, iremos selecionar apenas as demais tablespaces para a transição.
No Oracle 11g
select tablespace_name from dba_tablespaces where tablespace_name not in ('SYSTEM','SYSAUX','UNDOTBS1','TEMP');
Houve uma mudança no sistema operacional, passando de Solaris ou AIX para Linux, por exemplo. Neste documento, o ambiente de destino será o Linux.
São esses datafiles que iremos migrar.
select file_name from dba_Data_Files where tablespace_name not in ('SYSTEM','SYSAUX','UNDOTBS1','TEMP');
No Oracle 19c
select name from v$datafile;
O comando para mudar de sistema operacional
convert datafile 'origem' to platform 'Linux x86 64-bit' format 'destino' parallelism 4;
Se o seu ambiente possuir uma alta capacidade de processamento (CPU), é possível utilizar um nível maior de paralelismo, reduzindo significativamente o tempo de migração. Como exemplo, configurei o paralelismo em 4.
Aqui estão exemplos fictícios demonstrando a conversão de datafiles dentro do mesmo sistema operacional, evidenciando a possibilidade de migração tanto para File System quanto para ASM:
- Migração para File System:
CONVERT DATAFILE '/u02/oradata/orcl11g/users01.dbf'
FORMAT '/u01/base/datafile/users01.dbf';
- Migração para ASM:
CONVERT DATAFILE '/u02/oradata/orcl11g/users01.dbf'
FORMAT '+DATA/base/datafile/users01.dbf';
Esses exemplos ilustram a flexibilidade do processo de migração, permitindo a transição para diferentes tipos de armazenamento de acordo com a necessidade do ambiente.
Datafiles de Origem (Oracle 11g)
/u02/oradata/orcl11g/users01.dbf
/u02/oradata/orcl11g/example01.dbf
/u02/oradata/ORCL11G/datafile/o1_mf_ts1_mxzzgpcl_.dbf
/u02/oradata/ORCL11G/datafile/o1_mf_ts2_mxzzgpqt_.dbf
/u02/oradata/ORCL11G/datafile/o1_mf_ts3_mxzzgq3m_.dbf
/u02/oradata/ORCL11G/datafile/o1_mf_ts4_mxzzgsr1_.dbf
Dafiles de Destino (ainda não existem) (Oracle 19c)
/u01/app/oracle/oradata/ORCL2/310BD390EC532AEBE063DC00A8C07EEB/datafile/users01.dbf
/u01/app/oracle/oradata/ORCL2/310BD390EC532AEBE063DC00A8C07EEB/datafile/example01.dbf
/u01/app/oracle/oradata/ORCL2/310BD390EC532AEBE063DC00A8C07EEB/datafile/ts101.dbf
/u01/app/oracle/oradata/ORCL2/310BD390EC532AEBE063DC00A8C07EEB/datafile/ts201.dbf
/u01/app/oracle/oradata/ORCL2/310BD390EC532AEBE063DC00A8C07EEB/datafile/ts301.dbf
/u01/app/oracle/oradata/ORCL2/310BD390EC532AEBE063DC00A8C07EEB/datafile/ts401.dbf
Verifique no Oracle 11g se a tablespace é elegível para transporte.
SELECT 'EXEC SYS.DBMS_TTS.TRANSPORT_SET_CHECK(ts_list => '||chr(39)||tablespace_name||chr(39)||', incl_constraints => TRUE);' comando,' SELECT * FROM transport_set_violations;' verificar from dba_tablespaces where tablespace_name not in ('SYSTEM','SYSAUX','UNDOTBS1','TEMP');
Todas as tablespaces são elegíveis para transporte. Caso alguma restrição seja identificada, será necessário corrigi-la antes de prosseguir com a migração.
No Oracle 11g
Iremos colocar todas as tablespaces em READ ONLY;
select 'alter tablespace '||tablespace_name||' read only;' comando from dba_tablespaces where tablespace_name not in ('SYSTEM','SYSAUX','UNDOTBS1','TEMP');
Criando um diretório para armazenar os datafiles convertidos ou copiados da origem.
cd /u01
mkdir backup
cp /u02/oradata/orcl11g/users01.dbf /u01/backup/users01.dbf
cp /u02/oradata/orcl11g/example01.dbf /u01/backup/example01.dbf
cp /u02/oradata/ORCL11G/datafile/o1_mf_ts1_mxzzgpcl_.dbf /u01/backup/ts1_01.dbf
cp /u02/oradata/ORCL11G/datafile/o1_mf_ts2_mxzzgpqt_.dbf /u01/backup/ts2_01.dbf
cp /u02/oradata/ORCL11G/datafile/o1_mf_ts3_mxzzgq3m_.dbf /u01/backup/ts3_01.dbf
cp /u02/oradata/ORCL11G/datafile/o1_mf_ts4_mxzzgsr1_.dbf /u01/backup/ts4_01.dbf
Copie para area de backup
Agora, vamos criar um DIRECTORY no Oracle para utilização no expdp.
No Oracle 19c
set pagesize 500
select username from dba_users order by 1;
No processo de exportação (expdp) do Oracle 11g, excluirei diversos usuários que já existem no ambiente de destino no Oracle 19c. Dessa forma, evitamos redundâncias e garantimos uma migração mais eficiente.
expdp system/senha DIRECTORY=oracle11 DUMPFILE=oracle11g.dmp VERSION=12 FULL=Y TRANSPORTABLE=ALWAYS EXCLUDE=TABLE_STATISTICS,INDEX_STATISTICS LOGFILE=oracle1 1g.log REUSE_DUMPFILES=y EXCLUDE=SCHEMA:\"IN\(\'APPQOSSYS\',\'AUDSYS\',\'CTXSYS\',\'DBSFWUSER\',\'DBSNMP\',\'DIP\',\'DVF\',\'DVSYS\',\'GGSYS\',\'GSMADMIN_INTERNAL\',\'GSMCATUSER\',\'GSMUSER\',\'LBACSYS\',\'MDDATA\',\'MDSYS\',\'OJVMSYS\',\'OLAPSYS\',\'ORACLE_OCM\',\'ORDDATA\',\'ORDPLUGINS\',\'ORDSYS\',\'OUTLN\',\'PDBADMIN\',\'REMOTE_SCHEDULER_AGENT\',\'SI_INFORMTN_SCHEMA\',\'SH\',\'SYS$UMF\',\'SYSBACKUP\',\'SYSDG\',\'SYSKM\',\'SYSRAC\',\'SYSTEM\',\'WMSYS\',\'XDB\'\)\" \
Explicação das sintaxes especiais:
EXCLUDE=SCHEMA: Exclui os esquemas listados.
Aspas duplas (\”) e parênteses escapados (\( e \)) garantem que o shell não interprete os caracteres de forma incorreta.
DUMPFILE e LOGFILE: Define os arquivos de dump e log.
FULL=Y: Faz a exportação completa do banco, excluindo apenas os esquemas especificados.
REUSE_DUMPFILES=Y: Permite sobrescrever os arquivos de dump caso já existam.
Esse comando pode ser executado diretamente no terminal Linux.
Após a execução do expdp, percebi que os usuários SYSMAN e APEX_030200 não precisam ser migrados. Portanto, irei adicioná-los à lista de EXCLUDE para otimizar o processo de exportação.
O comando ficou assim:
expdp system/senha DIRECTORY=oracle11 DUMPFILE=oracle11g.dmp VERSION=12 FULL=Y TRANSPORTABLE=ALWAYS EXCLUDE=TABLE_STATISTICS,INDEX_STATISTICS LOGFILE=oracle11g.log REUSE_DUMPFILES=y EXCLUDE=SCHEMA:\"IN\(\'APPQOSSYS\',\'AUDSYS\',\'CTXSYS\',\'DBSFWUSER\',\'DBSNMP\',\'DIP\',\'DVF\',\'DVSYS\',\'GGSYS\',\'GSMADMIN_INTERNAL\',\'GSMCATUSER\',\'GSMUSER\',\'LBACSYS\',\'MDDATA\',\'MDSYS\',\'OJVMSYS\',\'OLAPSYS\',\'ORACLE_OCM\',\'ORDDATA\',\'ORDPLUGINS\',\'ORDSYS\',\'OUTLN\',\'PDBADMIN\',\'REMOTE_SCHEDULER_AGENT\',\'SI_INFORMTN_SCHEMA\',\'SH\',\'SYS$UMF\',\'SYSBACKUP\',\'SYSDG\',\'SYSKM\',\'SYSRAC\',\'SYSTEM\',\'WMSYS\',\'XDB\',\'SYSMAN\',\'APEX_030200\'\)\" \
Ao final do processo de expdp, são exibidas as tablespaces que estão sendo transportadas.
******************************************************************************
Datafiles required for transportable tablespace EXAMPLE:
/u02/oradata/orcl11g/example01.dbf
Datafiles required for transportable tablespace TS1:
/u02/oradata/ORCL11G/datafile/o1_mf_ts1_mxzzgpcl_.dbf
Datafiles required for transportable tablespace TS2:
/u02/oradata/ORCL11G/datafile/o1_mf_ts2_mxzzgpqt_.dbf
Datafiles required for transportable tablespace TS3:
/u02/oradata/ORCL11G/datafile/o1_mf_ts3_mxzzgq3m_.dbf
Datafiles required for transportable tablespace TS4:
/u02/oradata/ORCL11G/datafile/o1_mf_ts4_mxzzgsr1_.dbf
Datafiles required for transportable tablespace USERS:
/u02/oradata/orcl11g/users01.dbf
Job "SYSTEM"."SYS_EXPORT_FULL_01" successfully completed at Sun Mar 23 16:39:41 2025 elapsed 0 00:01:37
[oracle@servidor3 backup]$
No Oracle 19c, ao tentar criar o diretório com o usuário oracle:
cd /u01
mkdir backup
Foi identificado que o usuário oracle não possuía permissão para essa ação.
Por isso, o diretório foi criado utilizando o usuário root.
Agora, irei copiar todos os arquivos do diretório /u01/backup do servidor3 (Oracle 11g) para o diretório /u01/backup no servidor ol7server (Oracle 19c).
scp /u01/backup/*.* oracle@192.168.0.220:/u01/backup
Realizar a transferência dos datafiles para o diretório da base FS_11G, garantindo uma migração segura e eficiente.
cp /u01/backup/*.dbf /u01/app/oracle/oradata/ORCL2/310BD390EC532AEBE063DC00A8C07EEB/datafile/
Conforme tela acima já criei o diretório para fazer o impdp.
Adicionar no tnsnames.ora
fs_11g =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.220)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = fs_11g)
)
)
Testar conexão
impdp system/senha@fs_11g DIRECTORY=oracle11 DUMPFILE=oracle11g.dmp LOGFILE=impdporacle11g.log TRANSPORT_DATAFILES='/u01/app/oracle/oradata/ORCL2/310BD390EC532AEBE063DC00A8C07EEB/datafile/example01.dbf','/u01/app/oracle/oradata/ORCL2/310BD390EC532AEBE063DC00A8C07EEB/datafile/users01.dbf','/u01/app/oracle/oradata/ORCL2/310BD390EC532AEBE063DC00A8C07EEB/datafile/ts1_01.dbf','/u01/app/oracle/oradata/ORCL2/310BD390EC532AEBE063DC00A8C07EEB/datafile/ts2_01.dbf','/u01/app/oracle/oradata/ORCL2/310BD390EC532AEBE063DC00A8C07EEB/datafile/ts3_01.dbf','/u01/app/oracle/oradata/ORCL2/310BD390EC532AEBE063DC00A8C07EEB/datafile/ts4_01.dbf'
Verificando
select tablespace_name from dba_tablespaces;
select username from dba_users where username like 'US%'
union
select username from dba_users where username like 'OWN%';
select role from dba_Roles where role like 'ROLE%';
SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE LIKE 'US%' UNION
SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE LIKE 'OWNER%';
SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTEE LIKE 'US%' UNION
SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTEE LIKE 'OWNER%';
SELECT * FROM DBA_TAB_PRIVS WHERE GRANTEE LIKE 'ROLE%';
Concluí com êxito a migração do File System, garantindo uma transição eficiente e bem-sucedida.
Daremos início agora ao processo de migração utilizando ASM.
Preparando o novo ambiente para a recepção dos dados do Oracle 11g.
Show pdbs
select name from v$datafile;
show parameter db_create_file_dest
alter system set db_create_file_dest='/u01/app/oracle/oradata' scope=both sid='*';
CREATE PLUGGABLE DATABASE baseasm_11g ADMIN USER PDBADMIN IDENTIFIED BY PDBADMIN ;
ALTER PLUGGABLE DATABASE baseasm_11g OPEN;
ALTER PLUGGABLE DATABASE baseasm_11g SAVE STATE;
ALTER SESSION SET CONTAINER=baseasm_11g;
select tablespace_name from dba_tablespaces;
Essas tablespaces não serão incluídas no processo de migração do Oracle 11g. Portanto, iremos selecionar apenas as demais tablespaces para a transição.
No Oracle 11g
select tablespace_name from dba_tablespaces where tablespace_name not in ('SYSTEM','SYSAUX','UNDOTBS1','TEMP');
São esses datafiles que iremos migrar.
select file_name from dba_Data_Files where tablespace_name not in ('SYSTEM','SYSAUX','UNDOTBS1','TEMP');
No Oracle 19c
select name from v$datafile;
Esses são os arquivos que iremos format em ASM.
CONVERT DATAFILE '/u01/backup/users01.dbf' FORMAT '+DG_DATA/ORCL1/311F933B879B244FE063DC00A8C02C7C/DATAFILE/users01.dbf';
CONVERT DATAFILE '/u01/backup/example01.dbf' FORMAT '+DG_DATA/ORCL1/311F933B879B244FE063DC00A8C02C7C/DATAFILE/example01.dbf';
CONVERT DATAFILE '/u01/backup/ts1_01.dbf' FORMAT '+DG_DATA/ORCL1/311F933B879B244FE063DC00A8C02C7C/DATAFILE/ts1_01.dbf';
CONVERT DATAFILE '/u01/backup/ts2_01.dbf' FORMAT '+DG_DATA/ORCL1/311F933B879B244FE063DC00A8C02C7C/DATAFILE/ts2_01.dbf';
CONVERT DATAFILE '/u01/backup/ts3_01.dbf' FORMAT '+DG_DATA/ORCL1/311F933B879B244FE063DC00A8C02C7C/DATAFILE/ts3_01.dbf';
CONVERT DATAFILE '/u01/backup/ts4_01.dbf' FORMAT '+DG_DATA/ORCL1/311F933B879B244FE063DC00A8C02C7C/DATAFILE/ts4_01.dbf';
Para verificar os arquivos no ASM como usuário grid, utilize o seguinte comando:
asmcmd ls +DG_DATA/ORCL1/311EA1FF08DF1303E063DC00A8C0C7B5/DATAFILE
Esse comando listará os arquivos presentes no diretório DATAFILE, permitindo confirmar que os arquivos foram convertidos para ASM.
Criando um DIRECTORY para realizar a importação de dados com o impdp.
CREATE DIRECTORY ORACLE11 AS '/u01/backup';
grant read,write on directory oracle11 to system;
Adicionar no tnsnames.ora
baseasm_11g =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.220)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = baseasm_11g)
)
)
Testar conexão
impdp system/senha@baseasm_11g DIRECTORY=oracle11 DUMPFILE=oracle11g.dmp LOGFILE=impdporacle11g.log TRANSPORT_DATAFILES='+DG_DATA/ORCL1/311F933B879B244FE063DC00A8C02C7C/DATAFILE/users01.dbf','+DG_DATA/ORCL1/311F933B879B244FE063DC00A8C02C7C/DATAFILE/example01.dbf','+DG_DATA/ORCL1/311F933B879B244FE063DC00A8C02C7C/DATAFILE/ts1_01.dbf','+DG_DATA/ORCL1/311F933B879B244FE063DC00A8C02C7C/DATAFILE/ts2_01.dbf','+DG_DATA/ORCL1/311F933B879B244FE063DC00A8C02C7C/DATAFILE/ts3_01.dbf','+DG_DATA/ORCL1/311F933B879B244FE063DC00A8C02C7C/DATAFILE/ts4_01.dbf'
Devido aos erros ocorridos durante a migração do File System, optei por realizar um novo expdp, incluindo os esquemas APEX_030200 e SYSMAN. Agora, iremos analisar quais erros poderão ocorrer no ambiente ASM.
Verificando
select tablespace_name from dba_tablespaces;
select username from dba_users where username like 'US%'
union
select username from dba_users where username like 'OWN%';
select role from dba_Roles where role like 'ROLE%';
column grantee format a10
column privilege format a30
column granted_role format a10
SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE LIKE 'US%' UNION
SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE LIKE 'OWNER%';
SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTEE LIKE 'US%' UNION
SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTEE LIKE 'OWNER%'
column owner format a10
column table_name format a10
column grantor format a10
column PRIVILEGE format a10
set linesize 200
SELECT * FROM DBA_TAB_PRIVS WHERE GRANTEE LIKE 'ROLE%';
Finalizei com sucesso a migração do ASM, assegurando uma transição eficiente e bem-sucedida.
Os métodos utilizados foram expdp seguido de impdp. Existe uma alternativa que utiliza apenas impdp, porém, essa abordagem demanda um alto consumo de rede.
Vale a pena avaliar se a infraestrutura suporta essa carga antes de optar por essa estratégia.
Preparando o novo ambiente para a recepção dos dados do Oracle 11g.
Show pdbs
select name from v$datafile;
show parameter db_create_file_dest
CREATE PLUGGABLE DATABASE fs2_11g ADMIN USER PDBADMIN IDENTIFIED BY PDBADMIN ;
ALTER PLUGGABLE DATABASE fs2_11g OPEN;
ALTER PLUGGABLE DATABASE fs2_11g SAVE STATE;
ALTER SESSION SET CONTAINER=fs2_11g;
select tablespace_name from dba_tablespaces;
create directory oracle11 as '/u01/backup';
grant read,write on directory oracle11 to system;
create public database link oracle11g connect to system identified by senha using 'ORCL11G';
No arquivo tnsnames.ora do Oracle 19c, adicionaremos a entrada correspondente ao Oracle 11g e a nova base criada.
Essa configuração permitirá a comunicação entre os bancos de dados por meio de um dblink, viabilizando o uso da rede para a transferência de dados.
ORCL11G=
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.243)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl11g)
)
)
fs2_11g =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.220)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = fs2_11g)
)
)
Testando database link
A comunicação entre os bancos de dados foi estabelecida com sucesso.TRealizar a transferência dos datafiles para o diretório da base FS2_11G
cp /u01/backup/users01.dbf /u01/app/oracle/oradata/ORCL2/31211854CB7D3C35E063DC00A8C030BC/datafile
cp /u01/backup/example01.dbf /u01/app/oracle/oradata/ORCL2/31211854CB7D3C35E063DC00A8C030BC/datafile
cp /u01/backup/ts1_01.dbf /u01/app/oracle/oradata/ORCL2/31211854CB7D3C35E063DC00A8C030BC/datafile
cp /u01/backup/ts2_01.dbf /u01/app/oracle/oradata/ORCL2/31211854CB7D3C35E063DC00A8C030BC/datafile
cp /u01/backup/ts3_01.dbf /u01/app/oracle/oradata/ORCL2/31211854CB7D3C35E063DC00A8C030BC/datafile
cp /u01/backup/ts4_01.dbf /u01/app/oracle/oradata/ORCL2/31211854CB7D3C35E063DC00A8C030BC/datafile
impdp system/senha@fs2_11g network_link=oracle11g version=12 full=y transportable=always metrics=y exclude=statistics directory=oracle11 logfile=impdp_fs2_11g.log transport_datafiles='/u01/app/oracle/oradata/ORCL2/31211854CB7D3C35E063DC00A8C030BC/datafile/users01.dbf','/u01/app/oracle/oradata/ORCL2/31211854CB7D3C35E063DC00A8C030BC/datafile/example01.dbf','/u01/app/oracle/oradata/ORCL2/31211854CB7D3C35E063DC00A8C030BC/datafile/ts1_01.dbf','/u01/app/oracle/oradata/ORCL2/31211854CB7D3C35E063DC00A8C030BC/datafile/ts2_01.dbf','/u01/app/oracle/oradata/ORCL2/31211854CB7D3C35E063DC00A8C030BC/datafile/ts3_01.dbf','/u01/app/oracle/oradata/ORCL2/31211854CB7D3C35E063DC00A8C030BC/datafile/ts4_01.dbf'
Verificando
select tablespace_name from dba_tablespaces;
select username from dba_users where username like 'US%'
union
select username from dba_users where username like 'OWN%';
select role from dba_Roles where role like 'ROLE%';
column grantee format a10
column privilege format a30
column granted_role format a10
SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE LIKE 'US%' UNION
SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE LIKE 'OWNER%';
SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTEE LIKE 'US%' UNION
SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTEE LIKE 'OWNER%';
column owner format a10
column table_name format a10
column grantor format a10
column PRIVILEGE format a10
set linesize 200
SELECT * FROM DBA_TAB_PRIVS WHERE GRANTEE LIKE 'ROLE%';
Em todos os cenários executados (File System e ASM), utilizando EXPDP e IMPDP, e no último caso, apenas IMPDP via rede para a migração, o processo foi concluído com êxito. Os erros observados foram irrelevantes e não impactaram o resultado final.
Para finalizar a migração em todos os cenários abordados neste artigo, é essencial definir se o Oracle 11g continuará sendo utilizado. Caso seja mantido, será necessário um passo adicional no processo.
Se for esse o caso, todas as tablespaces serão configuradas para o modo READ WRITE:
SELECT 'ALTER TABLESPACE ' || tablespace_name || ' READ WRITE;' AS comando
FROM dba_tablespaces
WHERE tablespace_name NOT IN ('SYSTEM', 'SYSAUX', 'UNDOTBS1', 'TEMP');
Por outro lado, caso o Oracle 11g não seja mais necessário, o ambiente poderá ser encerrado com os seguintes comandos:
SHUTDOWN IMMEDIATE;
EXIT;
Com isso, a migração será concluída com êxito!
Em todos os cenários executados (File System e ASM), utilizando EXPDP e IMPDP, e no último caso, apenas IMPDP via rede para a migração, o processo foi concluído com êxito. Os erros observados foram irrelevantes e não impactaram o resultado final. Vale destacar que este é um ambiente de teste e não um ambiente crítico de produção, onde é fundamental adotar precauções adicionais para garantir total segurança e integridade dos dados.
Ao final do processo de migração, é altamente recomendável executar o seguinte script para recompilar objetos inválidos no banco de dados:
@?/rdbms/admin/utlrp.sql
O script utlrp.sql recompila automaticamente todos os objetos inválidos no banco de dados, garantindo a integridade e o desempenho ideal do ambiente após a migração.
Em ambiente de produção, antes de definir as tablespaces como Read-Only para a migração, é essencial adotar algumas precauções. É fundamental desativar previamente todos os processos que realizam gravações, como Jobs, Schedulers e possíveis tarefas agendadas na Crontab, evitando falhas durante a transição. Lembre-se de que, uma vez em Read-Only, qualquer tentativa de escrita resultará em erros. Normalmente, Schedulers e Jobs são utilizados para essa finalidade, mas é importante verificar se há dependências na Crontab também.
Para gerenciar Jobs durante o processo de migração, existem duas abordagens possíveis:
Opção 1: Utilizando Scripts SQL
1.Crie um arquivo jobs.sql e adicione os seguintes comandos:
spool desativa_job.sql
select 'dbms_job.broken('||job||',true);' from dba_jobs where broken = 'N';
spool off
spool ativa_job.sql
select 'dbms_job.broken('||job||',false);' from dba_jobs where broken = 'N';
spool off
2.Execute o script
@jobs.sql
Isso gerará dois arquivos:
desativa_job.sql → Deve ser executado antes de definir as tablespaces como Read-Only.
ativa_job.sql → Deve ser executado após as tablespaces retornarem para Read-Write (ONLINE).
Opção 2: Ajustando o parâmetro JOB_QUEUE_PROCESSES
1.Consulte o valor atual do parâmetro para posterior restauração:
show parameter job_queue_processes;
2.Para desativar os Jobs, execute:
alter system set job_queue_processes=0 scope=both sid='*';
3.Para reativá-los, basta restaurar o valor salvo anteriormente:
alter system set job_queue_processes=<valor_anterior> scope=both sid='*';
Ambas as abordagens garantem que nenhum Job em execução cause conflitos durante a migração das Tablespaces.
Para desativar e reativar os Schedulers durante a migração, há uma abordagem eficiente utilizando scripts SQL.
1.Crie um arquivo chamado sched.sql e adicione os seguintes comandos:
spool desativa_sched.sql
SELECT 'EXEC dbms_scheduler.disable (''' || owner || '.' || job_name || ''');'
FROM dba_scheduler_jobs
WHERE enabled = 'TRUE'
ORDER BY owner, job_name;
spool off
spool ativa_sched.sql
SELECT 'EXEC dbms_scheduler.enable (''' || owner || '.' || job_name || ''');'
FROM dba_scheduler_jobs
WHERE enabled = 'TRUE'
ORDER BY owner, job_name;
spool off
2.Execução do script:
@sched.sql
Isso gerará dois arquivos:
desativa_sched.sql → Responsável por desativar os Schedulers.
ativa_sched.sql → Responsável por reativá-los.
3.Ordem de execução:
Antes de definir as Tablespaces como Read-Only, execute:
@desativa_sched.sql
Após retornar as Tablespaces para Read-Write (ONLINE), reative os Schedulers com:
@ativa_sched.sql
Essa abordagem garante que nenhum Job Agendado interfira no processo de migração.
Para monitorar a execução de Jobs e Schedulers no banco de dados, utilize os seguintes comandos:
SELECT * FROM DBA_JOBS_RUNNING;
SELECT * FROM DBA_SCHEDULER_RUNNING_JOBS;
Esses comandos exibem a lista de Jobs e Schedulers que estão em execução no momento, permitindo um gerenciamento preciso antes de realizar manutenções ou migrações no ambiente.
Uma estratégia amplamente adotada por muitas empresas para migrações seguras e com baixa indisponibilidade é a criação de um novo servidor contendo ambas as versões do Oracle: a antiga e a nova.
Passo a passo da abordagem
1.Configuração do Data Guard:
- No novo servidor, configuramos um Data Guard com a versão antiga do Oracle, mantendo a replicação ativa e sincronizada com o ambiente de produção atual.
2.Sincronização e agendamento da migração:
- Após a validação do funcionamento e da atualização contínua do Data Guard, define-se uma data para a migração definitiva.
3.Interrupção controlada e ativação do novo ambiente:
- No momento da transição:
- Desativamos o Primary no ambiente antigo.
- Paralisamos o Standby no novo servidor.
- Convertendo o Standby em Primary, ativamos o banco de dados na nova infraestrutura.
4.Atualização para a nova versão do Oracle:
- Com o ambiente já operacional, utilizamos o DBUA (Database Upgrade Assistant) para realizar a atualização do Oracle.
5.Plano de contingência:
Caso ocorra algum problema durante a migração, o ambiente antigo pode ser rapidamente reativado, garantindo um rollback seguro.
Pontos importantes:
O tempo de indisponibilidade é reduzido, pois a maior parte do processo ocorre de forma prévia e sincronizada.
O Data Guard só pode ser implementado entre servidores com o mesmo sistema operacional, sendo um requisito essencial para essa abordagem.
Essa estratégia já foi aplicada com sucesso, demonstrando sua eficácia e confiabilidade no processo de migração do Oracle!
Por fim, embora eu não tenha implementado essa abordagem, existe uma solução avançada para migração sem indisponibilidade: o Oracle GoldenGate.
Essa poderosa tecnologia permite a replicação contínua e em tempo real entre o ambiente de origem e o novo ambiente, garantindo que todas as transações sejam sincronizadas de forma precisa. Assim, a migração ocorre sem impacto na disponibilidade do banco de dados, proporcionando uma transição fluida, segura e imperceptível para os usuários.
O principal desafio dessa solução, no entanto, é o custo, uma vez que a implementação exige a aquisição de duas licenças do Oracle GoldenGate—uma para o ambiente de origem e outra para o ambiente de destino.