Мдя, результаты более чем печальные, посему:
Код:
--@hotb 'c:\backup' 'd:\oracle\archive';
-- bak dir archlog dir
set lin 1000
set serveroutput on format wrapped size 1000000
set echo off
set verify off
set feedback off
define bdir='&1'
define archdir=&2
spool hotbackup.sql
declare
cursor tbspc is
select tablespace_name from
dba_tablespaces
where
contents <> 'TEMPORARY'
order by tablespace_name;
cursor datfil (tbspcname varchar2) is
select df.file_name from dba_data_files df, v$datafile d
where
df.tablespace_name = tbspcname
and
df.file_name = d.name
and
d.enabled like '%WRITE%'
order by df.tablespace_name;
tabcur tbspc%rowtype;
datcur datfil%rowtype;
sql_string Varchar2(500);
tsname1 varchar2(30);
tsname2 varchar2(30);
begin
/* send_mail('Backup Started'); СМС-ка админу что Бэкап начали (на яве) */
dbms_output.put_line('WHENEVER SQLERROR EXIT SQL.SQLCODE');
dbms_output.put_line('WHENEVER OSERROR EXIT');
dbms_output.put_line('host rd &bdir\dfbak /Q /S');
dbms_output.put_line('host rd &bdir\arcbak /Q /S');
dbms_output.put_line('host md &bdir\dfbak');
dbms_output.put_line('host md &bdir\arcbak');
dbms_output.put_line('host del &archdir\*.* /q');
dbms_output.put_line('alter system archive log current;');
open tbspc;
loop
fetch tbspc into tabcur;
exit when tbspc%notfound;
sql_string := 'ALTER TABLESPACE ' || tabcur.tablespace_name || ' BEGIN BACKUP;';
dbms_output.put_line(sql_string);
-- Execute Immediate sql_string;
for datcur in datfil(tabcur.tablespace_name)
loop
sql_string := 'host copy ' || datcur.file_name || ' &bdir\dfbak';
dbms_output.put_line(sql_String);
-- Execute Immediate sql_string;
end loop;
sql_string := 'ALTER TABLESPACE ' || tabcur.tablespace_name || ' END BACKUP;';
dbms_output.put_line(sql_string);
dbms_output.put_line('alter system archive log current;');
-- Execute Immediate sql_string;
end loop;
close tbspc;
dbms_output.put_line('alter database backup controlfile to trace;');
dbms_output.put_line('alter database backup controlfile to '||''''||'&bdir'||'\dfbak\'||to_char(sysdate,'ddmmyyhhmi')||'.ctl'||''''||';');
-- dbms_output.put_line('alter system archive log all;');
dbms_output.put_line('host copy &archdir\*.* &bdir\arcbak');
dbms_output.put_line('host del &archdir\*.* /q');
dbms_output.put_line('host del &bdir\dfbak2.rar');
dbms_output.put_line('host del &bdir\arcbak2.rar');
dbms_output.put_line('host rename &bdir\dfbak1.rar dfbak2.rar');
dbms_output.put_line('host rename &bdir\arcbak1.rar arcbak2.rar');
dbms_output.put_line('host RAR a &bdir\dfbak &bdir\dfbak\*.* -ep -ri1 -s- -df -rr[10]');
dbms_output.put_line('host RAR a &bdir\arcbak &bdir\arcbak\*.* -ep -ri1 -s- -df -rr[10]');
dbms_output.put_line('host rename &bdir\dfbak.rar dfbak1.rar');
dbms_output.put_line('host rename &bdir\arcbak.rar arcbak1.rar');
dbms_output.put_line('host rd &bdir\dfbak /Q /S');
dbms_output.put_line('host rd &bdir\arcbak /Q /S');
/* dbms_output.put_line('begin send_mail(''Backup Finished''); end;');
dbms_output.put_line('/'); */
dbms_output.put_line('exit;');
end;
/
spool off
@hotbackup.sql
exit
- hotb.sql
Код:
sqlplus sys/pass@alias @hotb 'E:\backup\hot' 'd:\oracle\archive';
-hbackup.cmd
файл hbackup.cmd - батник вызывающий SQL скрипт который генерит другой скрипт со списком копируемых файлов, 1-ый параметр это -куда копируем, 2-ой это где лежат архивлоги(то где лежат архивологи можно конечно у базы спросить, но писать в лом чета :)) в результате работы буду созданы 2 архива с архивлогами и файлами данных и РК упр.файла. Политика удержания минус 2 суток то есть *bak1.rar - за стуик назад,*bak2.rar - за двое суток. В директории с этими скриптами должен лежать rar.exe.
P.S. Скрпиты не претендуют на оригинальность и гениальность.
P.P.S Кто скажет что это сложно, долго и т.д. пусть первый бросит в меня камень
З.Ы.Ы.Ы. RMAN - рулит