Ir para o conteúdo

Por que minha instância de banco de dados do Amazon RDS para Oracle usa mais armazenamento que o esperado?

8 minuto de leitura
0

Eu tenho uma instância de banco de dados do Amazon Relational Database Service (Amazon RDS) para Oracle que usa mais espaço do que eu esperava. Quero saber se posso liberar espaço na instância.

Breve descrição

Vários componentes usam o armazenamento de instâncias do Amazon RDS para Oracle. Entre os componentes estão espaços de tabela, logs de arquivamento, arquivos de log, arquivos de redo log on-line e arquivos do Data Pump.

Para gerenciar o crescimento do armazenamento em sua instância, execute as seguintes ações para identificar quanto espaço de armazenamento seus componentes usam:

  • Descubra a quantidade de espaço alocada a dados em todos os espaços de tabela, incluindo objetos como espaços de tabela temporários.
  • Verifique a alocação de espaço para logs de arquivamento ou arquivos de rastreamento.
  • Verifique a alocação de espaço para o diretório do Data Pump.

Observação: o espaço de armazenamento alocado para uma instância do RDS representa o volume de dados. Quando você cria uma instância, o Amazon RDS mapeia o armazenamento alocado para o volume de dados. Esse processo também usa uma pequena porcentagem de espaço bruto em disco para criar o sistema de arquivos além do volume de armazenamento físico.

Resolução

Criar um diretório de log de arquivamento

Para criar um diretório de log de arquivamento, execute o seguinte código SQL:

EXEC rdsadmin.rdsadmin_master_util.create_archivelog_dir;

Identificar a quantidade de espaço alocado a dados nos espaços de tabela

Para determinar a distribuição de espaço alocado para diferentes componentes do banco de dados Oracle, execute o seguinte código SQL:

SET pages 200  
SELECT  
'===========================================================' || CHR(10) ||  
'Total Database Physical Size = ' || ROUND(redolog_size_gib + dbfiles_size_gib + tempfiles_size_gib + archlog_size_gib + ctlfiles_size_gib, 2) || ' GiB' || CHR(10) ||  
'===========================================================' || CHR(10) ||  
' Redo Logs Size : ' || ROUND(redolog_size_gib, 3) || ' GiB' || CHR(10) ||  
' Data Files Size : ' || ROUND(dbfiles_size_gib, 3) || ' GiB' || CHR(10) ||  
' Temp Files Size : ' || ROUND(tempfiles_size_gib, 3) || ' GiB' || CHR(10) ||  
' Archive Log Size : ' || ROUND(archlog_size_gib, 3) || ' GiB' || CHR(10) ||  
' Control Files Size : ' || ROUND(ctlfiles_size_gib, 3) || ' GiB' || CHR(10) ||  
'===========================================================' || CHR(10) ||  
' Used Database Size : ' || used_db_size_gib || ' GiB' || CHR(10) ||  
' Free Database Size : ' || free_db_size_gib || ' GiB' || CHR(10) ||  
' Data Pump Directory Size : ' || dpump_db_size_gib || ' GiB' || CHR(10) ||  
' BDUMP Directory Size : ' || bdump_db_size_gib || ' GiB' || CHR(10) ||  
' ADUMP Directory Size : ' || adump_db_size_gib || ' GiB' || CHR(10) ||  
'===========================================================' || CHR(10) ||  
'Total Size (including Dump and Log Files) = ' || ROUND(ROUND(redolog_size_gib, 2) + ROUND(dbfiles_size_gib, 2) + ROUND(tempfiles_size_gib, 2) + ROUND(archlog_size_gib, 2) + ROUND(ctlfiles_size_gib, 2) + ROUND(adump_db_size_gib, 2) + ROUND(dpump_db_size_gib, 2) + ROUND(bdump_db_size_gib, 2), 2) || ' GiB' || CHR(10) ||  
'===========================================================' AS summary  
FROM (SELECT sys_context('USERENV', 'DB_NAME')  
db_name,  
(SELECT SUM(bytes) / 1024 / 1024 / 1024 redo_size  
FROM (SELECT bytes FROM v$log UNION ALL SELECT bytes FROM v$standby_log))  
redolog_size_gib,  
(SELECT SUM(bytes) / 1024 / 1024 / 1024 data_size  
FROM dba_data_files)  
dbfiles_size_gib,  
(SELECT NVL(SUM(bytes), 0) / 1024 / 1024 / 1024 temp_size  
FROM dba_temp_files)  
tempfiles_size_gib,  
(SELECT ROUND(SUM(filesize) / 1024 / 1024 / 1024, 3)  
FROM TABLE(rdsadmin.rds_file_util.listdir('ARCHIVELOG_DIR')))  
archlog_size_gib,  
(SELECT SUM(block_size * file_size_blks) / 1024 / 1024 / 1024  
controlfile_size  
FROM v$controlfile)  
ctlfiles_size_gib,  
ROUND(SUM(used.bytes) / 1024 / 1024 / 1024, 3)  
db_size_gib,  
ROUND(SUM(used.bytes) / 1024 / 1024 / 1024, 3) - ROUND(  
free.f / 1024 / 1024 / 1024)  
used_db_size_gib,  
ROUND(free.f / 1024 / 1024 / 1024, 3)  
free_db_size_gib,  
(SELECT ROUND(SUM(filesize) / 1024 / 1024 / 1024, 3)  
FROM TABLE(rdsadmin.rds_file_util.listdir('BDUMP')))  
bdump_db_size_gib,  
(SELECT ROUND(SUM(filesize) / 1024 / 1024 / 1024, 3)  
FROM TABLE(rdsadmin.rds_file_util.listdir('ADUMP')))  
adump_db_size_gib,  
(SELECT ROUND(SUM(filesize) / 1024 / 1024 / 1024, 3)  
FROM TABLE(rdsadmin.rds_file_util.listdir('DATA_PUMP_DIR')))  
dpump_db_size_gib  
FROM (SELECT bytes  
FROM v$datafile  
UNION ALL  
SELECT bytes  
FROM v$tempfile) used,  
(SELECT SUM(bytes) AS f  
FROM dba_free_space) free  
GROUP BY free.f);

Para determinar a distribuição do espaço alocado para diferentes diretórios de usuários do banco de dados Oracle, execute o seguinte comando:

SET SERVEROUTPUT ON;  
  DECLARE  
    v_result NUMBER;  
  v_directory_name VARCHAR2(100);  
BEGIN  
     DBMS_OUTPUT.PUT_LINE('                            ');  
     DBMS_OUTPUT.PUT_LINE('------------------------------');  
     DBMS_OUTPUT.PUT_LINE('ADDITIONAL DIRECTORY FOUND IN DATABASE');  
     DBMS_OUTPUT.PUT_LINE('------------------------------');  

    FOR rec IN (SELECT directory_name, directory_path  
                FROM dba_directories  
                WHERE directory_name NOT IN ('OPATCH_INST_DIR','JAVA$JOX$CUJS$DIRECTORY$','RDS$TEMP','DATA_PUMP_DIR','ADUMP','RDS$DB_TASKS','OPATCH_SCRIPT_DIR','OPATCH_LOG_DIR','BDUMP','SDO_DIR_WORK','SDO_DIR_ADMIN','BDUMP_A') )  
    LOOP  
    v_directory_name := rec.directory_name;  
        -- Output directory details  
        EXECUTE IMMEDIATE 'SELECT ROUND(SUM(filesize) / 1024 / 1024 / 1024, 3) FROM TABLE(rdsadmin.rds_file_util.listdir(''' || v_directory_name || '''))' INTO v_result;  
                DBMS_OUTPUT.PUT_LINE('Directory Name: ' || rec.directory_name);  
        DBMS_OUTPUT.PUT_LINE('Directory Path: ' || rec.directory_path);  
         DBMS_OUTPUT.PUT_LINE('Total Size (GB) for ' || v_directory_name || ': ' || v_result);  
        DBMS_OUTPUT.PUT_LINE('------------------------------');  
    END LOOP;  
END;  
/

Por padrão, as instâncias de banco de dados do Amazon RDS para Oracle ativam a extensão automática para todos os espaços de tabela. Isso inclui espaços de tabela de dados, espaços de tabela undo e espaços de tabela temporários. Cada tipo de espaço de tabela cresce para acomodar mais dados. Seus espaços de tabela crescem até que você não precise de mais armazenamento ou até que as tabelas usem todo o espaço de armazenamento alocado.

Redimensionar os espaços de tabela

Espaço de tabela de dados e espaço de tabela undo

Para redimensionar os espaços de tabela de dados e undo, consulte Como redimensionar o espaço de tabela para minha instância de banco de dados do Amazon RDS para Oracle?

Espaço de tabela temporário

Para redimensionar espaços de tabela temporários, conclua as seguintes etapas:

  1. Para visualizar informações sobre o uso de espaço de tabela temporário, execute o seguinte comando na exibição DBA_TEMP_FREE_SPACE:

    SELECT * FROM dba_temp_free_space;
  2. Para redimensionar o espaço de tabela temporário, execute o seguinte comando com base no resultado da consulta de uso do espaço de tabela:

    ALTER TABLESPACE temp RESIZE 10G;

    Observação: substitua 10G pela quantidade que você deseja redimensionar. O comando anterior falha quando o espaço de tabela alocado excede o limite de 10 GB.

  3. Se o comando anterior falhar, execute o seguinte comando para diminuir o espaço no espaço de tabela temporário:

    ALTER TABLESPACE temp SHRINK SPACE KEEP 10g;
  4. Para verificar se há sessões de longa duração que realizam a classificação ativa no disco e têm segmentos temporários alocados, execute o seguinte comando:

    SELECT * FROM v$sort_usage;
  5. Se a lógica da aplicação permitir que você encerre a sessão, encerre a sessão. Depois de terminar a sessão, redimensione o espaço de tabela temporário novamente.
    Se você não conseguir encerrar suas sessões, crie um novo espaço de tabela temporário. Depois de criar o espaço de tabela, defina-o como o espaço de tabela padrão.
    Em seguida, remova o espaço de tabela temporário anterior:

    SELECT property_name, property_value FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME='DEFAULT_TEMP_TABLESPACE';  
    CREATE TEMPORARY TABLESPACE temp2;  
    EXEC rdsadmin.rdsadmin_util.alter_default_temp_tablespace(tablespace_name => 'temp2');  
    
    SET pages 2000  
    COLUMN username FRO a30  
    SELECT username, TEMPORARY_TABLESPACE FROM dba_users;  
    DROP TABLESPACE temp including contents and datafiles;
  6. Se sua classe de instância de banco de dados tiver armazenamento SSD baseado em NVMe, crie espaços de tabela temporários Oracle em um armazenamento de instâncias para economizar espaço de armazenamento do RDS. Para mais informações, consulte Armazenamento de dados temporários em um armazenamento de instâncias do RDS para Oracle.

Verifique a alocação de espaço para logs de arquivamento ou arquivos de rastreamento

Conclua as etapas a seguir:

  1. Para verificar a retenção atual do log de arquivamento, execute o seguinte comando SQL:

    SELECT value FROM rdsadmin.rds_configuration WHERE name ='archivelog retention hours';

    Observação: nas instâncias do Amazon RDS para Oracle, a retenção de logs de arquivamento é definida como 0 por padrão. Após o upload dos logs de arquivamento para o Amazon S3, o Amazon RDS exclui os logs automaticamente do host subjacente. Para usar logs de arquivamento com outros serviços, como Oracle LogMiner ou GoldenGate, aumente a retenção de logs de arquivamento.

  2. Calcule o espaço que os logs de arquivamento usam no host subjacente.
    Primeiro, execute o seguinte comando para criar um diretório de log de arquivamento:

    EXEC rdsadmin.rdsadmin_master_util.create_archivelog_dir;

    Em seguida, execute o comando a seguir para identificar quanto espaço o log de arquivamento usa em uma instância do RDS:

    SELECT SUM(FILESIZE)/1024/1024/1024 archivelog_usage_GiB FROM TABLE(rdsadmin.rds_file_util.listdir(p_directory => 'ARCHIVELOG_DIR'));
  3. Se o espaço alocado for maior do que o esperado, atualize o valor da política de retenção. Em seguida, permita que a automação do Amazon RDS apague arquivos de log de arquivamento anteriores.
    O exemplo de comando a seguir configura a instância do RDS para Oracle para reter 24 horas de logs de arquivamento:

    BEGIN rdsadmin.rdsadmin_util.set_configuration(name => 'archivelog retention hours', value => '24');  
    END;   
    /  
    COMMIT;

Para mais informações, consulte Limpar arquivos de rastreamento.

Verifique a alocação de espaço para o diretório do Data Pump

Conclua as etapas a seguir:

  1. Se o espaço alocado do diretório do Data Pump for maior que o esperado, encontre os arquivos .dmp que podem ser removidos. Execute o seguinte comando:

    SELECT * FROM TABLE(RDSADMIN.RDS_FILE_UTIL.LISTDIR('DATA_PUMP_DIR')) ORDER BY mtime;
  2. Se o comando anterior encontrar arquivos .dmp, execute o seguinte comando para cada arquivo para excluí-los:

    EXEC utl_file.fremove('DATA_PUMP_DIR', 'file_name');

    Observação: no comando anterior, substitua file_name pelos nomes dos seus arquivos .dmp.

Informações relacionadas

Trabalhar com armazenamento para instâncias de banco de dados do Amazon RDS

Encerrar uma sessão

Monitorar métricas em uma instância do Amazon RDS

Instância de banco de dados do Amazon RDS ficando sem espaço de armazenamento