Ich glaube, jedem DBA wurde schon einmal die Frage gestellt, wie groß denn nun diese oder jene Datenbank ist. Und ich glaube auch, dass jedem DBA daraufhin folgendes durch den Kopf geht: “Was genau will er/sie jetzt wissen und was soll ich darauf antworten?”
Ja, was tun? Nennt man jetzt die allokierte Tablespace-Größe des Users, der ihm/ihr bekannt ist, oder nennt man nur den gegenwärtigen Daten-Füllgrad des Tablespaces? Oder geht man einen Schritt weiter und beziffert die Größe der Datenbank mit der Summe aller Datafiles? Mancher DBA fügt dieser Summe sogar die Größe der Tempfiles hinzu.
Was ist aber mit den Redologs und Controlfiles? Die gehören schließlich auch zur Datenbank! Die Größe der Datenbank in Bezug auf sämtliche Dateien, aus denen sie besteht – Datafiles, Tempfiles, Redologs und Controlfiles, lässt sich mit Hilfe einer kleinen PL/SQL Prozedur ermitteln.
set serveroutput on
set feedback off
declare
db_name varchar2(25);
alloc_database_size number;
used_database_size number;
alloc_datafile_size number;
used_datafile_size number;
alloc_tempfile_size number;
used_tempfile_size number;
redologfile_size number;
controlfile_size number;
begin
select db_unique_name into db_name from v$database;
select sum(bytes) data_file_size into alloc_datafile_size from dba_data_files;
select sum(bytes) temp_file_size into alloc_tempfile_size from dba_temp_files;
select sum(bytes_used) used_temp_file_size into used_tempfile_size from v$temp_space_header;
select sum(bytes) redo_log_size into redologfile_size from v$log;
select (a.bytes-b.bytes) bytes_used into used_datafile_size from (select sum(bytes) bytes from dba_data_files) a, (select sum(bytes) bytes from dba_free_space) b;
select (block_size * (1 + file_size_blks)) control_file_size into controlfile_size from v$controlfile where rownum = 1;
alloc_database_size := round((alloc_datafile_size + alloc_tempfile_size + redologfile_size + controlfile_size)/1024/1024/1024,3);
used_database_size := round((used_datafile_size + used_tempfile_size + redologfile_size + controlfile_size)/1024/1024/1024,3);
alloc_datafile_size := round(alloc_datafile_size/1024/1024/1024,3);
used_datafile_size := round(used_datafile_size/1024/1024/1024,3);
alloc_tempfile_size := round(alloc_tempfile_size/1024/1024/1024,3);
used_tempfile_size := round(used_tempfile_size /1024/1024/1024,3);
redologfile_size := round(redologfile_size/1024/1024/1024,3);
controlfile_size := round(controlfile_size/1024/1024/1024,3);
dbms_output.put_line(‘Groesse der Datenbank ‘|| db_name);
dbms_output.put_line(‘—————————–’);
dbms_output.put_line(‘allokiert: ‘ || alloc_database_size || ‘ GB’);
dbms_output.put_line(‘genutzt:Â Â ‘ || used_database_size || ‘ GB’);
dbms_output.put_line(‘—————————–’);
dbms_output.put_line(‘Details:’);
dbms_output.put_line(‘Groesse der Datafiles  : ‘ || alloc_datafile_size || ‘ GB’);
dbms_output.put_line(‘-> davon genutzt       : ‘ || used_datafile_size || ‘ GB’);
dbms_output.put_line(‘Groesse der Tempfiles  : ‘ || alloc_tempfile_size || ‘ GB’);
dbms_output.put_line(‘-> davon genutzt       : ‘ || used_tempfile_size || ‘ GB’);
dbms_output.put_line(‘Groesse der Redologfiles: ‘ || redologfile_size || ‘ GB’);
dbms_output.put_line(‘Groesse der Controlfiles: ‘ || controlfile_size || ‘ GB’);
end;
/
In der Prozedur wird sowohl die Größe der einzelnen Dateien als auch deren Füllgrad (bei Datafiles und Tempfiles) berücksichtigt. Selbstverständlich kann das Script dahin gehend erweitert werden, dass z.B. die Tablespaces einzeln aufgelistet werden. Sollte die Datenbank im Archivelog Mode gefahren werden (was für produktive Umgebungen zu empfehlen ist), können in der Prozedur auch die Archivelogs berücksichtigt werden.
Download:
db_size.sql (2.7 KiB, 99 Hits)



















[...] dem Artikel SQL-Script: Größe einer Datenbank ermitteln möchte ich daran anknüpfen und auf die Artikel zweier ORACLE DBAs verweisen, die sich mit [...]