Linux/Unix shell指令碼中調用或執行SQL,RMAN 等為自動化作業以及多次反覆執行提供了極大的便利,因此通過Linux/Unix shell來完成Oracle
的相關工作,也是DBA必不可少的技能之一。本文針對Linux/Unix shell指令碼調用sql, rman 指令碼給出了相關樣本。
一、由shell指令碼調用sql,rman指令碼
1、shell指令碼調用sql指令碼#首先編輯sql檔案oracle@SZDB:~> more dept.sqlconnect scott/tigerspool /tmp/dept.lstset linesize 100 pagesize 80select * from dept;spool off;exit;#編輯shell指令檔,在shell指令碼內調用sql指令碼oracle@SZDB:~> more get_dept.sh#!/bin/bash# set environment variableif [ -f ~/.bashrc ]; then . ~/.bashrcfiexport ORACLE_SID=CNMMBOsqlplus -S /nolog @/users/oracle/dept.sql #注意此處執行sql指令碼的方法 -S 表示以靜默方式執行exit#授予指令碼執行許可權oracle@SZDB:~> chmod 775 get_dept.sh-->執行shell指令碼oracle@SZDB:~> ./get_dept.sh DEPTNO DNAME LOC---------- -------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON2、shell指令碼調用rman指令碼#首先編輯RMAN指令碼oracle@SZDB:~> more rman.rcvRUN {CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;CONFIGURE BACKUP OPTIMIZATION ON;CONFIGURE CONTROLFILE AUTOBACKUP ON;CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/users/oracle/bak/%d_%F';ALLOCATE CHANNEL CH1 TYPE DISK MAXPIECESIZE=4G;ALLOCATE CHANNEL CH2 TYPE DISK MAXPIECESIZE=4G;SET LIMIT CHANNEL CH1 READRATE=10240;SET LIMIT CHANNEL CH1 KBYTES=4096000;SET LIMIT CHANNEL CH2 READRATE=10240;SET LIMIT CHANNEL CH2 KBYTES=4096000;CROSSCHECK ARCHIVELOG ALL;DELETE NOPROMPT EXPIRED ARCHIVELOG ALL;BACKUP DATABASE FORMAT '/users/oracle/bak/%d_FULL__%U';SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT';BACKUP ARCHIVELOG ALL FORMAT '/users/oracle/bak/%d_LF_%U' DELETE INPUT;DELETE NOPROMPT OBSOLETE;RELEASE CHANNEL CH1;RELEASE CHANNEL CH2;}#編輯shell指令檔,在shell指令碼內調用rman指令碼oracle@SZDB:~> more rman_bak.sh#!/bin/bash# set environment variableif [ -f ~/.bashrc ]; then . ~/.bashrcfiexport ORACLE_SID=CNMMBO$ORACLE_HOME/bin/rman target / cmdfile=/users/oracle/rman.rcv log=/users/oracle/bak/rman.logexit#授予指令碼執行許可權oracle@SZDB:~> chmod 775 rman_bak.sh#執行shell指令碼oracle@SZDB:~> ./rman_bak.sh
二、嵌入sql語句及rman到shell指令碼
1、直接將sql語句嵌入到shell指令碼oracle@SZDB:~> more get_dept_2.sh#!/bin/bash# Author : Robinson Cheng # Blog : http://blog.csdn.net/robinson_0612# set environment variableif [ -f ~/.bashrc ]; then . ~/.bashrcfiexport ORACLE_SID=CNMMBOsqlplus -S /nolog <<EOF #EOF在此表示當輸入過程中碰到EOF後,整個sql指令碼輸入完畢connect scott/tigerspool /tmp/dept.lstset linesize 100 pagesize 80select * from dept;spool off;exit; #退出sqlplus 環境EOFexit #推出shell指令碼 #授予指令碼執行許可權oracle@SZDB:~> chmod u+x get_dept_2.sh#執行shell指令碼oracle@SZDB:~> ./get_dept_2.sh DEPTNO DNAME LOC---------- -------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON2、直接將sql語句嵌入到shell指令碼(方式二,使用管道符號>代替spool來輸出日誌)oracle@SZDB:~> more get_dept_3.sh#!/bin/bash# set environment variableif [ -f ~/.bashrc ]; then . ~/.bashrcfiexport ORACLE_SID=CNMMBOsqlplus -S /nolog 1>/users/oracle/dept.log 2>&1 <<EOFconnect scott/tigerset linesize 80 pagesize 80select * from dept;exit;EOFcat /users/oracle/dept.logexit#另一種實現方式,將所有的sql語句輸出來產生sql指令碼後再調用oracle@SZDB:~> more get_dept_4.sh#!/bin/bash# set environment variableif [ -f ~/.bashrc ]; then . ~/.bashrcfiexport ORACLE_SID=CNMMBOecho "conn scott/tiger select * from dept;exit;" >/users/oracle/get_dept.sqlsqlplus -silent /nolog @get_dept.sql 1>/users/oracle/get_dept.log 2>&1cat get_dept.logexit3、將rman指令碼嵌入到shell指令碼oracle@SZDB:~> more rman_bak_2.sh#!/bin/bash# set environment variableif [ -f ~/.bashrc ]; then . ~/.bashrcfiexport ORACLE_SID=CNMMBO$ORACLE_HOME/bin/rman log=/users/oracle/bak/rman.log <<EOFconnect target /RUN {CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;CONFIGURE BACKUP OPTIMIZATION ON;CONFIGURE CONTROLFILE AUTOBACKUP ON;CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/users/oracle/bak/%d_%F';ALLOCATE CHANNEL CH1 TYPE DISK MAXPIECESIZE=4G;ALLOCATE CHANNEL CH2 TYPE DISK MAXPIECESIZE=4G;SET LIMIT CHANNEL CH1 READRATE=10240;SET LIMIT CHANNEL CH1 KBYTES=4096000;SET LIMIT CHANNEL CH2 READRATE=10240;SET LIMIT CHANNEL CH2 KBYTES=4096000;CROSSCHECK ARCHIVELOG ALL;DELETE NOPROMPT EXPIRED ARCHIVELOG ALL;BACKUP DATABASE FORMAT '/users/oracle/bak/%d_FULL__%U';SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT';BACKUP ARCHIVELOG ALL FORMAT '/users/oracle/bak/%d_LF_%U' DELETE INPUT;DELETE NOPROMPT OBSOLETE;RELEASE CHANNEL CH1;RELEASE CHANNEL CH2;}EXIT;EOFexit #授予指令碼執行許可權oracle@SZDB:~> chmod u+x rman_bak_2.sh #執行shell指令碼 oracle@SZDB:~> ./rman_bak_2.shRMAN> RMAN> 2> 3> 4> 5> 6> 7> 8> 9> 10> 11> 12> 13> 14> 15> 16> 17> 18> 19> 20> 21> RMAN> oracle@SZDB:~>
三、更多參考
有關基於使用者管理的備份和備份恢複的概念請參考
Oracle 冷備份
Oracle 熱備份
Oracle 備份恢複概念
Oracle 執行個體恢複
Oracle 基於使用者管理恢複的處理(詳細描述了介質恢複及其處理)
SYSTEM 資料表空間管理及備份恢複
SYSAUX資料表空間管理及恢複
Oracle 基於備份控制檔案的恢複(unsing backup controlfile)
有關RMAN的備份恢複與管理請參考
RMAN 概述及其體繫結構
RMAN 配置、監控與管理
RMAN 備份詳解
RMAN 還原與恢複
RMAN catalog 的建立和使用
基於catalog 建立RMAN儲存指令碼
基於catalog 的RMAN 備份與恢複
RMAN 備份路徑困惑(使用plus archivelog時)
有關ORACLE體繫結構請參考
Oracle 資料表空間與資料檔案
Oracle 密碼檔案
Oracle 參數檔案
Oracle 聯機重做記錄檔(ONLINE LOG FILE)
Oracle 控制檔案(CONTROLFILE)
Oracle 歸檔日誌
Oracle 復原(ROLLBACK)和撤銷(UNDO)
Oracle 資料庫執行個體啟動關閉過程
Oracle 10g SGA 的自動化管理
Oracle 執行個體和Oracle資料庫(Oracle體繫結構)