Linux管理指令碼之自動執行指令碼
在unix環境下,如何快速高效的工作。
首先,我們開始介紹,如何在unix下,建立一個可以與資料庫進行互動的指令碼。在unix下,很多時候,我們需要一個shell指令碼,通過這個指令碼,對資料庫進行操作。這是一個最基本的必備技能,後面我們會講到,在實際的運維中,我們需要經常使用這種方式,進行資料庫後臺作業。
我們先用一個最簡單的sample來講解一下,如何通過shell指令碼,來執行資料庫的sql,我們把這個sample指令碼叫做 run_sql.sh
dbmon01:/u01/oracle/alan> cat run_sql.sh
#!/usr/bin/sh
#!/usr/bin/sh
sqlplus /nolog <conn alan/alan ;
select sysdate from dual ;
exit ;
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
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>
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>
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 ; --此處,執行完命令後,退出。
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
#!/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/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
[1] 7261
[oracle@standbyDB backup]$
[1]+ Done nohup sh run_rman.sh > rman.log
[oracle@standbyDB backup]$ ll -ht
[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
[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>
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>
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- linux下rman增量備份指令碼以及指令碼自動執行Linux指令碼
- 使用php作linux自動執行指令碼PHPLinux指令碼
- LINUX 自動執行指令碼的命令配置Linux指令碼
- UNIX crontab自動執行指令碼指令碼
- windows自動登入linux 並執行指令碼WindowsLinux指令碼
- 啟動vi時自動執行的指令碼指令碼
- 開機自動執行python指令碼Python指令碼
- Linux(CentOS)啟動時自動執行指令碼(rc.local)LinuxCentOS指令碼
- 如何在 Linux 啟動時自動執行命令或指令碼Linux指令碼
- Linux自啟動指令碼Linux指令碼
- Linux後臺執行指令碼命令之nohupLinux指令碼
- Linux系統如何設定開機自動執行指令碼?Linux指令碼
- Linux配置開機自啟動執行指令碼方法有哪些?Linux指令碼
- Linux、UNIX設定開機自動執行命令、指令碼配置Linux指令碼
- Linux啟動/關機時執行指令碼Linux指令碼
- 在 Linux 命令列指令碼中執行 sudo 時自動輸入密碼Linux命令列指令碼密碼
- 如何在Docker容器啟動時自動執行指令碼Docker指令碼
- apache_weblogic自動生成可執行指令碼ApacheWeb指令碼
- 使用expect執行動態指令碼指令碼
- 自動ftp指令碼FTP指令碼
- 執行shell指令碼指令碼
- 指令碼執行方式指令碼
- linux開機自動啟動指令碼Linux指令碼
- RouterOS 限速指令碼和限執行緒指令碼ROS指令碼執行緒
- Linux 下oracle自啟動指令碼LinuxOracle指令碼
- Linux 定時執行指令碼、命令Linux指令碼
- Linux定時執行.sh指令碼Linux指令碼
- Linux 後臺執行 PHP 指令碼LinuxPHP指令碼
- linux 後臺執行sql指令碼LinuxSQL指令碼
- Linux下如何執行Shell指令碼Linux指令碼
- Linux管理指令碼之清理空間Linux指令碼
- 設定週期性自動執行備份指令碼指令碼
- Crontab自動執行指令碼Kill掉MySQL的僵死程式指令碼MySql
- specjvm自動化指令碼JVM指令碼
- 自動備份指令碼指令碼
- docker指令碼自動化Docker指令碼
- LNMP自動部署指令碼LNMP指令碼
- awr自動收集指令碼指令碼