Pular para o conteúdo
  • Este tópico contém 4 respostas, 2 vozes e foi atualizado pela última vez 1 mês, 1 semana atrás por Avatar photoJosé Laurindo Chiappa.
Visualizando 5 posts - 1 até 5 (de 5 do total)
  • Autor
    Posts
  • #178599
    Fernanda Montovani
    Participante

      Pessoal, bom dia!

      Comecei a trabalhar em uma base Oracle  11g Release 11.2.0.4.0, onde verifiquei dados do datafile com uma select

      que me retorna o Tamanho, Quanto Utilizado e quanto esta livre, com isso tive o retorno que tenho 5 datafiles criados

      na tablespace, todas com MAXSIZE 32GB, AUTOEXTEND ON a cada 512M, mas vamos ao detalhe que estou em duvida, elas estão numeradas em PROD1 até PROD5, sendo que as1,2 e 3 ja utilzou todo espaço, a 4 esta com o MAXSIZE em 27 GB e utilizado 25 GB, ja a PROD5 esta com  MAXSIZE 32GB e totalmente livre.

      Nunca passei por esse cenario e lendo a documentação não consegui entender se na pratica será aplicado a logica, sendo, se eu dar um ALTER DATABASE na PROD4 ela altera o MAXSIZE para 32GB (Seria bom eu fazer isso),

      e com conforme o espaço vai sendo ocupado, quando o limite MAXSIZE da PROD4 for atingido, o oracle começa a gravar automaticamente na PROD5.

      Fico na duvida, pois se realizar select na SYS.DBA_FREE_SPACE o resultado sempre vai apontar diminuição no espaço da tablespace, no caso calculando o datafile ativo prod4 com 3 GB livres, ou deveria somar o PROD4 (3GB) + PROD5 (35GB) e me retornar um espaço livre de 35 GB?
      Acho que consegui explicar, se algum puder me orientar, (não dar a solução pois quero estudar o caso e aprender)?

      Att,

      #178609
      Avatar photoJosé Laurindo Chiappa
      Moderador

        Colega, tem ** vários e diversos ** conceitos importantes que vc pelo jeito não está ciente : PRIMEIRO, e MAIS IMPORTANTE, a view DBA_FREE_SPACE mostra o que está livre DENTRO DO ESPAÇO JÁ ALOCADO NOS DATAFILES : Óbvio que datafiles AUtoextend significa que no FUTURO esses datafiles podem crescer, mas isso é FUTURO, como eu disse a DBA_FREE_SPACE só mostra a situação real, já alocada… Exemplo (com WIndows aqui, mas é a mesma coisa Conceitualmente se fosse Linux) :

        => Vamos criar uma tablespace com um datafile que VAI TER ALOCADO inicialmente 100 Megabytes (o M na especificação de 100M que vou usar abaixo é Megabytes), e que além disso, NO FUTURO,esse datafile vai poder ser aumentado até o máximo que o Sistema Operacional suporta (esse UNLIMITED quer dizer isso, e na maioria dos Sistemas Operacionais esse máximo é de 32 Gigabytes) :

        SYSTEM@XEPDB1::CONT=XEPDB1> create tablespace TS_TESTE datafile 'C:\APP\ORACLE\PRODUCT\21C\ORADATA\XE\XEPDB1\TS_TESTE_01.DBF' SIZE 100M AUTOEXTEND ON MAXSIZE UNLIMITED
        EXTENT MANAGEMENT LOCAL AUTOALLOCATE SEGMENT SPACE MANAGEMENT AUTO;

        Tablespace criado.

        => No comando acima, o trecho de EXTENT MANAGEMENT LOCAL AUTOALLOCATE indica que a tablespace vai gerenciar os extents através de um bitmnap no começo do datafile (o que consome um pouquinho de espaço MAS é melhor para performance, por isso é o default já há bastante tempo, mas eu sempre indico mesmo assim) E o tamanho de cada EXTENT vai ser gerenciado automaticamente pelo Oracle … Veja também que eu não indiquei nem INITIAL nem NEXT, nem PCTINCREASE, assim o tanto o primeiro extent (INITIAL) quando os próximos (NEXT) vão ser criados cfrme o algoritmo do Oracle achar melhor, NÂO HAVENDO nenhum tipo de incremento…
        Muito bem, Confirmando :

        SYSTEM@XEPDB1::CONT=XEPDB1> select file_name, bytes, status, autoextensible, maxbytes, increment_by from dba_data_files where tablespace_name='TS_TESTE';

        FILE_NAME
        ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
        BYTES STATUS AUT MAXBYTES INCREMENT_BY
        ---------------- --------- --- ---------------- ------------
        C:\APP\ORACLE\PRODUCT\21C\ORADATA\XE\XEPDB1\TS_TESTE_01.DBF
        104.857.600 AVAILABLE YES 34.359.721.984 1

        SYSTEM@XEPDB1::CONT=XEPDB1> host dir C:\APP\ORACLE\PRODUCT\21C\ORADATA\XE\XEPDB1\TS_TESTE_01.DBF

        Pasta de C:\APP\ORACLE\PRODUCT\21C\ORADATA\XE\XEPDB1

        07/12/2024 18:48 104.865.792 TS_TESTE_01.DBF
        1 arquivo(s) 104.865.792 bytes
        0 pasta(s) 72.559.759.360 bytes disponíveis

        ==> Só observando, veja que o arquivo foi criado com 104.865.792 em disco, e não com os 100.000.000 bytes que a conversão para Megabytes implicaria : isso é por causa que o datafile é divido em Blocos, e como eu uso neste database aqui bloco de 8192 bytes, acaba tendo uns arredondamentos, desconsidere…
        MUito bem, vamos olhar a DBA_FREE_SPACE :

        SYSTEM@XEPDB1::CONT=XEPDB1> select file_id, block_id, blocks, bytes from dba_free_space where tablespace_name='TS_TESTE';

        FILE_ID BLOCK_ID BLOCKS BYTES
        ---------- ---------- ---------- ----------------
        20 128 12672 103.809.024

        SYSTEM@XEPDB1::CONT=XEPDB1>

        ===> Opa!!! Várias coisas a notar aí : PRIMEIRO, muito Claramente a consulta acima mostra EXATAMENTE O QUE EU DISSE ACIMA : a DBA_FREE_SPACE SÓ MOSTRA O QUE ESTÁ LIVRE DENTRO O ESPAÇO JÁ ALOCADO – assim, o fato de meu datafile poder NO FUTURO crescer até 32 GB (na verdade 34.359.721.984 bytes, que nem a consulta mostra, novamente por causa de arredondamento devido ao tamanho do bloco nesse database), absolutamente NÃO É MOSTRADO NA DBA_FREE_SPACE….Se, cfrme parece, vc ACHA que isso TERIA que ser refletido na DBA_FREE_SPACE, think again, não é assim que o SGBD Oracle funciona…
        SEGUNDO, Notar que esse megabyte usado mesmo sem NADA ter sido gravado no datafile (veja acima que a coluna BYTES da DBA_DATA_FILES, que é o espaço alocado em disco, mostra 104.857.600 ** mas ** a coluna BYTES da DBA_FREE_SPACE, que é quanto ESTÁ livre, mostra 103.809.024) é por causa do BITMAP criado para controle interno do Oracle – isso é muito melhor para performance do que o jeito anterior, que era uma tabela no dicionário de dados)..

        Muito Bem, Confirmando as outras coisas que falei sobre alocação, e confirmando que a DBA_FREE_SPACE mostra o que está livre EM CIMA DO QUE ESTÀ EFETIVAMENTE JÁ CRIADO/ALOCADO EM DISCO, vamos gravar alguma coisa nessa tablespace :

        SYSTEM@XEPDB1::CONT=XEPDB1> create table TAB_EXEMPLO TABLESPACE TS_TESTE as (select * from dba_objects where rownum < 6);
        trigger disparada

        Tabela criada.

        SYSTEM@XEPDB1::CONT=XEPDB1> select file_id, block_id, blocks, bytes from dba_free_space where tablespace_name='TS_TESTE';

        FILE_ID BLOCK_ID BLOCKS BYTES
        ---------- ---------- ---------- ----------------
        20 136 12664 103.743.488

        SYSTEM@XEPDB1::CONT=XEPDB1> select OWNER, SEGMENT_NAME, SEGMENT_TYPE, EXTENT_ID, BLOCK_ID, BLOCKS, BYTES from dba_extents where tablespace_name='TS_TESTE';

        OWNER SEGMENT_NAME SEGMENT_TYPE EXTENT_ID BLOCK_ID BLOCKS BYTES
        -------------------- --------------------------------- ------------------ ---------- ---------- ---------- ----------------
        SYSTEM TAB_EXEMPLO TABLE 0 128 8 65.536

        SYSTEM@XEPDB1::CONT=XEPDB1>

        ==> Taí, EXATAMENTE O QUE EU FALEI : conforme vou consumindo espaço no(s) datafile(s) , a DBA_FREE_SPACE vai diminuindo, E esse espaço é alocado por EXTENTs, e a cada consumo esse espaço livre no espaço em disco já alocado vai baixando, e baixando, e baixando… E quando é que, fazendo jus à condição de AUTOEXTENSÍVEL, esse datafile VAI crescer ? Quando a alocação chegar perto de esgotar o tamanho com que o datafile foi criado, 100M no meu caso….
        Vou alocar um pouco mais :

        SYSTEM@XEPDB1::CONT=XEPDB1> insert into TAB_EXEMPLO (select * from dba_objects);

        75305 linhas criadas.

        SYSTEM@XEPDB1::CONT=XEPDB1> commit;

        Commit concluído.

        SYSTEM@XEPDB1::CONT=XEPDB1> select file_id, block_id, blocks, bytes from dba_free_space where tablespace_name='TS_TESTE';

        FILE_ID BLOCK_ID BLOCKS BYTES
        ---------- ---------- ---------- ----------------
        20 1792 11008 90.177.536

        SYSTEM@XEPDB1::CONT=XEPDB1> select OWNER, SEGMENT_NAME, SEGMENT_TYPE, EXTENT_ID, BLOCK_ID, BLOCKS, BYTES from dba_extents where tablespace_name='TS_TESTE';

        OWNER SEGMENT_NAME SEGMENT_TYPE EXTENT_ID BLOCK_ID BLOCKS BYTES
        -------------------- --------------------------------- ------------------ ---------- ---------- ---------- ----------------
        SYSTEM TAB_EXEMPLO TABLE 0 128 8 65.536
        SYSTEM TAB_EXEMPLO TABLE 1 136 8 65.536
        SYSTEM TAB_EXEMPLO TABLE 2 144 8 65.536
        SYSTEM TAB_EXEMPLO TABLE 3 152 8 65.536
        SYSTEM TAB_EXEMPLO TABLE 4 160 8 65.536
        SYSTEM TAB_EXEMPLO TABLE 5 168 8 65.536
        SYSTEM TAB_EXEMPLO TABLE 6 176 8 65.536
        SYSTEM TAB_EXEMPLO TABLE 7 184 8 65.536
        SYSTEM TAB_EXEMPLO TABLE 8 192 8 65.536
        SYSTEM TAB_EXEMPLO TABLE 9 200 8 65.536
        SYSTEM TAB_EXEMPLO TABLE 10 208 8 65.536
        SYSTEM TAB_EXEMPLO TABLE 11 216 8 65.536
        SYSTEM TAB_EXEMPLO TABLE 12 224 8 65.536
        SYSTEM TAB_EXEMPLO TABLE 13 232 8 65.536
        SYSTEM TAB_EXEMPLO TABLE 14 240 8 65.536
        SYSTEM TAB_EXEMPLO TABLE 15 248 8 65.536
        SYSTEM TAB_EXEMPLO TABLE 16 256 128 1.048.576
        SYSTEM TAB_EXEMPLO TABLE 17 384 128 1.048.576
        SYSTEM TAB_EXEMPLO TABLE 18 512 128 1.048.576
        SYSTEM TAB_EXEMPLO TABLE 19 640 128 1.048.576
        SYSTEM TAB_EXEMPLO TABLE 20 768 128 1.048.576
        SYSTEM TAB_EXEMPLO TABLE 21 896 128 1.048.576
        SYSTEM TAB_EXEMPLO TABLE 22 1024 128 1.048.576
        SYSTEM TAB_EXEMPLO TABLE 23 1152 128 1.048.576
        SYSTEM TAB_EXEMPLO TABLE 24 1280 128 1.048.576
        SYSTEM TAB_EXEMPLO TABLE 25 1408 128 1.048.576
        SYSTEM TAB_EXEMPLO TABLE 26 1536 128 1.048.576
        SYSTEM TAB_EXEMPLO TABLE 27 1664 128 1.048.576

        28 linhas selecionadas.

        SYSTEM@XEPDB1::CONT=XEPDB1>

        ==> Tá vendo acima ? EXATAMENTE COMO EU DISSE, cfrme os dados vão sendo gravados no(s) datafile(s), os EXTENTs vão ser REMOVIDOS da DBA_FREE_SPACE e vão ser alocados/usados para gravar os dados, e conforme forem sendo precisos, mais e mais extents são criados, em esse espaço sendo removido da DBA_FREE_SPACE… E como eu disse também, eu deixei o próprio SGBD Oracle escolher os tamanhos de extents , então primeiro ele achou por bem criar extents de 64 Kb, depois de 1 MB, depois ele passa a criar de 4 MB, e aí vai…
        Muito bem, vamos agora gravar um MONTÃO de dados, de forma que o espaço inicialmente criado em disco esgote E assim o datafile seja extendido :

        SYSTEM@XEPDB1::CONT=XEPDB1> ed
        Gravou file afiedt.buf

        1 BEGIN
        2 for i in 1..30 loop
        3 DBMS_APPLICATION_INFO.set_client_info('Insert#' || i || ' em ' || to_char(sysdate, 'dd/mm/yyyy hh24:mi:ss'));
        4 INSERT /*+ APPEND */ into TAB_EXEMPLO (select * from dba_objects);
        5 commit;
        6 end loop;
        7* END;
        SYSTEM@XEPDB1::CONT=XEPDB1> /

        Procedimento PL/SQL concluído com sucesso.

        => Olha lá o datafile crescido :

        SYSTEM@XEPDB1::CONT=XEPDB1> select file_name, bytes, status, autoextensible, maxbytes, increment_by, user_bytes from dba_data_files where tablespace_name='TS_TESTE';

        FILE_NAME
        ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
        BYTES STATUS AUT MAXBYTES INCREMENT_BY USER_BYTES
        ---------------- --------- --- ---------------- ------------ ----------------
        C:\APP\ORACLE\PRODUCT\21C\ORADATA\XE\XEPDB1\TS_TESTE_01.DBF
        423.886.848 AVAILABLE YES 34.359.721.984 1 422.838.272

        SYSTEM@XEPDB1::CONT=XEPDB1> host dir C:\APP\ORACLE\PRODUCT\21C\ORADATA\XE\XEPDB1\TS_TESTE_01.DBF

        Pasta de C:\APP\ORACLE\PRODUCT\21C\ORADATA\XE\XEPDB1

        07/12/2024 20:08 423.895.040 TS_TESTE_01.DBF
        1 arquivo(s) 423.895.040 bytes
        0 pasta(s) 72.185.794.560 bytes disponíveis

        ==> Re-re-confirmando, veja que a DBA_FREE_SPACE só vai mostrar o espaço livre DENTRO DESSES 400 e poucos MBs que o datafile já ocupa em disco :

        SYSTEM@XEPDB1::CONT=XEPDB1> select file_id, block_id, blocks, bytes from dba_free_space where tablespace_name='TS_TESTE';

        FILE_ID BLOCK_ID BLOCKS BYTES
        ---------- ---------- ---------- ----------------
        20 49280 2464 20.185.088

        SYSTEM@XEPDB1::CONT=XEPDB1>

        ==> E em princípio NÃO ADIANTA fazer “ALTER DATABASE” NENHUM, é Assim que funciona o SGBD Oracle e essa view administrativa DBA_FREE_SPACE : o que vc deveria fazer para saber não só quanto tem livre agora dentro do que já existe em disco MAS do que Ainda Pode ser alocado no Futuro, é Somar os BYTES da DBA_FREES_SPACE Com a diferença de (MAXBYTES – USER_BYTES) lá na DBA_DATA_FILES… NO meu caso isso seria :

        SYSTEM@XEPDB1::CONT=XEPDB1> select file_name, (MAXBYTES - USER_BYTES) as ESPACO_A_ALOCAR from dba_data_files where tablespace_name='TS_TESTE';

        FILE_NAME
        ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
        ESPACO_A_ALOCAR
        --------------------
        C:\APP\ORACLE\PRODUCT\21C\ORADATA\XE\XEPDB1\TS_TESTE_01.DBF
        33.936.883.712

        SYSTEM@XEPDB1::CONT=XEPDB1>

        => isso é o Futuro, que AInda Pode ser alocado, e à isso eu somaria os 20.185.088 bytes que já estão livres em disco… Okdoc ??

        #178610
        Avatar photoJosé Laurindo Chiappa
        Moderador

          Isso posto, suas respostas e algumas Observações, abaixo de cada item/pergunta :

          “…tenho 5 datafiles criados na tablespace, todas com MAXSIZE 32GB, AUTOEXTEND ON a cada 512M,… elas estão numeradas em PROD1 até PROD5, sendo que as1,2 e 3 ja utilzou todo espaço, a 4 esta com o MAXSIZE em 27 GB e utilizado 25 GB, ja a PROD5 esta com MAXSIZE 32GB e totalmente livre.”

          Bem, com esse “a cada 512M” acredito que vc quis dizer que a propriedade de NEXT do datafile está assim setada, então a cada vez que for necessário criar um novo extenmt ele terá 512M de tamanho, Independente de qquer coisa – Eu não gosto disso porque aí , MESMO que a tabela for pequena e estiver nas alocações iniciais de espaço, a alocação dentro do datafile SERÀ OBRIGARTORIAMENTE de 512 M, e se a tabela for pequena e vc SABE que na verdade ela nunca vai ocupar Tudo Isso, vc VAI FICAR COM ESPAÇO alocado mas não usado E não usável por outros objetos… Eu só uso NEXT ou PCTINCREASE se REALMENTE tenho CERTEZA ABSOLUTA de que NUNCA tabelas muitíssimo menores que isso vão ser criadas na tablespace…
          E incidentalmente, como estamos discutindo propriedades DOS DATAFILES de uma tablespace, onde no trecho vc fala “ela”, “elas”, “a”, na verdade deveria ser “ele”, “eles”, “o” datafile…. Isso não tem NADA A VER com “A” tablespace…

          “Nunca passei por esse cenario e lendo a documentação não consegui entender se na pratica será aplicado a logica, sendo, se eu dar um ALTER DATABASE na PROD4 ela altera o MAXSIZE para 32GB (Seria bom eu fazer isso)”

          Veja, se vc REALMENTE quer/precisa que o datafile chegue no máximo teórico possível (que normalmente é, sim, de 32 GB), é VOCÊ quem precisa alterar a propriedade, e isso EM CADA DATAFILE que vc quiser/precisar…. Não é Absolutamente obrigatório – se vc tiver, digamos, um datafile que pode crescer até 25 GB e outro que pode crescer até 07 GB, isso dá no mesmo que ter um que pode crescer até 32 GB – mas se vc quiser só ter datafiles que podem se extender até o máximo, sem probs, pode fazer….

          “conforme o espaço vai sendo ocupado, quando o limite MAXSIZE da PROD4 for atingido, o oracle começa a gravar automaticamente na PROD5”

          Isso aí..

          #178617
          Fernanda Montovani
          Participante

            José Laurindo, bom dia!

            Voce esclareceu totalmente a minha duvida, em sim foi uma uma aula,

            agora tenho um rumo de estudo, os exemplos foram sensacionais.

             

            Muito obrigada.

            #178619
            Avatar photoJosé Laurindo Chiappa
            Moderador

              Blz ? Fico contente de ter ajudado, e para se aprofundar, além da doc, Recomendo dar uma estudada em https://www.oracle.com/br/technical-resources/articles/tablespaces-concept-introduction.html

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