¿Por qué mi instancia de base de datos de Amazon RDS para Oracle utiliza más almacenamiento del esperado?

8 minutos de lectura
0

Tengo una instancia de base de datos de Amazon Relational Database Service (Amazon RDS) para Oracle que utiliza más espacio del que esperaba.

Descripción breve

Varios componentes pueden utilizar el almacenamiento subyacente de las instancias de Amazon RDS para Oracle. Estos componentes incluyen espacios de tablas, registros de archivos, archivos de registro, archivos de registro de rehacer en línea y archivos de volcado de datos.

Para administrar el crecimiento del almacenamiento en su instancia, identifique cuánto espacio de almacenamiento utilizan sus componentes:

1.    Encuentre la cantidad de espacio que se asigna a los datos en todos los espacios de tablas, incluidos los espacios de tablas temporales.

2.    Compruebe la asignación de espacio para los registros de archivos o los archivos de seguimiento.

3.    Compruebe la asignación de espacio para el directorio de volcado de datos.

Nota: El espacio de almacenamiento asignado a una instancia de RDS representa el volumen de datos. Al crear una instancia, Amazon RDS asigna el almacenamiento asignado al volumen de datos. Este proceso también utiliza un pequeño porcentaje de espacio en disco sin procesar para crear el sistema de archivos sobre el volumen de almacenamiento físico.

Resolución

Encuentre la cantidad de espacio asignado a los datos en los espacios de tablas

Para determinar la distribución del espacio que se asigna a los diferentes componentes de la base de datos Oracle, utilice la siguiente 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);

De forma predeterminada, las instancias de base de datos de Amazon RDS para Oracle activan la ampliación automática de todos los espacios de tablas. Esto incluye los espacios de tabla de datos, los espacios de tablas de DESHACER y los espacios de tablas temporales. Esto significa que cada espacio de tablas crece para dar cabida a más datos. Esta característica continúa hasta que ya no se necesite más almacenamiento o se utilice todo el espacio de almacenamiento asignado.

Cambie el tamaño de los espacios de tablas

Espacio de tablas de datos y espacio de tablas de DESHACER

Para cambiar el tamaño de los espacios de tabla de datos y de DESHACER, consulte ¿Cómo puedo cambiar el tamaño del espacio de tablas de mi instancia de base de datos de Amazon RDS para Oracle?

Espacio de tablas temporal

1.    Para ver información sobre el uso del espacio de tablas temporal, ejecute la siguiente consulta en la vista DBA_TEMP_FREE_SPACE:

SQL> SELECT * FROM dba_temp_free_space;

2.    Para cambiar el tamaño del espacio de tablas temporal (por ejemplo, a 10 GB), ejecute la siguiente consulta en base al resultado de la consulta del uso del espacio de tablas:

SQL> ALTER TABLESPACE temp RESIZE 10g;

Si el espacio de tablas asignado supera el umbral de 10 GB, es posible que este comando falle.

3.    Si el comando falla, reduzca el espacio de tablas temporal:

SQL> ALTER TABLESPACE temp SHRINK SPACE KEEP 10g;

4.    Compruebe si hay sesiones de larga duración que realicen una clasificación activa en el disco y tengan asignados segmentos temporales. Para ello, ejecute la siguiente consulta:

SQL> SELECT * FROM v$sort_usage;

5.    Si la lógica y el negocio de la aplicación le permiten finalizar la sesión, entonces finalice la sesión. A continuación, vuelva a cambiar el tamaño del espacio de tablas temporal, como se muestra en el paso 2.

6.    Si no puede finalizar las sesiones, cree un nuevo espacio de tablas temporal. A continuación, establezca el nuevo espacio de tablas como predeterminado y elimine el antiguo espacio de tablas temporal:

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;

Compruebe la asignación de espacio para los registros de archivos o los archivos de seguimiento

1.    Compruebe la retención actual del registro de archivos:

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

En las instancias de Amazon RDS para Oracle, la retención de registros de archivos se establece en 0 de forma predeterminada. Esto significa que, después de cargar los registros de archivos a Amazon S3, Amazon RDS los elimina automáticamente del host subyacente. Si tiene que utilizar registros de archivos con productos como Oracle LogMiner o GoldenGate, aumente la retención de los registros de archivos.

2.    Calcule el espacio que utilizan los registros de archivos en el host subyacente. Primero, cree un directorio de registros de archivos:

SQL> EXEC rdsadmin.rdsadmin_master_util.create_archivelog_dir;

A continuación, identifique el uso exacto del registro de archivos en una instancia de RDS:

SQL> SELECT sum(FILESIZE)/1024/1024/1024 archivelog_usage_GiB FROM TABLE(rdsadmin.rds_file_util.listdir(p_directory => 'ARCHIVELOG_DIR'));

3.    Si el espacio asignado para los registros de archivos es superior al esperado, actualice el valor de la política de retención. A continuación, permita que la automatización de Amazon RDS borre los archivos de registro de archivos más antiguos. El siguiente ejemplo configura la instancia de RDS para Oracle para retener durante 24 horas los registros de archivos:

begin
 rdsadmin.rdsadmin_util.set_configuration(name => 'archivelog retention hours', value => '24');
end;
 /
commit;

Para obtener más información sobre cómo enumerar y depurar archivos de seguimiento, consulte Depuración de archivos de seguimiento.

Compruebe la asignación de espacio para el directorio de volcado de datos

1.    Si el espacio asignado al directorio de volcado de datos es superior al esperado, busque archivos .dmp que se puedan eliminar:

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

2.    Si esta consulta encuentra archivos .dmp, elimínelos con la siguiente consulta. Sustituya el nombre del archivo por el nombre de los archivos .dmp:

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

Información relacionada

Trabajo con almacenamiento para instancias de base de datos de Amazon RDS

Finalización de una sesión

Supervisión de métricas en una instancia de Amazon RDS

La instancia de base de datos de Amazon RDS se está quedando sin almacenamiento