Olá pessoal,
Espero que estejam bem!
Sou membro de um grupo no WhatsApp para DBA’s, e um dos membros do grupo fez uma pergunta de como exportar uma lista grande de tabelas com o DataPump.
Esse grupo é o DBA Brasil. Você pode entrar no grupo através desse link: https://dbabrasil.net.br/formulario-redes-sociais/
Essa pergunta pode soar um pouco básica, mas, não é.
Quando você não quer ou não pode exportar um schema inteiro, mas, somente uma lista de tabelas, dependendo da quantidade de caracteres, você pode encontrar alguns problemas:
- UDE-00014: invalid value for parameter, ‘<parameter_value>’
- UDE-00019: ‘tables’ parameter list is too long
Nós também temos a seguinte nota de suporte mencionando sobre isso:
4000 Bytes Character Limit in DataPump Parameter File (Doc ID 2275833.1)
Se você tentar exportar uma lista grande de tabelas passando elas como valor para o parâmetro TABLES (ou mesmo o parâmetro INCLUDE, ou até EXCLUDE), você está limitado à 4000 caracteres. Portanto, par ilustrar e dar um exemplo, imagina que você precisa exportar uma lista de tabelas de um owner chamado OWNER_TEST. O que nós precisamos fazer é conectar ao banco de dados (usando o usuário que você vai realizar o export ou até mesmo um usuário com privilégio de DBA):
create table export_tables (table_name varchar2(128)) tablespace users;
Table created.
insert into export_tables values (‘TABLE1’);
1 row created.
insert into export_tables values (‘TABLE2’);
1 row created.
commit;
Commit complete.
select * from export_tables;
TABLE_NAME
——————–
TABLE1
TABLE2
Portanto, nós precisamos criar o que chamamos de tabela de “trabalho”. Inserir nessa tabela de trabalho todos os nomes de tabelas que gostaríamos de exportar, e, então, usar o DataPump. O comando de export está listado abaixo, portanto, à partir do servidor de banco de dados (Linux no meu caso):
expdp owner_test/mypassword directory=export dumpfile=exp_test.dmp logfile=exp_test.log INCLUDE=TABLE:\”IN (SELECT table_name FROM owner_test.export_tables)\” SCHEMAS=OWNER_TEST
Export: Release 19.0.0.0.0 – Production on Mon May 27 21:41:22 2024
Version 19.21.0.0.0
Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 – Production
FLASHBACK automatically enabled to preserve database integrity.
Starting “OWNER_TEST”.”SYS_EXPORT_SCHEMA_01″: “/ AS SYSDBA” directory=extract dumpfile=exp_test.dmp logfile=exp_test.log INCLUDE=TABLE:”IN (SELECT table_name FROM owner_test.export_tables)” SCHEMAS=OWNER_TEST
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/PROCACT_INSTANCE
Processing object type SCHEMA_EXPORT/TABLE/TABLE
. . exported “OWNER_TEST”.”TABLE1″ 544.7 KB 36745 rows
. . exported “OWNER_TEST”.”TABLE2″ 184.7 KB 11927 rows
ORA-39173: Encrypted data has been stored unencrypted in dump file set.
Master table “SYS”.”SYS_EXPORT_SCHEMA_01″ successfully loaded/unloaded
******************************************************************************
Dump file set for SYS.SYS_EXPORT_SCHEMA_01 is:
/home/owner_test/exp_test.dmp
Job “SYS”.”SYS_EXPORT_SCHEMA_01″ successfully completed at Mon May 27 21:41:37 2024 elapsed 0 00:00:14
Claro que no meu exemplo eu fiz apenas para duas tabelas, mas, num cenário real, você poderia inserir centenas ou milhares de tabelas na sua tabela de trabalho.
Portanto, no meu exemplo, defini o parâmetro INCLUDE conforme exibido abaixo:
INCLUDE=TABLE:”IN (SELECT table_name FROM owner_test.export_tables)”
Se você quiser exportar somente as tabelas cujo nome finalizam com a string ‘BKP’:
INCLUDE=TABLE:”LIKE ‘%BKP'”
Como vocês observaram, essa é uma forma poderosa de realizar essa tarefa, certo? Você pode por exemplo especificar somente as tabelas que coincidem com uma data de criação específica (coluna CREATED da view DBA_OBJECTS).
Há uma nota de suporte bastante útil com vários exemplos:
Espero que seja útil!
Abraços,
Vinicius