Linux管理指令碼之自動執行指令碼

ygzhou518發表於2011-12-16
在unix環境下,如何快速高效的工作。
      首先,我們開始介紹,如何在unix下,建立一個可以與資料庫進行互動的指令碼。在unix下,很多時候,我們需要一個shell指令碼,通過這個指令碼,對資料庫進行操作。這是一個最基本的必備技能,後面我們會講到,在實際的運維中,我們需要經常使用這種方式,進行資料庫後臺作業。
     
      我們先用一個最簡單的sample來講解一下,如何通過shell指令碼,來執行資料庫的sql,我們把這個sample指令碼叫做 run_sql.sh
 
dbmon01:/u01/oracle/alan> cat run_sql.sh
#!/usr/bin/sh
sqlplus /nolog <conn alan/alan ;
select sysdate from dual ;
exit ;
 
      這就是一個最簡單的run_sql.sh,我們可以實際執行一下,看看效果是什麼樣的
dbmon01:/u01/oracle/alan> id
uid=201(oracle) gid=106(dba)
dbmon01:/u01/oracle/alan>
dbmon01:/u01/oracle/alan> sh run_sql.sh
SQL*Plus: Release 10.2.0.4.0 - Production on Wed Mar 31 12:57:00 2010
Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.
SQL> Connected.
SQL>
SYSDATE
------------
31-MAR-10
SQL> Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
dbmon01:/u01/oracle/alan>
      通過結果我們看到,指令碼里的sql命令,被準確的執行了。這裡,我們需要注意一點,我首先用id命令確認了當前的使用者身份呢,為什麼要這麼做呢,因為在shell指令碼里面,所有的命令,都要依賴環境變數的,在run_sql這個指令碼里面,用到了sqlplus命令,如果環境變數中沒有這個命令的路徑的話,這個指令碼是不能執行成功的,會報錯,告訴你命令不存在。遇到這種情況,有兩種辦法,一種是把命令寫成絕對路徑的命令,另一種,就是在指令碼里定義環境變數。
      OK,瞭解了以上注意點後,下面我們來逐行講解這個簡單的指令碼。
#!/usr/bin/sh                   --這一行,是指令碼的提示行,告訴系統,這個指令碼的命令,是用sh編寫的
sqlplus /nolog <--這一行,呼叫sqlplus命令,使用/nolog的方式 ,<
conn alan/alan ;                  --這一行,是在sqlplus中進行使用者連線。
select sysdate from dual ;    
--這一行,是實際需要執行的命令。
exit ;                                 --此處,執行完命令後,退出。
      經過分解,這個最簡單的shell script就完全清晰了。這個時候,如果你需要執行其他任何資料庫內的sql,都可以在這個sample裡進行替換,就可以達到目的了。
 
      以上,就是本章的第一部分,學會建立一個簡單的,可以與資料庫互動的shell指令碼。接下來,我們來學習一下,如何在後臺執行指令碼。可能有人要問了,為什麼要後臺執行呢,後臺執行的好處是什麼。其實,在實際運維中,有許多工作是需要耗費時間的,比如說,最簡單的,有個新的資料庫建好了,要建立表空間,一共有1000個裸裝置,需要新增到資料庫中去,這時候,如果你手工去執行,將會浪費大量的時間。這時候,我們就需要將工作指令碼化,後臺化,將我們自己寶貴的時間節約出來。
      就用這個做例子吧,假設我們1000個裸裝置需要新增,於是,我們把指令碼修改成這樣:
 
dbmon01:/u01/oracle/alan> cat add_tbs.sh
#!/usr/bin/sh
sqlplus /nolog <conn alan/alan ;
alter tablespace data1 add datafile '/dev/rvg1.dbf' size 16000m autoextend off ;
......
alter tablespace data1 add datafile '/dev/rvg2.dbf' size 16000m autoextend off ;
exit ;
       怎麼樣,是不是替換起來很簡單,指令碼建立完成後,我們預估一下時間,假設需要2個小時,如果我們使用sh add_tbs.sh執行的話,我們就必須守在電腦旁邊,還要保證電腦跟伺服器的連線不能斷,否則處理異常會更麻煩。怎麼辦呢,這時候,我們就可以使用後臺命令了:
[oracle@standbyDB backup]$ nohup sh run_rman.sh >rman.log &
[1] 7261
[oracle@standbyDB backup]$
[1]+  Done                    nohup sh run_rman.sh > rman.log
[oracle@standbyDB backup]$ ll -ht
        這個命令什麼意思呢,nohup的意思是不掛起(no hang up),就是說將命令放到後臺執行,與你當前的連線沒有關係,而要是我們想知道命令的執行結果呢,這裡,就出現了定向符 ">",它的意思就是將執行結果,輸出到add_tbs.out這個檔案中去,命令結尾的&,就代表後臺無中斷執行的意思。
       這樣,我們只需要對add_tbs.out這個檔案進行檢查就可以了,出去喝個茶,看個書,過一會回來看看執行的日誌檔案,就能夠輕鬆掌握了。
       實時檢視add_tbs.out這個檔案,可以用tail -f add_tbs.out這個命令來實現,具體的使用,大家實際測試一把就清楚了。
 
        如果僅僅想測試一下nohup這個功能,也可以用run_sql.sh來進行測試,如下:
dbmon01:/u01/oracle/alan> nohup run_sql.sh > run_sql.out &
[1]     27782
dbmon01:/u01/oracle/alan>
[1] +  Done                       nohup run_sql.sh > run_sql.out &
dbmon01:/u01/oracle/alan>
dbmon01:/u01/oracle/alan> more run_sql.out
SQL*Plus: Release 10.2.0.4.0 - Production on Wed Mar 31 13:31:41 2010
Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.
SQL> Connected.
SQL>
SYSDATE
------------
31-MAR-10
SQL> Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
dbmon01:/u01/oracle/alan>
   當然,使用這個方式的時候,有個注意點,你要執行的sh檔案,必須具有可執行許可權,如果你沒有對應許可權的話,在執行的時候,會有“Permission denied”的錯誤提示,指令碼也無法正常執行。你可以使用chmod將執行許可權賦予對應的檔案。
 
   OK,本章的內容,基本就結束了,在這一章節裡,我們講了,如何建立一個簡單的,可以與資料庫互動的shell指令碼,同時,如何在資料庫後臺對這些指令碼進行呼叫等等。這是DBA工作的一項基本技能,很多時候會用到,所以,一定要掌握好。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24867586/viewspace-713455/,如需轉載,請註明出處,否則將追究法律責任。

相關文章