Parametro INITIAL Tabelas

DBA Geral (instalação, configuração do banco, scripts do Sql*Plus, shell scripts, batch scripts, etc...)
Responder
Avatar do usuário
thiagomz
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Dom, 27 Jun 2004 10:17 am
Localização: Ribeirao Preto SP
Contato:
Att.

Thiago M. Zerbinato
Oracle Certified Professional 8i

Pessoal,

Vamos ao probliminha...

Seguinte ... recebi um DUMP de 300MB, fiz o import e quando fui ver, o
garoto tinha usado 6GB !!!! Verificando o causo, notei alguns parametros
INITIAL de tabelas com 600MB, sendo que essas tabelas quase não tem
linhas, ou seja, o programador deletou linhas dessa tabela, mas o
INITIAL continua a marcar seu ultimo valor ? Correto meu raciocinio ?

Agora vem o problema, como acertar o INITIAL dessas tabelas, para que eu
possa exportar esses dados para um dump para o programador criar a
estrutura do sistema nos clientes ?

Um ALTER TABLE ... MOVE TABLESPACE acertaria o tamanho da tabela
removendo as linhas marcadas para DELETE com o comando DELETE, mas o
initial ainda permaneceria, correto ?

Valeu...

-- Att. Thiago M. Zerbinato OCP DBA Oracle thiagomz@hotmail.com (MSN) 75311127 (ICQ)
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Vou citar as palavras do Chiappa com relação a isso:

Bom, justamente por questões do tipo IMHO quem ** TEM ** que criar tabelas no banco ** SEMPRE ** é o DBA (usando as previsões de crescimento e comportamento da tabela que os Analistas/Programadores passarão)... Inclusive isso está mais para problemão que probleminha, pois (como sabemos, e o manual de Concepts nos explica também) o INITIAL ** não é ** resultado de processamento, ele é uma indicação inicial -> antes mesmo de se inserir dados na tabela, no instante exato do CREATE TABLE o bd já aloca em disco o initial, se você tem um initial de 600 Mb, isso quer dizer que ANTES MESMO de qualquer dados serem entrados a tabela já consumiu 600 Mb... DIFICILMENTE isso é justificável, quase sempre é erro mesmo.

Como o INITIAL só é alocado quando do início de uso da tabela, para você o alterar você TEM que recriá-la : sim, isso pode ser feito dropando-se e a recriando, OU com ALTER TABLE MOVE, que também re-aloca TODOS os dados dela, funcionando como uma recriação (e obviamente deve-se indicar a tablespace desejada, a cláusula de STORAGE com o INITIAL e o NEXT, indicando FREELISTs, PCTFREE e PCTUSED, enfim, o trabalho normal e rotineiro de DBA que não foi feito quando a tabela originalmente foi criada).

Uma vez alterada a tabela manterá as características de alocação de espaço (INITIAL, NEXT, etc), e os futuros exports a respeitará, DESDE QUE SEJA usada a cláusula COMPRESS=N. SE você ainda não importou, para esse .DMP que você tem em mãos, a solução é trabalhosa, você teria que importar com a opção ROWS=N , fazer os MOVEs das tabelas desejadas (e REBUILD dos índices, se houverem), e depois re-importar com IGNORE=Y.

[]s

Chiappa
Cito também o Ederson Elias de Oliveira
Bom dia Thiago,

Veja trecho de um DMP meu:

Selecionar tudo

CREATE TABLE "CA_FIGURA"
("ID" NUMBER(12, 0) NOT NULL ENABLE, 
"IM_FIGURA" LONG RAW NOT NULL ENABLE, 
"TP_FIGURA" VARCHAR2(10) NOT NULL ENABLE, 
"NO_EMPRESA" VARCHAR2(100))  
PCTFREE 10 PCTUSED 40 INITRANS 1 
MAXTRANS 255 
STORAGE(INITIAL 40960 FREELISTS 1 FREELIST GROUPS 1) 
TABLESPACE "D_COMERCIALIZACAO" LOGGING NOCOMPRESS
Observe o parâmetro INITIAL, no exemplo está com 40960 (40Kb).

Quando não se especifica este parâmetro na criação da tabela, é setado como o default da tablespace, é preciso verificar qual é o valor corrente que está sendo setado, para ver a necessidade de fornecer sempre este valor na criação de tabelas.

No caso de uma criação de tabela, se este valor foi dimensionado erroneamente, a tabela vai ser alocada na tabelaspace com aquele initial, ocupando espaço do DB sem necessidade, se que as linhas a serem carregadas ainda não foram inseridas, ou se o cálculo foi mesmo errado e o espaço não será usado.

Para corrigir esta falha, o melhor é criar outra tabela com o valor initial correto e inserir as linhas da original para a nova tabela.

Neste caso a tabela com initial errado deverá ser dropada, mas antes deve-se verificar quais os índices, constraints, views, triggers e procedures dependem da tabela. Sabendo tudo isto, dropar a tabela com initial errado e renomear a tabela nova para o nome original e recriar/recompilar os objetos inválidos.

Outra forma também é gerar um export com ROWS=N e editar o DMP removendo as linhas antes dos CREATE TABLE, e alterando o create, removendo a cláusula STORAGE, retirando também as linhas do export abaixo dos create tables, e executa-lo como sql pelo SQLPLUS. Desta forma será usado o valor default da tablespace destino e o valor de initial ficará correto, caso o erro seja no initial da tabela na base original.

Depois disto, fazer o export da base original e importar, com a cláusula IGNORE=Y, desta forma será ignorado a criação de objetos já existentes, e serão importados apenas as linhas e os demais objetos (procedures,triggers, functions, constrains e índices, etc).

OK ?


Ederson Elias de Oliveira
DBA Oracle
Avatar do usuário
thiagomz
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Dom, 27 Jun 2004 10:17 am
Localização: Ribeirao Preto SP
Contato:
Att.

Thiago M. Zerbinato
Oracle Certified Professional 8i

Fiz esse HOW TO... ainda não testei... mas acho que esta correto...

COMO ACERTAR O PARAMETRO INITIAL DE TABELAS
===========================================

OBJETIVO
========

Acertar o parametro INITIAL antes de executar um IMPORT de um DUMP que
contem um INITIAL com valor elevado.

PROCEDIMENTO
============

1. Efetuar o import do DUMP com a opção ROWS=N
Ex: imp system/manager@tnsname fromuser=usuario touser=usuario ROWS=N

2. Após isso devemos mover as TABELAS para outra TABLESPACE ou mover
na MESMA TABLESPACE, para isso faça no SQL*PLUS

Selecionar tudo

 set pagesize 0
 spool c:\move.sql
SELECT 'alter table '||owner||'.'||table_name||' move  
tablespace '||tablespace_name||' ; 'FROM dba_tables WHERE owner = 'USUARIO'
spool off
Verifique se o arquivo c:\move.sql esta correto e o execute,
isto acertará o parametro INITIAL de todas as TABELAS especificadas e
tambem executara um REBUILD dos indices.

Selecionar tudo

@c:\move.sql;
3. Agora devemos importar os dados do DUMP, então faça:

Selecionar tudo

   Ex: imp system/manager@tnsname fromuser=usuario touser=usuario IGNORE=Y
4. Faça um novo DUMP.
Avatar do usuário
thiagomz
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Dom, 27 Jun 2004 10:17 am
Localização: Ribeirao Preto SP
Contato:
Att.

Thiago M. Zerbinato
Oracle Certified Professional 8i

Pessoal,

A Versão final ficou assim:

COMO ACERTAR O PARAMETRO INITIAL DE TABELAS
===========================================

OBJETIVO
========

Acertar o parametro INITIAL antes de executar um IMPORT de um DUMP que
contem um INITIAL com valor elevado.

PROCEDIMENTO
============

1. Efetuar o import do DUMP com a opção ROWS=N

Selecionar tudo

   Ex: imp system/manager@tnsname fromuser=usuario touser=usuario ROWS=N
2. Após isso devemos mover as TABELAS para outra TABLESPACE ou mover na

MESMA TABLESPACE, para isso faça no SQL*PLUS

Selecionar tudo

   2.1 - set pagesize 0
   2.2 - spool c:\move.sql
   2.3 - SELECT 'alter table '||owner||'.'||table_name||' move 
tablespace '||tablespace_name||' ; 'FROM dba_tables WHERE owner = 'USUARIO'
   2.4 - spool off
2.5 - Verifique se o arquivo c:\move.sql esta correto e o execute,
isto acertará o parametro INITIAL de todas as TABELAS especificadas.

Selecionar tudo

   2.6 - @c:\move.sql;
3. Agora devemos importar os dados do DUMP, então faça:

Selecionar tudo

   Ex: imp system/manager@tnsname fromuser=usuario touser=usuario IGNORE=Y
4. Faça um novo DUMP.

5. Faça um REBUILD dos Indices.
Ex:

Selecionar tudo

select 'alter index ' || INDEX_NAME || ' rebuild ;' from dba_indexes where owner='USUARIO';
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 10 visitantes