--##################################################### --#### Online Backup Skript für Windows oder Linux --#### geschrieben von Marco Patzwahl --#### Firma MuniQSoft (c) 2001 - (c) 2008 --#### Durchführung auf Produktivdatenbanken auf eigene Gefahr !!!!! --#### Aktuelle Version 4.1 vom 26.3.2008 --#### Aenderung vom 2.6.2001: --#### Pruefung wenn kein Archivierungsmodus, abbruch --#### Pruefung der Kopieraktion eingebaut --#### Aenderungen von 3.0.0: --#### - Diverse Anpassungen fuer Oracle 9.2 --#### - Tagesbackup, Checkroutinen --#### - Restore Skript wird mit erzeugt --#### 3.1.0 --#### Oracle Teil der Registry wird mit gesichert --#### 3.1.5 --#### 20.05.2003 Prüfung auf Read Only Dateien --#### 23.06.2003 Verbesserungen für Linux --#### 03.09.2003 Fehlerkorrekturen --#### 18.11.2003 Doppelte Dateinamen speziell behandeln --#### 3.2 --#### 01.02.2004 Exclude Liste der Tablespaces eingebaut --#### 07.04.2004 Detailverbesserungen --#### 21.10.2004 Detailverbesserungen --#### 06.02.2005 Temp-Tablespace Klausel eingebaut --#### 25.10.2005 Anpassungen für 10.2: /dbs Verzeichnis einbauen --#### + automatische Oracle_Home Erkennung --#### 06.03.2008 Anpassung im Restore-Skript, --#### 10.03.2008 Fehlerkorrekturen unter UNIX und Anpassung für 7.3 --#### 26.03.2008 Test mit Version 9i --#### Tests mit Oracle 7.3 Windows OK --#### Tests mit Oracle 9.2.0.8 Windows OK --#### Tests mit Oracle 10.2.0.3 Windows OK --#### Tests mit Oracle 10.2.0.1 UNIX OK --#### Tests mit Oracle 11.1.6.0 Windows OK --#### Final Release ! --##################################################### --#### Bitte starten Sie das Skript unter Windows mittels: --#### sqlplusw system/ @online_backup.sql --#### Verwenden Sie bitte bis 11.1 NICHT die DOS Version von sqlplus !!!! --#### Für Unix benutzen Sie bitte --#### sqlplus system/ @online_backup.sql --##################################################### --##################################################### REM Hier bitte Einstellungen eintragen REM Ab Version 10g wird dies wenn SYS angemeldet ist automatisch erledigt REM (Dann bitte leer ("") lassen): REM DEFINE ORACLE_HOME="C:\oracle\product\11.1.0\db_1" REM DEFINE ORACLE_HOME="C:\oracle\product\10.2.0\db_1" DEFINE ORACLE_HOME="c:\ORACLE\Ora92" REM DEFINE ORACLE_HOME="c:\ORACLE\Ora81" REM DEFINE ORACLE_HOME="C:\orant" DEFINE ORACLE_BASE="C:\ORACLE" REM Beispielpfade für LINUX: REM DEFINE ORACLE_HOME="/opt/oracle/product/10.2.0/db_1" REM DEFINE ORACLE_HOME="/opt/oracle/product/ora10" REM DEFINE ORACLE_BASE="/opt/oracle" --############################################################### REM Verzeichnis in das die Backups gelegt werden REM Falls nicht vorhanden, wird es automatisch angelegt REM ## Für Windows ## DEFINE BACKUP_HOME=d:\orabackup REM ## Für UNIX ## REM DEFINE BACKUP_HOME="/opt/oracle/orabackup" --############################################################### REM Dateiname der Log-Datei: DEFINE BACKUP_LOG=backup.log REM BACKUP_LEBENSDAUER regelt ob Tages-, Wochen- oder Monatsbackup REM erzeugt werden. Wenn Backups nie überschieben geben Sie "Unendlich" an. REM REM Ein BACKUP überschreibt dann erst nach 1/7/31/nie REM Tagen das letzte BACKUP! REM Zur Wahl stehen: REM DEFINE BACKUP_LEBENSDAUER="Tag" REM DEFINE BACKUP_LEBENSDAUER="Woche" DEFINE BACKUP_LEBENSDAUER="Monat" REM DEFINE BACKUP_LEBENSDAUER="Unendlich" REM Wenn Sie einige Tablespace nicht mitsichern wollen weil Sie REM für Sie unwichtig sind können Sie diese bitte in der folgenden REM Form angeben: REM exclude_list=('TABLESPACE_A','TABLESPACE_B',...) REM Wenn kein Tablespace ausgeschlossen werden soll verwenden Sie: DEFINE exclude_list=('X$X') /* Das X$X ist wichtig !!!!!! */ REM Für die Version 7.3 muss die Oracle_SID angeben werden REM DEFINE ORACLE_SID=orcl --############################################################### REM Trace-Dateien aus den Verzeichnissen udump und bdump löschen REM 0 bedeutet ausgeschalten REM jede Zahl von 1-1000 gibt die Anzahl an Tagen die REM die Trace-Dateien aufbewahrt werden, ältere werden gelöscht REM Beispiel 7: Alte Trace-dateien älter 7 Tage löschen DEFINE trace_del=0 --############################################################### --############################################################### REM Bitte ab hier nichts mehr ändern !!!!!!!!!!!!!! --############################################################### --############################################################### CLEAR SCREEN SET VERIFY OFF FEEDBACK OFF TERMOUT ON ECHO OFF LINESIZE 500 spool c:\bak.log -- ### Oracle Home und Oracle Base ermitteln (ab Version 10g) VARIABLE os_var varchar2(100) exec dbms_system.get_env('ORACLE_HOME',:os_var); COL os_var NEW_VALUE os_var SELECT nvl('&&ORACLE_HOME',:os_var) as os_var from dual; DEFINE ORACLE_HOME="&&os_var" exec dbms_system.get_env('ORACLE_BASE',:os_var); COL os_var NEW_VALUE os_var SELECT nvl('&&ORACLE_BASE',:os_var) as os_var from dual; DEFINE ORACLE_BASE="&&os_var" -- ### Version ermitteln COLUMN my_version NEW_VALUE my_version select to_number(replace(substr(value,1,instr(value,'.')+1),'.','')) as my_version from v$parameter where name='compatible'; -- ### Oracle DB Name ermitteln COLUMN instance_name NEW_VALUE oracle_sid SELECT instance_name FROM v$instance; -- ### Hostname ermitteln DEFINE oracle_host="UNKNOWN" column host_name new_value oracle_host SELECT host_name FROM V$INSTANCE; -- ### Betriebssystem ermiteln column bs_version new_value bs_version select decode(instr(name,'/'),0,'winnt','unix') bs_version from v$datafile where rownum=1; -- ### Loeschprogramm nach Betriebssystem verschieden column del_prg new_value del_prg select decode('&&bs_version','unix','rm -f ','del ') del_prg from dual; -- ### Slash nach Betriebssystem verschieden column xslash new_value xslash select decode('&&bs_version','unix','/','\') xslash from dual; prompt Es werden Verzeichnisse angelegt im Verzeichnis &&BACKUP_HOME HOST mkdir &&BACKUP_HOME DEFINE BACKUP_HOME=&&BACKUP_HOME&&xslash&&ORACLE_SID HOST mkdir &&BACKUP_HOME prompt Lege Spool Datei an: &&BACKUP_HOME&&xslash.daily.tmp SPOOL &&BACKUP_HOME&&xslash.daily.tmp SET PAGESIZE 0 COl p_week new_value p_week SELECT 'REM',to_char(sysdate,'DY') p_week FROM dual; COl p_month new_value p_month SELECT 'REM','Tag_'||to_char(sysdate,'DD') p_month FROM dual; COl p_time new_value p_time SELECT 'REM',to_char(sysdate,'DD_MM_YYYY_HH24_MI_SS') p_time FROM dual; SELECT DECODE(UPPER('&&BACKUP_LEBENSDAUER'), 'TAG','DEFINE p_day=ALL', 'WOCHE','DEFINE p_day=&&p_week', 'MONAT','DEFINE p_day=&&p_month', 'UNENDLICH','DEFINE p_day=&&p_time', 'DEFINE p_day=&&p_week') as rem FROM dual; SPOOL OFF @&&BACKUP_HOME&&xslash.daily.tmp DEFINE BACKUP_HOME=&&BACKUP_HOME&&xslash&&p_day prompt BACKUP Home: &&BACKUP_HOME HOST mkdir &&BACKUP_HOME HOST mkdir &&BACKUP_HOME&&xslash.logs HOST mkdir &&BACKUP_HOME&&xslash.misc HOST mkdir &&BACKUP_HOME&&xslash.misc&&xslash.dbs HOST mkdir &&BACKUP_HOME&&xslash.misc&&xslash.database HOST mkdir &&BACKUP_HOME&&xslash.files HOST mkdir &&BACKUP_HOME&&xslash.cfiles HOST mkdir &&BACKUP_HOME&&xslash.afiles SET PAGESIZE 100 SPOOL &&BACKUP_HOME&&xslash.daily.tmp SELECT DECODE(upper('&&BACKUP_LEBENSDAUER'),'TAG','DEFINE BACKUP_BASE=&&BACKUP_HOME.&&xslash.logs','DEFINE BACKUP_BASE=&&BACKUP_HOME.&&xslash.logs') as rem FROM dual; spool off @&&BACKUP_HOME&&xslash.daily.tmp host &&del_prg &&BACKUP_HOME&&xslash...&&xslash.daily.tmp SET TERMOUT ON prompt ####################################################### prompt Willkommen zum Oracle Online Backup der Firma MuniQSoft prompt Geschrieben von Marco Patzwahl prompt (C) 2000 - 2008 prompt Die Durchfuehrung erfolgt auf eigene Gefahr. prompt Es wird keine Haftung uebernommen. prompt ####################################################### SET feedback off echo off verify off heading off SET serveroutput on WHENEVER SQLERROR EXIT --################################################################ prompt Pruefen, ob Archivierung eingeschalten wurde: --################################################################ SPOOL &&BACKUP_BASE.&&xslash.fehler1.tmp DECLARE vlog_mode VARCHAR2(100); BEGIN SELECT log_mode INTO vlog_mode FROM v$database; IF vlog_mode<>'ARCHIVELOG' THEN DBMS_OUTPUT.PUT_LINE('Backup abgebrochen, da Archivierung deaktiviert'); DBMS_OUTPUT.PUT_LINE('Führen Sie bitte folgende Schritte durch::'); DBMS_OUTPUT.PUT_LINE('SHUTDOWN IMMEDIATE'); DBMS_OUTPUT.PUT_LINE('STARTUP MOUNT'); DBMS_OUTPUT.PUT_LINE('ALTER DATABASE ARCHIVELOG;'); DBMS_OUTPUT.PUT_LINE('ALTER DATABASE OPEN;'); RAISE_APPLICATION_ERROR(-20001,'Online Backup Abbruch, wegen NOARCHIVELOG'); END IF; END; / SPOOL OFF WHENEVER SQLERROR CONTINUE --################################################################ prompt Pruefen, ob Datendateien korrupt, Read Only oder Offline: --################################################################ REM ############ Defekte ################## SPOOL &&BACKUP_BASE/fehler2.tmp SELECT DECODE(count(*),0,'Keine Dateien defekt','Folgende Dateien sind defekt:') FROM v$recover_file WHERE error<>'OFFLINE NORMAL'; SELECT r.error,d.name FROM v$recover_file r, v$datafile d WHERE d.file#=r.file# AND error<>'OFFLINE NORMAL'; REM ############ Offline ################## SELECT DECODE(count(*),0,'Keine Dateien offline','Folgende Dateien sind offline:') FROM v$datafile WHERE status='OFFLINE'; SELECT df.status,dd.tablespace_name,dd.file_name FROM v$datafile df, dba_data_files dd WHERE dd.file_id=df.file# AND df.status='OFFLINE'; REM ############ Read Only ################## SELECT DECODE(count(*),0,'Keine Dateien read only','Folgende Dateien sind read only:') FROM dba_tablespaces WHERE status='READ ONLY'; SELECT ta.tablespace_name,df.file_name FROM dba_data_files df, dba_tablespaces ta WHERE df.tablespace_name=ta.tablespace_name AND ta.status='READ ONLY'; REM ############ Mehrfache Dateinamen ################## SELECT DECODE(COUNT(*),0,'','Folgender Dateiname ist mehrfach vorhanden und wird beim Backup NICHT richtig gesichert:') AS "Warnung !!!!!!!!!!!!!!!!!!!!" FROM v$datafile GROUP BY SUBSTR(name,INSTR(name,'&&xslash',-1)+1) HAVING COUNT(*)>1; SELECT SUBSTR(name,instr(name,'&&xslash',-1)+1) name, count(*) FROM v$datafile GROUP BY SUBSTR(name,instr(name,'&&xslash',-1)+1) HAVING COUNT(*)>1; SELECT 'Folgende Ausgaben wurden durch dbverify produziert: (fehlerhafte Blöcke)' FROM dual; SPOOL OFF --################################################################ prompt Online-Kopier-Programmversion abhaengig von Datenbankversion --################################################################ column dummy new_value dummy SELECT decode(substr(value,1,3), '8.0','ocopy80', '7.3','ocopy73', '9.0','ocopy', '9.2','ocopy', 'copy') AS dummy FROM v$parameter WHERE name='compatible'; -- ### DEFINE ORACOPY_PRG=ocopy -- ###Kopierprogramm auch nach Betriebssystem verschieden column oracopy_prg new_value oracopy_prg select decode('&&bs_version','unix','cp ','&&dummy ') oracopy_prg from dual; SET TERMOUT OFF -- ### Netzwerkverzeichnis abhaengig von Datenbankversion column dummy new_value NETWORK_DIR SELECT decode(substr(value,1,3),'8.0','Net80','network') AS dummy FROM v$parameter WHERE name='compatible'; -- ### DEFINE NETWORK_DIR=Network SET TERMOUT ON DEFINE LOGFILE_NAME=backup_&&ORACLE_SID.log --############################################################### prompt Controldatei sichern ################################### --############################################################### -- Binaere Kopie ALTER DATABASE BACKUP CONTROLFILE TO '&&BACKUP_HOME.&&xslash.cfiles&&xslash.control.bin'; -- Erzeugen aller vorhandenen Controlfiles (durch Kopieren) set termout off spool &&BACKUP_BASE&&xslash.control.tmp SELECT 'HOST &&ORACOPY_PRG &&BACKUP_HOME&&xslash.cfiles&&xslash.control.bin '||'&&BACKUP_HOME&&xslash.cfiles&&xslash'||SUBSTR(name,instr(name,'&&xslash',-1)+1) FROM v$controlfile; SELECT 'HOST &&del_prg &&BACKUP_HOME&&xslash.cfiles&&xslash.control.bin' FROM dual; spool off @&&BACKUP_BASE&&xslash.control.tmp set termout on ALTER DATABASE BACKUP CONTROLFILE TO TRACE; REM Ab 9i kann ein Name für die Trace-Controldatei angegeben werden ALTER DATABASE BACKUP CONTROLFILE TO TRACE AS '&&BACKUP_HOME.&&xslash.cfiles&&xslash.control.txt' REUSE; DEFINE CONTROLFILE_NAME="notfound" column dummy new_value CONTROLFILE_NAME SELECT '&&ORACOPY_PRG '||a.value||'&&xslash'||'ORA'|| ltrim(to_char(b.spid,'00000'))||'.TRC'||' &&BACKUP_HOME.&&xslash.cfiles&&xslash.control.txt' as dummy FROM v$parameter a,v$process b,v$session c,v$database d WHERE a.name='user_dump_dest' and b.addr=c.paddr and c.type='USER' and c.audsid=userenv('SESSIONID') AND c.username=sys_context('USERENV','CURRENT_USER'); HOST &&CONTROLFILE_NAME REM Achtung, ab Version 9i haben die Trace Dateien ein neues Format : _ora_.trc column dummy new_value CONTROLFILE_NAME SELECT '&&ORACOPY_PRG '||a.value||'&&xslash'||'&&ORACLE_SID._ora_'|| ltrim(to_char(b.spid,'0000'))||'.trc'||' &&BACKUP_HOME.&&xslash.cfiles&&xslash.control.txt' as dummy FROM v$parameter a,v$process b,v$session c,v$database d WHERE a.name='user_dump_dest' and b.addr=c.paddr and c.type='USER' and c.audsid=userenv('SESSIONID') AND c.username=sys_context('USERENV','CURRENT_USER'); HOST &&CONTROLFILE_NAME --################################################################ prompt Initialisierungsdatei sichern ########################### --################################################################ REM Folgende Pfade können inzwischen eine Initialisierungsdatei beinhalten: REM 8.0: ORACLE_HOME/database (Windows) oder ORACLE_HOME/dbs (UNix) REM 8.1: ORACLE_BASE/admin/pfile REM 9.x: ORACLE_HOME/database (Windows) oder ORACLE_HOME/dbs (UNIX) REM 10.2 ORACLE_HOME/database (Windows) oder ORACLE_HOME/dbs (UNIX und Windows) REM 11.1 ORACLE_HOME/database (Windows) oder ORACLE_HOME/dbs (UNIX und Windows) PROMPT Wir sichern die init.ora aus Version 8.1 (falls vorhanden) HOST &&ORACOPY_PRG &&ORACLE_BASE.&&xslash.admin&&xslash.&&ORACLE_SID.&&xslash.pfile&&xslash.init*.ora &&BACKUP_HOME.&&xslash.misc REM Aus dem dbs und DATABASE Verzeichnis sichern wir mal alle .ora Dateien HOST &&ORACOPY_PRG &&ORACLE_HOME.&&xslash.dbs&&xslash.init*.ora &&BACKUP_HOME.&&xslash.misc&&xslash.dbs HOST &&ORACOPY_PRG &&ORACLE_HOME.&&xslash.database&&xslash.init*.ora &&BACKUP_HOME.&&xslash.misc&&xslash.database HOST &&ORACOPY_PRG &&ORACLE_HOME.&&xslash.dbs&&xslash.spfile*.ora &&BACKUP_HOME.&&xslash.misc&&xslash.dbs HOST &&ORACOPY_PRG &&ORACLE_HOME.&&xslash.database&&xslash.spfile*.ora &&BACKUP_HOME.&&xslash.misc&&xslash.database --################################################################ prompt Passwortdatei sichern ############################## --################################################################ undefine unix_dos col unix_dos new_value unix_dos select decode('&&bs_version','unix','/dbs/orapw&&ORACLE_SID','\database\pwd&&ORACLE_SID..ora') unix_dos FROM dual; HOST &&ORACOPY_PRG &&ORACLE_HOME&&unix_dos &&BACKUP_HOME.&&xslash.misc PROMPT Sichere &&ORACOPY_PRG &&ORACLE_HOME&&unix_dos &&BACKUP_HOME.&&xslash.misc --################################################################ prompt Alert-Datei sichern ##################################### --################################################################ REM Ab Version 9.2 heisst die Alert-Datei alert_.log column dummy new_value ALERTFILE_NAME SELECT DECODE(sign(replace(substr(value,1,4),'.','')-89),1,'alert_&&ORACLE_SID..log','&&ORACLE_SID.alrt.log') AS dummy FROM v$parameter where name='compatible'; column ALERTFILE_PATH new_value ALERTFILE_PATH SELECT decode(value, '%RDBMS73%\trace','&&ORACLE_HOME.&&xslash.RDBMS73/trace', '%RDBMS80%\trace','&&ORACLE_HOME.&&xslash.RDBMS80/trace', value) ||'&&xslash'||'&&ALERTFILE_NAME' AS ALERTFILE_PATH FROM v$parameter WHERE name='background_dump_dest'; HOST &&ORACOPY_PRG &&ALERTFILE_PATH &&BACKUP_HOME.&&xslash.misc --################################################################ prompt Netzwerkdateien sichern ################################ --################################################################ HOST &&ORACOPY_PRG &&ORACLE_HOME.&&xslash.&&NETWORK_DIR.&&xslash.admin&&xslash.*.ora &&BACKUP_HOME.&&xslash.misc prompt &&ORACOPY_PRG &&ORACLE_HOME.&&xslash.&&NETWORK_DIR.&&xslash.admin&&xslash.*.ora &&BACKUP_HOME.&&xslash.misc set heading off feedback off linesize 500 set verify off --################################################################ prompt Oratab unter UNIX sichern oder Registry unter Windows ########### --################################################################ col unix_dos new_value unix_dos select decode('&&bs_version', 'unix','cp /etc/oratab &&BACKUP_HOME.&&xslash.misc', 'regedit /e &&BACKUP_HOME.&&xslash.misc.&&xslash.oracle.reg HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE') unix_dos FROM dual; HOST &&unix_dos --################################################################# prompt Archivierung sicher einschalten und Logswitch durchfuehren # --################################################################# ALTER SYSTEM ARCHIVE LOG START; ALTER SYSTEM ARCHIVE LOG CURRENT; -- ### Aktuelle Redologdateinummer ermitteln COLUMN dummy NEW_VALUE min_logmnr SELECT sequence# dummy FROM v$log WHERE status='CURRENT'; --################################################################## prompt Backup der Tablespaces ################################## --################################################################## col db_groesse NEW_VALUE db_groesse SELECT ROUND(SUM(bytes)/1024/1024) AS db_groesse FROM v$datafile; col backup_time NEW_VALUE backup_time select NVL(TO_CHAR(round((max(time)-min(time))*24*60,2)),'X') as backup_time from v$backup; spool &&BACKUP_BASE.&&xslash.kopie.tmp SELECT 'HOST echo Datenbankinstanz:'||instance_name|| ' Rechnername:&&ORACLE_HOST >&&BACKUP_BASE.&&xslash.&&BACKUP_LOG' FROM v$instance; SELECT 'REM Benutztes Oracle Home: &&ORACLE_HOME >>&&BACKUP_BASE.&&xslash.&&BACKUP_LOG' FROM dual; SELECT 'HOST echo Folgende Tablespaces wurden vom Backup ausgeschlossen :'||replace(decode(&&exclude_list,'X$X','-Keiner-') ,chr(39),' ') ||'>>&&BACKUP_BASE.&&xslash.&&BACKUP_LOG' FROM dual; SELECT 'HOST echo Backupstart:'||to_char(sysdate,'DD.MM.YY HH24:MI:SS')||'>>&&BACKUP_BASE.&&xslash.&&BACKUP_LOG' FROM DUAL; SELECT 'HOST echo Anzahl der zu sichernden Datendateien :'||count(*)||' >>&&BACKUP_BASE.&&xslash.&&BACKUP_LOG' FROM dba_data_files WHERE tablespace_name NOT IN &&exclude_list; -- Eigentlicher Kern des Backups ################################### REM Dateien die keinen doppelten Namen besitzen SELECT 'ALTER TABLESPACE "'||tablespace_name||'" BEGIN BACKUP;'|| chr(10)||'HOST &&ORACOPY_PRG "'||file_name||'" &&BACKUP_HOME.&&xslash.files'|| chr(10)||'HOST echo Kopiere id='||rownum||' name='||file_name||' tbs='||tablespace_name||' Bytes:'||bytes||' >>&&BACKUP_BASE.&&xslash.&&BACKUP_LOG'|| chr(10)||'ALTER TABLESPACE "'||tablespace_name||'" END BACKUP;' FROM dba_data_files WHERE tablespace_name NOT IN upper(&&exclude_list) AND SUBSTR(file_name,instr(file_name,'&&xslash',-1)+1) NOT IN( SELECT SUBSTR(name,instr(name,'&&xslash',-1)+1) name FROM v$datafile GROUP BY SUBSTR(name,instr(name,'&&xslash',-1)+1) HAVING COUNT(*)>1) ORDER BY file_id; REM Dateien die einen doppelten Namen besitzen aber in versch. Verzeichnissen stehen SELECT 'ALTER TABLESPACE "'||tablespace_name||'" BEGIN BACKUP;'|| chr(10)||'HOST &&ORACOPY_PRG "'||file_name||'" &&BACKUP_HOME.&&xslash.files&&xslash'||SUBSTR(file_name,instr(file_name,'&&xslash',-1)+1)||'_'||file_id|| chr(10)||'HOST echo Kopiere id='||file_id||' file='||file_name||' TBS='||tablespace_name||' Bytes:'||bytes||' >>&&BACKUP_BASE.&&xslash.&&BACKUP_LOG'|| chr(10)||'ALTER TABLESPACE "'||tablespace_name||'" END BACKUP;' FROM dba_data_files WHERE tablespace_name NOT IN upper(&&exclude_list) AND SUBSTR(file_name,instr(file_name,'&&xslash',-1)+1) IN ( SELECT SUBSTR(name,instr(name,'&&xslash',-1)+1) name FROM v$datafile GROUP BY SUBSTR(name,instr(name,'&&xslash',-1)+1) HAVING COUNT(*)>1) ORDER BY file_id; PROMPT REM ######################################################## PROMPT REM ### Der Backup Prozess startet .... bitte warten ... ### PROMPT REM ### Wir sichern&&db_groesse MB weg und das dauert... ### PROMPT REM ### z.B. beim letzen Mal &&backup_time Minuten ### PROMPT REM ### ### PROMPT REM ### Werbung: MuniQsoft GmbH Ihr Oracle Schulungs und ### PROMPT REM ### Consulting Partner. Rufen Sie uns Heute noch an: ### PROMPT REM ### Tel.: 089/67909040 http://www.muniqsoft.de ### PROMPT REM ######################################################## spool OFF START &&BACKUP_BASE.&&xslash.kopie.tmp col unix_dos new_value unix_dos select decode('&&bs_version','unix','ls -al ','dir ') AS unix_dos from dual; HOST echo "Groesse der gesicherten Dateien: \n">>&&BACKUP_BASE.&&xslash.&&BACKUP_LOG HOST &&unix_dos &&BACKUP_HOME.&&xslash.files>>&&BACKUP_BASE.&&xslash.&&BACKUP_LOG SPOOL &&BACKUP_BASE.&&xslash.info1.tmp SELECT 'Datenbank Backup um '||to_char(sysdate,'DD.MM.YYYY HH24:MI:SS')||' beendet.' FROM dual; prompt --################################################################# prompt Aktuelle Redologdatei auch sichern ###################### --################################################################# prompt Fuehre Logswitch durch und archive alle noetigen Redologs ALTER SYSTEM ARCHIVE LOG CURRENT; prompt Nummer der ersten Redologdatei bei Online Backup: &&min_logmnr COLUMN max_logmnr NEW_VALUE max_logmnr SELECT 'Nummer der letzen Redologdatei:',sequence#-1 max_logmnr FROM v$log WHERE status='CURRENT'; SPOOL OFF --################################################################# prompt Pruefung ob ONLINE Backup-Modus korrekt beendet ########## --################################################################# SPOOL &&BACKUP_BASE.&&xslash.fehler3.tmp SELECT DECODE(count(b.status),0,'','Fehler, folgende Dateien sind immer noch im Backup Modus!:') FROm v$backup b,v$datafile d where d.file#=b.file# AND b.status='ACTIVE'; SELECT d.name FROM v$backup b,v$datafile d where d.file#=b.file# AND b.status='ACTIVE'; SPOOL OFF --################################################################ prompt Redologdateien, die waehrend des Online Backups ######### prompt angefallen sind werden auch archiviert ######### --################################################################ spool &&BACKUP_BASE.&&xslash.archive.tmp SELECT 'HOST &&ORACOPY_PRG '||name||' &&BACKUP_HOME.&&xslash.afiles' FROM v$archived_log WHERE sequence# BETWEEN &&min_logmnr AND &&max_logmnr AND name IS NOT NULL AND archived='YES'; PROMPT REM Besonderheiten der Version 7.3 col stop_now NEW_VALUE stop_now SELECT 'REM',decode(substr(value,1,3), '8.0','rem ', '7.3','rem ') AS stop_now FROM v$parameter WHERE name='compatible'; col old_archive_path NEW_VALUE old_archive_path select '&&stop_now'||replace(value,'%','') as old_archive_path from v$parameter where name='log_archive_dest'; COL archive_name new_value archive_name SELECT '&&ORACLE_HOME.&&xslash.&&old_archive_path'||replace(replace(value,'%T','001'),'%%ORACLE_SID%%','&&ORACLE_SID') as archive_name from v$parameter where name='log_archive_format'; SELECT 'HOST &&ORACOPY_PRG '||replace(upper('&&archive_name'),'%S','*'||sequence#)||' &&BACKUP_HOME.&&xslash.afiles' from v$loghist WHERE sequence# between &&min_logmnr AND &&max_logmnr; spool off START &&BACKUP_BASE.&&xslash.archive.tmp --############################################################# prompt Pruefung ob Datendateien korrupte Bloecke besitzen ##### --############################################################# COL dummy NEW_VALUE pBlock_size SELECT value dummy FROM v$parameter WHERE name ='db_block_size'; -- ###Addition von Dateien nach Betriebssystem verschieden column output_prg new_value output_prg select decode('&&bs_version','unix','cat','type') AS output_prg from dual; DEFINE db_verify="dbv" COL db_verify NEW_VALUE db_verify SELECT decode(substr(value,1,3), '8.0','dbverf80', '7.3','dbverf73', 'dbv') AS db_verify FROM v$parameter WHERE name='compatible'; SPOOL &&BACKUP_BASE.&&xslash.blockpruef.bat SELECT '&&ORACLE_HOME.&&xslash.bin&&xslash.&&db_verify file=&&BACKUP_HOME.&&xslash.files&&xslash.'|| substr(name,instr(name,'&&xslash',-1)+1)||' blocksize=&&pBlock_size logfile=&&BACKUP_BASE.&&xslash.pruef.tmp'||chr(10)|| '&&output_prg &&BACKUP_BASE.&&xslash.pruef.tmp >>&&BACKUP_BASE.&&xslash.pruef.log' FROM v$datafile; SPOOL OFF col unix_cmd new_value unix_cmd select decode('&&bs_version','unix','chmod 777 &&BACKUP_BASE.&&xslash.blockpruef.bat','dir') unix_cmd FROM dual; HOST &&unix_cmd host &&BACKUP_BASE.&&xslash.blockpruef.bat --############################################################### prompt Zusammenfassungen erstellen ########################## --############################################################### REM DOS Variante spool &&BACKUP_BASE/zf_tmp_dos.bat prompt find "markierte Seiten" /N &&BACKUP_BASE.&&xslash.pruef.log >&&BACKUP_BASE.&&xslash.pruef.err prompt find "Marked Corrupt" /N &&BACKUP_BASE.&&xslash.pruef.log >>&&BACKUP_BASE.&&xslash.pruef.err prompt find "Corrupt block" /N &&BACKUP_HOME.&&xslash.misc&&xslash.&&ALERTFILE_NAME >>&&BACKUP_BASE.&&xslash.alert.err prompt find "ORA-" /N &&BACKUP_HOME.&&xslash.misc&&xslash.&&ALERTFILE_NAME >>&&BACKUP_BASE.&&xslash.alert.err spool off REM UNIX Variante spool &&BACKUP_BASE/zf_tmp_unix.tmp prompt grep -in 'markierte Seiten' &&BACKUP_BASE.&&xslash.pruef.log >&&BACKUP_BASE.&&xslash.pruef.err prompt grep -in 'Marked Corrupt' &&BACKUP_BASE.&&xslash.pruef.log >>&&BACKUP_BASE.&&xslash.pruef.err prompt grep -in 'Corrupt block' &&BACKUP_HOME.&&xslash.misc&&xslash.&&ALERTFILE_NAME >>&&BACKUP_BASE.&&xslash.alert.err prompt grep -in 'ORA-' &&BACKUP_HOME.&&xslash.misc&&xslash.&&ALERTFILE_NAME >&&BACKUP_BASE.&&xslash.alert.err spool off col unix_cmd new_value unix_cmd select decode('&&bs_version','unix','chmod 777 &&BACKUP_BASE/zf_tmp_unix.tmp','dir') unix_cmd from dual; HOST &&unix_cmd col bs_file new_value bs_file select decode('&&bs_version','unix','zf_tmp_unix.tmp','zf_tmp_dos.bat') bs_file from dual; host &&BACKUP_BASE/&&bs_file --############################################################### prompt Erzeugte Hilfsdateien loeschen ########################## --############################################################### -- ###Addition von Dateien nach Betriebssystem verschieden column add_prg new_value add_prg select decode('&&bs_version','unix','cat ','TYPE ') add_prg from dual; REM Infodateien zusammenfuegen HOST &&add_prg &&BACKUP_BASE.&&xslash.info1.tmp >> &&BACKUP_BASE.&&xslash.&&BACKUP_LOG HOST &&add_prg &&BACKUP_BASE.&&xslash.fehler1.tmp >> &&BACKUP_BASE.&&xslash.&&BACKUP_LOG HOST &&add_prg &&BACKUP_BASE.&&xslash.fehler2.tmp >> &&BACKUP_BASE.&&xslash.&&BACKUP_LOG HOST &&add_prg &&BACKUP_BASE.&&xslash.fehler3.tmp >> &&BACKUP_BASE.&&xslash.&&BACKUP_LOG --HOST &&add_prg &&BACKUP_BASE.&&xslash.compact.err >> &&BACKUP_BASE.&&xslash.&&BACKUP_LOG HOST &&add_prg &&BACKUP_BASE.&&xslash.pruef.err >> &&BACKUP_BASE.&&xslash.&&BACKUP_LOG HOST echo "#############################################" >>&&BACKUP_BASE.&&xslash.&&BACKUP_LOG HOST echo " Folgende Fehler standen in der Alert-Datei:" >>&&BACKUP_BASE.&&xslash.&&BACKUP_LOG HOST echo "#############################################" >>&&BACKUP_BASE.&&xslash.&&BACKUP_LOG HOST &&add_prg &&BACKUP_BASE.&&xslash.alert.err >> &&BACKUP_BASE.&&xslash.&&BACKUP_LOG HOST &&del_prg &&BACKUP_BASE.&&xslash*.tmp HOST &&del_prg &&BACKUP_BASE.&&xslash.pruef.log --HOST &&del_prg &&BACKUP_BASE.&&xslash.compact.err HOST &&del_prg &&BACKUP_BASE.&&xslash.alert.err HOST &&del_prg &&BACKUP_BASE.&&xslash.pruef.err HOST &&del_prg &&BACKUP_BASE.&&xslash.zf_tmp_dos.bat HOST &&del_prg &&BACKUP_HOME.&&xslash.daily.tmp HOST &&del_prg &&BACKUP_BASE.&&xslash.blockpruef.bat HOST &&del_prg &&BACKUP_BASE.&&xslash.control.tmp --############################################################### prompt Restore Skript erzeugen ######################### --############################################################### col file_name format a70 set pagesize 0 echo off feedback off termout off verify off spool &&BACKUP_BASE.&&xslash.restore.sql SELECT 'REM Sehen Sie in v$recover_file nach, welche Dateien defekt sind' SELECT 'REM Entfernen Sie die Kommentarzeichen von den Dateien die zurueckgespielt werden sollen' FROM dual; SELECT 'STARTUP MOUNT' FROM dual; SELECT 'REM HOST &&ORACOPY_prg.&&BACKUP_HOME&&xslash.files'||substr(name,instr(name,'&&xslash',-1))||' '||name FROM v$datafile; SELECT 'RECOVER AUTOMATIC DATABASE' FROM dual; SELECT 'ALTER DATABASE OPEN;' FROM dual; SELECT 'REM ALTER DATABASE TEMPFILE '''||file_name||''' drop;' FROM dba_temp_files; SELECT 'REM ALTER TABLESPACE '||tablespace_name|| ' ADD TEMPFILE '''||file_name||''' SIZE '||bytes/1024||'K REUSE;' as cmd FROM dba_temp_files; spool off set echo on termout on --############################################################### prompt Alte Trace-Dateien löschen ####################### --############################################################### WHENEVER SQLERROR EXIT REM Bei Einstellung 0 verabschieden wir uns hier SELECT 1/&&trace_del FROM dual; column bdump_path new_value bdump_path SELECT decode(value, '%RDBMS73%\trace','&&ORACLE_HOME.&&xslash.RDBMS73/trace', '%RDBMS80%\trace','&&ORACLE_HOME.&&xslash.RDBMS80/trace', value) AS bdump_path FROM v$parameter WHERE name='background_dump_dest'; column udump_path new_value udump_path SELECT decode(value, '%RDBMS73%\trace','&&ORACLE_HOME.&&xslash.RDBMS73/trace', '%RDBMS80%\trace','&&ORACLE_HOME.&&xslash.RDBMS80/trace', value) AS udump_path FROM v$parameter WHERE name='user_dump_dest'; REM UNIX Variante: HOST find &&udump_path -mtime +&&trace_del -iname "*.trc" -exec rm {} \;; HOST find &&bdump_path -mtime +&&trace_del -iname "*.trc" -exec rm {} \;; REM Von unseren Unix_Benutzern verabschieden wir uns hier SELECT 1/DECODE('&&bs_version','unix',0,1) FROM dual; col trace_datum new_value trace_datum SELECT to_char(sysdate-&&trace_del,'MM-DD-YYYY') AS trace_datum FROM dual; REM Alte Trace-Dateien unter WINDOWS des BDUMP löschen HOST mkdir &&udump_path\old HOST XCOPY &&udump_path\*.trc &&udump_path\old /d:&&trace_datum HOST DEL /Q &&udump_path\*.trc HOST MOVE /Y &&udump_path\old\*.* &&udump_path HOST RMDIR /Q /S &&udump_path\old REM Alte Trace-Dateien unter Windows des UDUMP löschen HOST mkdir &&bdump_path\old HOST XCOPY &&bdump_path\*.trc &&bdump_path\old /d:&&trace_datum HOST DEL /Q &&bdump_path\*.trc HOST MOVE /Y &&bdump_path\old\*.* &&bdump_path HOST RMDIR /Q /S &&bdump_path\old --############################################################### -- ### SQL Plus beenden ######################################### --############################################################### EXIT