Saltar al contenido

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

9 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. Quiero saber si puedo liberar espacio en la instancia.

Descripción corta

Varios componentes utilizan el almacenamiento de Amazon RDS para las instancias de Oracle. Los 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 tu instancia, identifica cuánto espacio de almacenamiento utilizan tus componentes:

  • Encuentre la cantidad de espacio que se asigna a los datos en todos los espacios de tablas, incluidos objetos como espacios de tablas temporales.
  • Comprueba la asignación de espacio para los registros de archivos o los archivos de seguimiento.
  • Comprueba la asignación de espacio para el directorio de volcado de datos.

Nota: El espacio de almacenamiento que se asigna 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 además del volumen de almacenamiento físico.

Resolución

Creación de un directorio de registro de archivos

Para crear un directorio registro de archivos, ejecuta el siguiente código SQL:

EXEC rdsadmin.rdsadmin_master_util.create_archivelog_dir;

Encontrar 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, ejecuta el siguiente 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 la distribución del espacio asignado a los diferentes directorios de usuario de la base de datos Oracle, ejecuta el siguiente 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;  
/

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. Cada tipo de espacio de tablas crece para dar cabida a más datos. Tus espacios de tablas crecen hasta que no necesites más almacenamiento o hasta que las tablas ocupen todo el espacio de almacenamiento asignado.

Cambio de 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, consulta ¿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

Para cambiar el tamaño de los espacios de tablas temporales, sigue estos pasos:

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

    SELECT * FROM dba_temp_free_space;
  2. Para cambiar el tamaño del espacio de tablas temporal, ejecuta el siguiente comando en función del resultado de la consulta de uso del espacio de tablas:

    ALTER TABLESPACE temp RESIZE 10G;

    Nota: Sustituye 10G por la cantidad a la que quieres cambiar el tamaño. El comando anterior falla cuando el espacio de tablas asignado supera el umbral de 10 GB.

  3. Si el comando anterior falla, ejecuta el siguiente comando para reducir el espacio en el espacio de tablas temporal:

    ALTER TABLESPACE temp SHRINK SPACE KEEP 10g;
  4. Para comprobar si hay sesiones de larga duración que realizan una clasificación activa en el disco y tienen segmentos temporales asignados, ejecuta el siguiente comando:

    SELECT * FROM v$sort_usage;
  5. Si la lógica de la aplicación te permite finalizar la sesión, finaliza la sesión. Una vez finalizada la sesión, vuelve a cambiar el tamaño del espacio de tablas temporal.
    Si no puedes finalizar las sesiones, crea un nuevo espacio de tablas temporal. Después de crear el espacio de tablas, configúralo como el espacio de tablas predeterminado.
    A continuación, elimina el espacio de tablas temporal 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. Si la clase de instancia de base de datos tiene almacenamiento SSD basado en NVMe, crea espacios de tablas temporales de Oracle en un almacén de instancias para ahorrar espacio de almacenamiento de RDS. Para obtener más información, consulta Almacenamiento de datos temporales en un almacén de instancias de RDS para Oracle.

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

Sigue estos pasos:

  1. Para comprobar la retención actual del registro de archivos, ejecuta el siguiente comando SQL:

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

    Nota: En las instancias de Amazon RDS para Oracle, la retención de registros de archivos se establece en 0 de forma predeterminada. Después de cargar los registros de archivos a Amazon S3, Amazon RDS los elimina automáticamente del host subyacente. Para usar los registros de archivos con otros servicios, como Oracle LogMiner o GoldenGate, aumenta la retención del registro de archivos.

  2. Calcula el espacio que utilizan los registros de archivos en el host subyacente.
    En primer lugar, ejecuta el siguiente comando para crear un directorio de registro de archivos:

    EXEC rdsadmin.rdsadmin_master_util.create_archivelog_dir;

    A continuación, ejecuta el siguiente comando para identificar cuánto espacio ocupa el registro de archivos en una instancia de RDS:

    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 es mayor del esperado, actualiza el valor de la política de retención. A continuación, permite que la automatización de Amazon RDS borre los archivos de registro de archivos anteriores.
    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, consulta Depuración de archivos de seguimiento.

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

Sigue estos pasos:

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

    SELECT * FROM TABLE(RDSADMIN.RDS_FILE_UTIL.LISTDIR('DATA_PUMP_DIR')) ORDER BY mtime;
  2. Si el comando anterior encuentra archivos .dmp, ejecuta el siguiente comando para cada archivo para eliminarlos:

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

    Nota: En el comando anterior, sustituye file_name por los nombres de los archivos .dmp.

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