Para melhor visualização, recomendo resolução de no mínimo 1280 x 800 e navegador Mozilla Firefox


segunda-feira, 2 de maio de 2016

Abordando a técnica de tablespaces transportáveis no Oracle (Transportable Tablespaces)

Por Eduardo Legatti

Olá,

No artigo de Agosto/2013, eu mostrei como mover ou renomear arquivos de bancos de dados (control files, datafiles, redo log files). Neste artigo irei demonstrar através de um exemplo prático, como podemos plugar tablespaces de um banco de dados em outro banco de dados através do recurso Transportable Tablespaces (TTS) disponível desde a versão do Oracle 8i. Este recurso pode vir a ser útil quando precisamos transferir um grande volume de dados de um banco de dados para outro banco de dados. Ao invés de usar métodos de exportação/importação através dos utilitários exp/imp ou expdp/impdp que poderiam consumir um tempo considerável, usando o método TTS, o tempo para transferir os dados seria praticamente o tempo de realização da cópia dos datafiles do banco de dados de origem para o banco de dados de destino. A figura abaixo ilustra o que será abordado a seguir.



As tablespaces DATA_TTS, INDX_TTS e LOB_TTS pertencentes ao banco de dados BD01 demonstrados abaixo serão alvos da migração para o banco de dados BD02.
 
SQL> select tablespace_name,file_name
  2    from dba_data_files
  3   where tablespace_name in ('DATA_TTS','INDX_TTS','LOB_TTS');

TABLESPACE_NAME          FILE_NAME
------------------------ -----------------------------------------
DATA_TTS                 /oradata/BD01/DATA_TTS_01_001.dbf
INDX_TTS                 /oradata/BD01/INDX_TTS_01_001.dbf
LOB_TTS                  /oradata/BD01/LOB_TTS_01_001.dbf

3 linhas selecionadas.

Segue abaixo os objetos de propriedade do usuário SCOTT que possuem segmentos nessas tablespaces.
 
SQL> select owner,segment_name,segment_type,tablespace_name
  2    from dba_segments
  3   where owner='SCOTT';

OWNER        SEGMENT_NAME                   SEGMENT_TYPE       TABLESPACE_NAME
------------ ------------------------------ ------------------ ----------------
SCOTT        T1                             TABLE              DATA_TTS
SCOTT        PK_T1                          INDEX              INDX_TTS
SCOTT        IDX2                           INDEX              INDX_TTS
SCOTT        SYS_IL0000225643C00003$$       LOBINDEX           LOB_TTS
SCOTT        SYS_LOB0000225643C00003$$      LOBSEGMENT         LOB_TTS

5 linhas selecionadas.


Para que o transporte de tablespaces seja possível, os bancos de dados de origem e destino precisam ter o mesmo CHARACTERSET. Isto é necessário para evitar um erro durante o processo de plugar as tablespaces na qual uma mensagem ORA-29345 é emitida dizendo que não é possível conectar uma tablespace em um banco de dados usando um conjunto de caracteres incompatível.
 
SQL> select * from nls_database_parameters;

PARAMETER                      VALUE
------------------------------ ----------------------------------------
NLS_NCHAR_CHARACTERSET         AL16UTF16
NLS_LANGUAGE                   BRAZILIAN PORTUGUESE
NLS_TERRITORY                  BRAZIL
NLS_CURRENCY                   R$
NLS_ISO_CURRENCY               BRAZIL
NLS_NUMERIC_CHARACTERS         ,.
NLS_CHARACTERSET               WE8MSWIN1252
NLS_CALENDAR                   GREGORIAN
NLS_DATE_FORMAT                DD/MM/RR
NLS_DATE_LANGUAGE              BRAZILIAN PORTUGUESE
NLS_SORT                       WEST_EUROPEAN
NLS_TIME_FORMAT                HH24:MI:SSXFF
NLS_TIMESTAMP_FORMAT           DD/MM/RR HH24:MI:SSXFF
NLS_TIME_TZ_FORMAT             HH24:MI:SSXFF TZR
NLS_TIMESTAMP_TZ_FORMAT        DD/MM/RR HH24:MI:SSXFF TZR
NLS_DUAL_CURRENCY              Cr$
NLS_COMP                       BINARY
NLS_LENGTH_SEMANTICS           BYTE
NLS_NCHAR_CONV_EXCP            FALSE
NLS_RDBMS_VERSION              11.2.0.3.0

20 linhas selecionadas.

O primeiro passo é verificar se as tablespaces são passíveis para utilização do método TTS.
 
SQL> exec SYS.DBMS_TTS.TRANSPORT_SET_CHECK
  2  (ts_list => 'DATA_TTS', incl_constraints => TRUE);

Procedimento PL/SQL concluído com sucesso.
  
SQL> select * from SYS.transport_set_violations;

VIOLATIONS
----------------------------------------------------------------------------------------------------------------------------------------------
ORA-39908: O índice SCOTT.PK_T1 do tablespace INDX_TTS valida as restrições principais  da tabela SCOTT.T1 no tablespace DATA_TTS.
ORA-39905: A tabela SCOTT.SYS_LOB0000225643C00003$$ do tablespace LOB_TTS aponta para o segmento da LOB SCOTT.T1 no tablespace DATA_TTS.

2 linhas selecionadas.

Pelo resultado acima, é possível perceber que a tablespace DATA_TTS sozinha não pode ser transportada pelo fato de violar algumas restrições de dependência com as outras tablespaces. Neste caso, iremos verificar todas as tablespaces ao mesmo tempo conforme demonstrado abaixo.

SQL> exec SYS.DBMS_TTS.TRANSPORT_SET_CHECK
  2  (ts_list => 'DATA_TTS,INDX_TTS,LOB_TTS', incl_constraints => TRUE);

Procedimento PL/SQL concluído com sucesso.

SQL> select * from SYS.transport_set_violations;

não há linhas selecionadas


=====================================

Banco de dados BD01 (Source Database)
=====================================


O primeiro passo a ser realizado é colocar as tablespaces no modo READ ONLY no banco de dados de origem conforme demonstrado abaixo.

SQL> alter tablespace DATA_TTS read only;

Tablespace alterado.

SQL> alter tablespace INDX_TTS read only;

Tablespace alterado.

SQL> alter tablespace LOB_TTS read only;

Tablespace alterado.

A seguir, será necessário exportar os metadados utilizando o Datapump Export (expdp) utilizando a cláusula TRANSPORT_TABLESPACES e indicando as tablespaces que serão transportadas.

export ORACLE_SID=BD01
expdp system/#5ydl3db# dumpfile=BD01_transport_tablespaces.dmp
transport_tablespaces=DATA_TTS,INDX_TTS,LOB_TTS
nologfile=y

Export: Release 11.2.0.3.0 - Production on Mon Mai 2 10:02:58 2016

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Iniciando "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01":  system/******** dumpfile=BD01_transport_tablespaces.dmp transport_tablespaces=DATA_TTS,INDX_TTS,LOB_TTS nologfile=y
Processando o tipo de objeto TRANSPORTABLE_EXPORT/PLUGTS_BLK
Processando o tipo de objeto TRANSPORTABLE_EXPORT/TABLE
Processando o tipo de objeto TRANSPORTABLE_EXPORT/INDEX/INDEX
Processando o tipo de objeto TRANSPORTABLE_EXPORT/CONSTRAINT/CONSTRAINT
Processando o tipo de objeto TRANSPORTABLE_EXPORT/INDEX_STATISTICS
Processando o tipo de objeto TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
Tabela-mestre "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01" carregada/descarregada com sucesso
******************************************************************************
Conjunto de arquivos de dump para SYSTEM.SYS_EXPORT_TRANSPORTABLE_01 e:
  /tmp/BD01_transport_tablespaces.dmp
******************************************************************************
Os arquivos de dados necessarios para o tablespace transportavel DATA_TTS:
  /oradata/BD01/DATA_TTS_01_001.dbf
Os arquivos de dados necessarios para o tablespace transportavel INDX_TTS:
  /oradata/BD01/INDX_TTS_01_001.dbf
Os arquivos de dados necessarios para o tablespace transportavel LOB_TTS:
  /oradata/BD01/LOB_TTS_01_001.dbf
O job "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01" foi concluido com sucesso em 10:04:57

Após a geração do arquivo de dump com os metadados das tablespaces, poderemos copiar os arquivos de dados para o destino conforme demonstrado abaixo.

cp -a /oradata/BD01/DATA_TTS_01_001.dbf /oradata/BD02
cp -a /oradata/BD01/INDX_TTS_01_001.dbf /oradata/BD02
cp -a /oradata/BD01/LOB_TTS_01_001.dbf /oradata/BD02

Após a realização da cópia, as tablespaces no banco de dados de origem já podem voltar a estado READ WRITE.

SQL> alter tablespace DATA_TTS read write;

Tablespace alterado.

SQL> alter tablespace INDX_TTS read write;

Tablespace alterado.

SQL> alter tablespace LOB_TTS read write;

Tablespace alterado.


=====================================

Banco de dados BD02 (Target Database)
=====================================


No banco de dados de destino, o primeiro passo é criar os usuários que possuem objetos nas tablespaces que serão importadas. No meu caso, apenas o usuário SCOTT será criado. Caso o usuário não seja criado, o erro ORA-29342 será emitido com a mensagem que algum usuário não existe no banco de dados.

SQL> create user SCOTT identified by tiger;

Usuário criado.

SQL> grant connect,resource to SCOTT;

Concessão bem-sucedida.

Após a criação do usuário SCOTT no banco de dados BD02, poderemos proceder com a importação do dump utilizando o Datapump Import (impdp) utilizando a cláusula TRANSPORT_DATAFILES e indicando os caminho completo dos datafiles que serão transportados conforme demonstrado abaixo.

export ORACLE_SID=BD02
impdp system/#5ydl3db# dumpfile=BD01_transport_tablespaces.dmp
transport_datafiles='/oradata/BD02/DATA_TTS_01_001.dbf',
                    '/oradata/BD02/INDX_TTS_01_001.dbf',
                    '/oradata/BD02/LOB_TTS_01_001.dbf'
nologfile=y


[oracle@beast TTS2]$ export ORACLE_SID=BD02
[oracle@beast TTS2]$ impdp system/#5ydl3db# dumpfile=BD01_transport_tablespaces.dmp transport_datafiles='/oradata/BD02/DATA_TTS_01_001.dbf','/oradata/BD02/INDX_TTS_01_001.dbf','/oradata/BD02/LOB_TTS_01_001.dbf' nologfile=y

Import: Release 11.2.0.3.0 - Production on Mon Mai 2 10:27:24 2016

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Tabela-mestre "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01" carregada/descarregada com sucesso
Iniciando "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01":  system/******** dumpfile=BD01_transport_tablespaces.dmp transport_datafiles=/oradata/BD02/DATA_TTS_01_001.dbf,/oradata/BD02/INDX_TTS_01_001.dbf,/oradata/BD02/LOB_TTS_01_001.dbf nologfile=y
Processando o tipo de objeto TRANSPORTABLE_EXPORT/PLUGTS_BLK
Processando o tipo de objeto TRANSPORTABLE_EXPORT/TABLE
Processando o tipo de objeto TRANSPORTABLE_EXPORT/INDEX/INDEX
Processando o tipo de objeto TRANSPORTABLE_EXPORT/CONSTRAINT/CONSTRAINT
Processando o tipo de objeto TRANSPORTABLE_EXPORT/INDEX_STATISTICS
Processando o tipo de objeto TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
O job "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01" foi concluido com sucesso em 10:28:49

Pronto. O último passo é colocar as tablespaces no modo READ WRITE.

SQL> alter tablespace DATA_TTS read write;

Tablespace alterado.

SQL> alter tablespace INDX_TTS read write;

Tablespace alterado.

SQL> alter tablespace LOB_TTS read write;

Tablespace alterado.

Após a importação, podemos verificar abaixo que as tablespaces foram transportadas com sucesso no banco de dados BD02.

SQL> select tablespace_name,file_name from dba_data_files
  2   where tablespace_name in ('DATA_TTS','INDX_TTS','LOB_TTS');

TABLESPACE_NAME          FILE_NAME
------------------------ -----------------------------------------
DATA_TTS                 /oradata/BD02/DATA_TTS_01_001.dbf
INDX_TTS                 /oradata/BD02/INDX_TTS_01_001.dbf
LOB_TTS                  /oradata/BD02/LOB_TTS_01_001.dbf

3 linhas selecionadas.

SQL> select owner,segment_name,segment_type,tablespace_name
  2    from dba_segments
  3   where owner='SCOTT';

OWNER        SEGMENT_NAME                   SEGMENT_TYPE       TABLESPACE_NAME
------------ ------------------------------ ------------------ ----------------
SCOTT        T1                             TABLE              DATA_TTS
SCOTT        PK_T1                          INDEX              INDX_TTS
SCOTT        IDX2                           INDEX              INDX_TTS
SCOTT        SYS_IL0000225643C00003$$       LOBINDEX           LOB_TTS
SCOTT        SYS_LOB0000225643C00003$$      LOBSEGMENT         LOB_TTS

5 linhas selecionadas.

Por fim, poderemos revogar o privilégio UNLIMITED TABLESPACE e conceder os privilégios de cota para cada tablespace conforme a seguir.

SQL> revoke unlimited tablespace from SCOTT;

Revogação bem-sucedida.

SQL> alter user SCOTT quota unlimited on DATA_TTS;

Usuário alterado.

SQL> alter user SCOTT quota unlimited on INDX_TTS;

Usuário alterado.

SQL> alter user SCOTT quota unlimited on LOB_TTS;

Usuário alterado.



5 comentários:

Sérgio disse...

Olá! qual seria a melhor maneira de realizar essa cópia de arquivos utilizando ASM? (Mesmo diskgroup, porém outra pasta)

Eduardo Legatti disse...

Olá Sérgio,

O recurso de Transportable Tablespaces (TTS) é utilizado para transportar as tablespaces e seus datafiles entre bancos de dados. O que você está querendo fazer exatamente?

Abraços,

Legatti

Sérgio disse...

Olá Legatti,

Preciso exportar um schema que está demorando várias horas via expdp de uma instância Oracle para outra. As instâncias estão no mesmo servidor e no mesmo disk group.

Eduardo Legatti disse...

Olá Sérgio,

Acredito que os passos são bem parecidos. A diferença aí é de copiar os arquivos ASM da origem para o destino. Verifique se esse artigo pode te ajudar

Transportable Tablespace on 11g ASM to ASM
https://ronniethedba.wordpress.com/2016/01/18/transportable-tablespace-on-11g-asm-to-asm/

Abraços,

Legatti

Sérgio disse...

Olá Legatti, agora estou tendo problemas devido ao erro abaixo. Tentei realizar os procedimentos do Doc ID 1176443.1 sem sucesso; creio que será necessário abrir uma SR na Oracle. Obrigado pelo link de referência!

RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of transport tablespace command at 12/21/2020 18:02:29
RMAN-04014: startup failed: ORA-04031: unable to allocate 82976 bytes of shared memory ("shared pool","unknown object","sga heap(1,0)","KEWS sesstat values")

Postagens populares