Friday, 23 May 2025

Filled under:

 SET SERVEROUTPUT ON

DECLARE

    v_tablespace   VARCHAR2(50) := 'USERS'; -- Change this to your tablespace

    v_cmd          VARCHAR2(1000);

BEGIN

    FOR rec IN (

        SELECT

            df.file_name,

            df.file_id,

            df.tablespace_name,

            df.bytes / 1024 / 1024 AS current_size_mb,

            (hwm.highest_block_id * ts.block_size) / 1024 / 1024 AS hwm_mb

        FROM

            dba_data_files df

            JOIN dba_tablespaces ts ON df.tablespace_name = ts.tablespace_name

            LEFT JOIN (

                SELECT

                    file_id,

                    MAX(block_id + blocks) AS highest_block_id

                FROM

                    dba_extents

                GROUP BY

                    file_id

            ) hwm ON df.file_id = hwm.file_id

        WHERE

            df.tablespace_name = UPPER(v_tablespace)

    )

    LOOP

        IF rec.hwm_mb IS NOT NULL AND rec.current_size_mb - rec.hwm_mb > 10 THEN

            -- Allow 10MB safety margin

            v_cmd := 'ALTER DATABASE DATAFILE ''' || rec.file_name || ''' RESIZE ' || FLOOR(rec.hwm_mb + 10) || 'M;';

            DBMS_OUTPUT.PUT_LINE(v_cmd);

        ELSE

            DBMS_OUTPUT.PUT_LINE('-- No reclaimable space in file: ' || rec.file_name);

        END IF;

    END LOOP;

END;

/

0 comments:

Post a Comment