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

7 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.

Breve descrição

Vários componentes podem usar o armazenamento subjacente para instâncias do Amazon RDS para Oracle. Entre esses componentes estão espaços de tabela, logs de arquivamento, arquivos de log, arquivos de redo log online e arquivos do Data Pump.

Para gerenciar o aumento do armazenamento em sua instância, identifique quanto espaço de armazenamento seus componentes usam:

1.    Descubra a quantidade de espaço alocada a dados em todos os espaços de tabela, incluindo espaços de tabela temporários.

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

3.    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 sobre o volume de armazenamento físico.

Resolução

Descobrir a quantidade de espaço alocada a dados nos espaços de tabela

Para determinar a distribuição de espaço alocado para diferentes componentes do banco de dados Oracle, use a seguinte consulta:

set pages 200
select
'===========================================================' || chr(10) ||
'Total Database Physical Size = ' || round(redolog_size_gib+dbfiles_size_gib+tempfiles_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 - Approx only : ' || 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(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 v$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 SUM(blocks * block_size / 1024 / 1024 / 1024) size_gib
FROM v$archived_log
WHERE first_time >= SYSDATE - (
(SELECT value
FROM rdsadmin.rds_configuration
WHERE name =
'archivelog retention hours') /
24 ))
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);

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. Significa que cada espaço de tabela aumenta para acomodar mais dados. Isso persiste até que você não precise de mais armazenamento ou use 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 **

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

SQL> SELECT * FROM dba_temp_free_space;

2.    Para redimensionar o espaço de tabela temporário (por exemplo, para 10 GB), execute a seguinte consulta com base no resultado da consulta de uso do espaço de tabela:

SQL> ALTER TABLESPACE temp RESIZE 10g;

Se o espaço de tabela alocado ultrapassar o limite de 10 GB, esse comando poderá falhar.

3.    Se o comando falhar, reduza o espaço de tabela temporário:

SQL> ALTER TABLESPACE temp SHRINK SPACE KEEP 10g;

4.    Verifique se há sessões de longa duração que realizam classificação ativa em disco e possuem segmentos temporários alocados. Para fazer isso, execute a seguinte consulta:

SQL> SELECT * FROM v$sort_usage;

5.    Se a lógica do aplicativo e as regras do negócio permitirem que você encerre a sessão, faça isso. Em seguida, redimensione o espaço de tabela temporário novamente, conforme mostrado na etapa 2.

6.    Se você não conseguir encerrar suas sessões, crie um novo espaço de tabela temporário. Em seguida, defina o novo espaço de tabela como padrão e elimine o antigo espaço de tabela temporário:

SQL> SELECT property_name,property_value FROM DATABASE_PROPERTIES where PROPERTY_NAME='DEFAULT_TEMP_TABLESPACE';
SQL> create temporary tablespace temp2;
SQL> exec rdsadmin.rdsadmin_util.alter_default_temp_tablespace(tablespace_name => 'temp2');
<wait for a few minutes and verify if the default temporary tablespace for all users have been updated>
SQL> set pages 2000
SQL> column username for a30
SQL> select username, TEMPORARY_TABLESPACE from dba_users;
SQL> drop tablespace temp including contents and datafiles;

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

1.    Verifique a retenção de log de arquivamento atual:

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

Nas instâncias do Amazon RDS para Oracle, a retenção de logs de arquivamento é definida como 0 por padrão. Isso significa que após o upload dos logs de arquivamento para o Amazon S3, o Amazon RDS os exclui automaticamente do host subjacente. Se você precisar usar logs de arquivamento com produtos como o Oracle LogMiner ou o GoldenGate, aumente a retenção de registros de log.

2.    Calcule o espaço que os logs de arquivamento usam no host subjacente. Primeiro, crie um diretório de log de arquivamento:

SQL> EXEC rdsadmin.rdsadmin_master_util.create_archivelog_dir;

Em seguida, identifique o uso exato do log de arquivamento em uma instância do RDS:

SQL> 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 para logs de arquivamento for maior 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 antigos. O exemplo 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 sobre como listar e eliminar arquivos de rastreamento, consulte Limpar logs de rastreamento.

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

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:

SQL> SELECT * FROM TABLE(RDSADMIN.RDS_FILE_UTIL.LISTDIR('DATA_PUMP_DIR')) ORDER by mtime;

2.    Se essa consulta encontrar arquivos.dmp, exclua-os com a consulta a seguir. Substitua o nome do arquivo pelo nome dos arquivos.dmp:

SQL> EXEC utl_file.fremove('DATA_PUMP_DIR','[file name]');

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