set pages 0 lin 32767 serveroutput on size 1000000 DECLARE oscopy constant varchar2(6) := '!copy '; gzip constant varchar2(7) := '!touch '; -- gzip constant varchar2(9) := '!gzip -9 '; -- gzip constant varchar2(10) := '!bzip2 -9 '; -- gzip constant varchar2(27) := ' !7za -mx=9 a bigbackup.7z '; dirdelimit constant varchar2(1) := '/'; dest constant varchar2(28) := '/some/destination/directory/'; old_tablespace_name dba_data_files.tablespace_name%TYPE; basename dba_data_files.file_name%TYPE; cursor ts_cursor is select d.tablespace_name, d.file_name from dba_data_files d, (select tablespace_name, count(*) nfiles from dba_data_files group by tablespace_name) nf where d.tablespace_name = nf.tablespace_name order by nf.nfiles desc, d.tablespace_name, d.file_name; BEGIN old_tablespace_name := '#START'; for backup in ts_cursor loop if backup.tablespace_name != old_tablespace_name then if old_tablespace_name != '#START' then dbms_output.put_line('alter tablespace ' || old_tablespace_name ||' end backup;'); end if; dbms_output.put_line('alter tablespace ' || backup.tablespace_name ||' begin backup;'); old_tablespace_name := backup.tablespace_name; end if; dbms_output.put_line(oscopy || backup.file_name || ' ' || dest); basename := substr(backup.file_name, instr(backup.file_name, dirdelimit, -1) + 1); dbms_output.put_line(gzip || dest || basename); end loop; dbms_output.put_line('alter tablespace ' || old_tablespace_name || ' end backup;'); end; /