Pular para o conteúdo
Visualizando 15 posts - 1 até 15 (de 19 do total)
  • Autor
    Posts
  • #101379
    bohnstedt
    Participante

      Bom dia Senhores(as),

      Como sou iniciante no Oracle, peço por favor uma ajuda. Como eu estou com problema de espaço em um dos banco de dados, fiz uns selects que me trouxeram todos os usuarios e seus tamanhos ocupados na dba_segments, e então eu fiz uns drop user cascade. Mesmo assim não liberou espaço, continua a mesma coisa. Eu gostaria de saber como eu faço para realizar uma desfragmentação na tablespace.

      Aguardo um retorno

      Abraços

      Att,

      Fábio Bohnsedt

      #101381
      felipeg
      Participante

        Olá

        Então, o seu problema não é fragmentação e sim realocação de espaço.
        Não confunda os dois 8)

        Nesse caso verifique o espaço liberado e depois use o comando resize.
        Segue o comando.

        select a.TABLESPACE_NAME,
        a.BYTES bytes_used,
        b.BYTES bytes_free,
        b.largest,
        round(((a.BYTES-b.BYTES)/a.BYTES)*100,2) percent_used
        from
        (
        select TABLESPACE_NAME,
        sum(BYTES) BYTES
        from dba_data_files
        group by TABLESPACE_NAME
        )
        a,
        (
        select TABLESPACE_NAME,
        sum(BYTES) BYTES ,
        max(BYTES) largest
        from dba_free_space
        group by TABLESPACE_NAME
        )
        b
        where a.TABLESPACE_NAME=b.TABLESPACE_NAME
        order by ((a.BYTES-b.BYTES)/a.BYTES) desc

        E esse para resize:


        ALTER DATABASE DATAFILE '.dbf' RESIZE M ou G;

        Atenciosamente,
        Felipe.

        #101383
        rman
        Participante

          @bohnstedt

          Uma vez alocado espaço no tablespace, o mesmo não é desalocado quando é feito a remoção dos objetos. A única forma é através do resize do datafile citado pelo felipeg.

          #101384
          jspaulonci
          Participante

            Boa tarde, uma vez que o Oracle escreveu no datafile, mesmo dropando os objetos não é possível dar resize, a tablespace necessita ser recriada.

            SQL> create tablespace tbsd_fragmentacao datafile ‘+dgdados2’ size 5m autoextend off;

            Tablespace created.

            SQL> create table clientes (id varchar2(50),nome varchar2(50)) tablespace tbsd_fragmentacao;

            Table created.

            SQL> begin
            for r in 1..1000000 loop
            insert into clientes values (‘1111111111111111111111111111′,’222222222222222222222222222’);
            commit;
            end loop;
            end;
            /
            begin
            *
            ERROR at line 1:
            ORA-01653: unable to extend table SYS.CLIENTES by 128 in tablespace
            TBSD_FRAGMENTACAO
            ORA-06512: at line 3

            SQL> drop table clientes purge;

            Table dropped.

            SQL> select file_name from dba_data_files where tablespace_name = ‘TBSD_FRAGMENTACAO’;

            FILE_NAME

            +DGDADOS2/db/datafile/tbsd_fragmentacao.320.765549011

            SQL> alter database datafile ‘+DGDADOS2/migracao/datafile/tbsd_fragmentacao.320.765549011’ resize 1m;
            alter database datafile ‘+DGDADOS2/migracao/datafile/tbsd_fragmentacao.320.765549011’ resize 1m
            *
            ERROR at line 1:
            ORA-03214: File Size specified is smaller than minimum required

            Abraços

            #101388
            bohnstedt
            Participante

              Bom pessoal agradeço pelas respostas mais ainda eu estou na duvida,

              Até então eu entendi que uma vez escrito no datafile, quando eu drop usuario cascade ainda continua lá. O @jspaulonci, eu não tenho como dropar a tablespace e criá-la novamente, pois existem aqui na empresa, vários schema apontando para ela, vc me entende???. O exemplo que vc me passou abaixo já aconteceu comigo:

              “SQL> alter database datafile ‘+DGDADOS2/migracao/datafile/tbsd_fragmentacao.320.765549011’ resize 1m;
              alter database datafile ‘+DGDADOS2/migracao/datafile/tbsd_fragmentacao.320.765549011’ resize 1m
              *
              ERROR at line 1:
              ORA-03214: File Size specified is smaller than minimum required ”

              Nesse caso o que eu estou entendendo é que está havendo um disperdicio de espaço e que senão tiver outro jeito, o Oracle não sabe gerenciar o espaço, pessoal me desculpem se eu estou falando bobagem, é que infelizmente ainda não está claro.

              Abraço a todos

              #101390
              rman
              Participante

                @bohnstedt

                Datafile é o arquivo fisico que o sistema operacional conhece, quando você apaga os objetos de um usuário é liberado espaço na tablespace, mas o datafile continua do mesmo tamanho. Quanto de espaço você gostaria de liberar para o sistema operacional ? Quando o espaço na tablespace é liberada, você criar novos objetos neste espaço, o Oracle vai gerenciar isso muito bem.

                Mas vai pensando em adquirir novos discos, pois é questão de tempo pra ficar sem espaço novamente.

                #101391
                jspaulonci
                Participante

                  O RMAN está coberto de razão.

                  O datafile fica com a HWM no último extent criado pelo segment, por isso não dá para fazer resize pra baixo.

                  Quanto a questão dos usuário apontando pra quele ou pra outro tablespace isso pouco importa, pense no seguinte. Onde está o meu segmento ? isso sim importa.

                  Uma solução a fazer é renomear essa sua tablespace para outro nome e cria-la com o nome que vc quer novamente, isso é transparente para a aplicação.

                  alter tablespace nome_que_eu_quero rename to nome_qualquer;

                  create tablespace nome_que_eu_quero tststsssststst;

                  Em seguida vc pode agendar horários para fazer o move dos objetos para essa tablespace e depois dropar a tablespace com o nome antigo.

                  Esse recurso está presente do 10g pra cima

                  #101392
                  bohnstedt
                  Participante

                    Legal, aos poucos eu vou entendendo. Peço desculpas pois estou me deparando com situações que nunca peguei, então fica um pouco dificil de entender.

                    Como eu poderia renomear, e os datafiles???? A tablespace é lógica e os datafiles são fisicos, se eu renomear os datafiles com os dados vão junto correto??? Como eu faço criando uma outra tablespace com os dados desses datafiles????

                    Como eu posso mover os objetos para essa nova tablespace????

                    Att,

                    Fábio Bohnstedt

                    #101393
                    jspaulonci
                    Participante

                      bohnstedt vamos pensar na maneira mais segura.

                      Manipulação de datafiles não é como manipular, qualquer outro arquivo do SO. Sob a perspectiva do SO até é a mesma coisa, porem sob a perspectiva do Oracle não.

                      A movimentação pode ser feita através do comando alter table nome_da_tabela nove tablespace nova_tablespace;

                      Depois disso vc precisa dar rebuild nos indices pois eles ficarão em stado de unusable.

                      alter index nome_do_indice rebuild tablespace nova_tablespace;

                      Pesquise um pouco mais sobre o que colocamos para você, e como você está iniciando, sugiro testar o procedimento em desenvolvimento ou homologação.

                      #101394
                      felipeg
                      Participante

                        [quote=”jspaulonci”:jzxhvzj7]Boa tarde, uma vez que o Oracle escreveu no datafile, mesmo dropando os objetos não é possível dar resize, a tablespace necessita ser recriada.
                        [/quote]

                        Prezados, boa tarde

                        Peço desculpas na demora, estava em almoço

                        @Joao Paulo, discordo da sua afirmação pois o reszie funciona muito bem para datafiles que possuem espaço a ser liberado.

                        http://download.oracle.com/docs/cd/B283 … les003.htm


                        Manually Resizing a Datafile

                        You can manually increase or decrease the size of a datafile using the ALTER DATABASE statement. This enables you to add more space to your database without adding more datafiles. This is beneficial if you are concerned about reaching the maximum number of datafiles allowed in your database.

                        For a bigfile tablespace you can use the ALTER TABLESPACE statement to resize a datafile. You are not allowed to add a datafile to a bigfile tablespace.

                        Manually reducing the sizes of datafiles enables you to reclaim unused space in the database. This is useful for correcting errors in estimates of space requirements.

                        O que eu acho que ocorreu no seu exemplo foi que o espaço minimo alocado para o seu datafile era menor que o espaço definido por padrão na alocação (Extent Mangaement).

                        Tente verificar o INITIAL EXTENT dessa tablespace que você criou como exemplo, quanto é?

                        Segue o meu exemplo

                        sys@ORCL> create tablespace teste_resize datafile '/u02/teste_resize.dbf' size 5m autoextend off;

                        Tablespace created.

                        sys@ORCL> create table clientes (id varchar2(50),nome varchar2(50)) tablespace teste_resize;

                        Table created.

                        sys@ORCL> begin
                        for r in 1..1000000 loop
                        insert into clientes values ('1111111111111111111111111111','222222222222222222222222222');
                        commit;
                        end loop;
                        end;
                        /
                        2 3 4 5 6 7
                        begin
                        *
                        ERROR at line 1:
                        ORA-01653: unable to extend table SYS.CLIENTES by 128 in tablespace TESTE_RESIZE
                        ORA-06512: at line 3

                        sys@ORCL> sys@ORCL> select count(*) from clientes;

                        COUNT(*)

                         58032
                        

                        sys@ORCL> drop table clientes purge;

                        Table dropped.

                        sys@ORCL> select file_name from dba_data_files where tablespace_name = 'TESTE_RESIZE';

                        FILE_NAME

                        /u02/teste_resize.dbf

                        sys@ORCL> alter database datafile '/u02/teste_resize.dbf' resize 1m;

                        Database altered.

                        sys@ORCL> select tablespace_name, bytes/1024/1024 from dba_data_files where tablespace_name = 'TESTE_RESIZE';

                        TABLESPACE_NAME BYTES/1024/1024


                        TESTE_RESIZE 1

                        sys@ORCL> select tablespace_name, initial_extent from dba_tablespaces where tablespace_name='TESTE_RESIZE';

                        TABLESPACE_NAME INITIAL_EXTENT


                        TESTE_RESIZE 65536

                        Atenciosamente,
                        Felipe.

                        #101396
                        bohnstedt
                        Participante

                          cara, eu acho q entendi. Primeiramente esse processo tem que ser feito com o banco de preferencia fora. Ai então eu renomearia essa tablespace para outro nome e criaria uma nova tablespace.

                          Com o comando ALTER TABLE “OWNER”.”TABELA” MOVE TABLESPACE “NOVA_TABLESPACE”;

                          Eu começo a fazer a movimentação e nisso libera o espaco correto?

                          A respeito do indice eu faço a mesma coisa? E depois eu faço um rebuild neles?

                          Me fala uma coisa, tem como fazer um calculo para saber a quantidade de tempo que irá demorar?????

                          Abraços e obrigado

                          Fábio Bohnstedt

                          #101399
                          bohnstedt
                          Participante

                            Bom pessoal eu procurei algumas coisas e encontrei esse script:

                            select ‘alter database datafile ”’ || file_name || ”’ resize ‘ ||
                            ceil( (nvl(hwm,1)81921.2)/1024/1024 ) || ‘m;’ cmd
                            from dba_data_files a,
                            ( select file_id, max(block_id+blocks-1) hwm
                            from dba_extents
                            group by file_id ) b
                            where a.file_id = b.file_id(+)
                            and ceil( (nvl(hwm,1)81921.2)/1024/1024 ) 100
                            /

                            E acabou liberando espaço. Olha realmente a opção de criar uma nova tablespace mover todos os objetos para lá e depois voltar novamente, dá um trampo pra caramba.

                            #101401
                            felipeg
                            Participante

                              Fábio,

                              Vamos do começo.
                              Só pra explicar rapidamente, acho que o rman já fez isso.
                              Sobre o conceito de Tablespaces sugiro ler este aritgo do Eduardo, muito bom por sinal:

                              http://www.oracle.com/technetwork/pt/ar … 0-ptb.html

                              Sobre o seu problema, eu passei um comando para analisar o tamanho dos objetos lembra?
                              Poderia por gentileza me retornar ele para que possamos ter uma idéia da sua situação.

                              E por último, você chegou a tentar o resize? deu algum erro?
                              O fato de dar erro não significa que não funciona 8)

                              Acho mais fácil assim, se quiser estou a disposição.

                              Atenciosamente,
                              Felipe.

                              #101402
                              felipeg
                              Participante

                                [quote=”bohnstedt”:26qmzwxb]Bom pessoal eu procurei algumas coisas e encontrei esse script:

                                select ‘alter database datafile ”’ || file_name || ”’ resize ‘ ||
                                ceil( (nvl(hwm,1)81921.2)/1024/1024 ) || ‘m;’ cmd
                                from dba_data_files a,
                                ( select file_id, max(block_id+blocks-1) hwm
                                from dba_extents
                                group by file_id ) b
                                where a.file_id = b.file_id(+)
                                and ceil( (nvl(hwm,1)81921.2)/1024/1024 ) 100
                                /

                                E acabou liberando espaço. Olha realmente a opção de criar uma nova tablespace mover todos os objetos para lá e depois voltar novamente, dá um trampo pra caramba.[/quote]

                                Foi o que eu disse desde o começo hahaha
                                A diferença é que você pegou o comando pronto, no que eu citei você iria ver os tamanhos e escolher o melhor valor 8)

                                Atenciosamente,
                                Felipe.

                                #101403
                                bohnstedt
                                Participante

                                  Felipe,

                                  Obrigado pela ajuda, o que realmente eu tinha ficado na duvida, foi pq uma vez eu rodei um comando similar o que eu coloquei no script, e realmente deu que o espaço estava alocado, vc entendeu????? Me fala uma coisa para que serve essa coluna largest???

                                  Segue abaixo minhas tablespaces

                                  TABLESPACE_NAME BYTES_USED BYTES_FREE LARGEST %_USED


                                  SYSTEM 1854930944 11403264 9437184 99.39
                                  SYSAUX 1339031552 68812800 64225280 94.86
                                  TBS_IX_SYX 1890582528 336658432 315621376 82.19
                                  TBS_DT_SYX 4184866816 826015744 7602176 80.26
                                  TBS_LOB_SYX 2961178624 663486464 493879296 77.59
                                  USERS 102236160 23658496 16252928 76.86
                                  INDEX0 3.0207E+10 9508356096 4066377728 68.52
                                  TESTE_ARCHIVE 482344960 214958080 80740352 55.43
                                  DATA0 6.1691E+10 2.8932E+10 4160749568 53.1
                                  UNDOTBS1 2097152000 2022572032 1645215744 3.56
                                  DATA_GERAL01 3145728000 3143172096 1571815424 .08
                                  INDEX_GERAL01 2621440000 2620391424 2620391424 .04

                                  Obrigado

                                  [/img]

                                Visualizando 15 posts - 1 até 15 (de 19 do total)
                                • Você deve fazer login para responder a este tópico.