Social Icons

1 de mar. de 2020

Problemas com o parâmetro DEFERRED_SEGMENT_CREATION




Olá pessoal,

      Escrevi este post apenas para alertar sobre o valor default do parâmetro deferred_segment_creation, que pode causar problemas quando precisamos exportar dados de um ambiente para outro (normalmente usando o Data Pump), em uma tarefa como por exemplo: exportar um schema do ambiente de desenvolvimento para homologação, ou de homologação para produção. Isso é muito comum acontecer, e por isso vou comentar sobre o problema e como resolvê-lo.

     O parâmetro deferred_segment_creation nasceu no Oracle 11GR2 e possui o valor padrão igual a TRUE. O que isso significa? Significa que os segmentos de tabelas e objetos dependentes (LOBs e índices) serão criados somente quando a primeira linha for inserida na tabela. Deste modo, tabelas vazias não ocuparão espaço em seus devidos tablespaces até que alguma linha seja inserida nelas. O lado bom (principal) desse atraso na criação dos segmentos é que você terá uma economia (mínima) no armazenamento de dados, porém existe também um lado ruim, que é exatamente o problema que citei nos exemplos no 1º parágrafo. Na versão 11G (conforme doc MOS Bug 16707791 - ORA-14223 during Datapump import for some tables with deferred segment creation (Doc ID 16707791.8)) ,ao importar (usando Data Pump), por exemplo, um dump gerado em um schema de um ambiente de desenvolvimento para um ambiente de homologação, as tabelas vazias não eram inclusas no dump ou geravam erro durante a importação, deste modo, ao importar o dump no ambiente de homologação você não terá levado o schema completo, e futuramente você ou alguém (um Desenvolvedor ou um usuário) notará a ausência de tabelas. Percebi isso pela 1ª vez após migrar os Bancos de Dados da empresa em que trabalho para a versão 11GR2 (em 2011). Fiz testes recentes no 12cR2 e felizmente não vi mais esse problema ocorrer!

Imagem 01: Configurações do Parâmetro DEFERRED_SEGMENT_CREATION
Fonte: Oracle Corporation

       Você pode evitar esse problema de diversas formas, entre elas, criando as tabelas com a cláusula SEGMENT CREATION IMMEDIATE (ver artigo Segment Creation on Demand (Deferred Segment Creation) in Oracle Database 11g Release 2), ou simplesmente mudando o valor do parâmetro deferred_segment_creation para FALSE, executando o comando abaixo: 

SQL> ALTER SYSTEM SET deferred_segment_creation = FALSE;

     Prefiro a 2ª opção, portanto, é ela que eu normalmente executo nos BDs 11G que administro. Caso tenha alguma dúvida, é só deixar um comentário que eu responderei o mais breve possível.

[]s

  

0 comments:

Postar um comentário

 

LINKS ÚTEIS

Total de visualizações de página

Seguidores

Meu One Drive (antigo Sky Drive)