Linux平台下監控Oracle資料庫效能

2021-04-12 17:26:26 字數 3023 閱讀 2691

在單一的應用環境或業務相對簡單的系統下, 系統效能問題, 瓶頸所在往往是不言自明, 解決問題的前提--定位問題是比較容易解決的, 但在乙個複雜的應用環境下, 各應用系統對系統資源往往是一種共享和競爭的關係, 而且應用系統之間也可能存在著共生或制約的關係, 資源利益的均衡往往是此消彼長, 而這種環境下的應用系統一旦出現資源競爭, 系統的瓶頸往往難以斷定, 甚至會發生不同應用設計人員之間互相推諉責任的扯皮現象。本文僅就此問題對linux平台下各應用系統對oracle資料庫的使用情況作一**。 oracle資料庫的tuning不是乙個可以一言以蔽的主題,本文無意概全,內容僅涉及問題的定位及各應用對資料庫資源的共享與競爭問題。

本文試驗及問題取證的環境:

redhat6.1 web server(apache1.3.9+php4.0)+client/server(pro*c)之server端

redhat6.2 + oracle8.1.6.1.0

redhat7.1 web server(apache1.3.20+php4.06) + oracle8.1.7.0.0

為方便問題的討論, 應用系統已做簡化, 競爭方僅包括乙個pro*c的daemon程式作為c/s模式的服務端, 和由apache+php所支援的web**業務。

首 先, 最簡單的情況莫過於單個sql語句的分析, sql語句的優化也是資料庫優化的乙個最直接最立竿見影的因素。sql語句的效能監控從監控工具來說大致可分為由高階語言提供和由oracle本身提供, 高階語言以典型的應用c 語言和web開發語言php為例, c語言中可以用gettimeofday函式來在某一資料庫操作之前和之後分別獲取乙個時間值, 將兩個時間值之差做為衡量該資料庫操作的效率, 在php中, 也可以用gettimeofday, 操作方法當然與c語言中有所不同。當然, php中也有其它一些函式可以達到同樣的時間精度, 關於時間精度的考慮, 不能簡單以大小衡量微秒級的時間數值, 因為時鐘中斷的時間間隔從根本上決定了時間計算所能達到的精度, 此外,作業系統本身對程序的時間片分配, 及程序切換的開銷等因素也在一定程度上影響時間資料的意義。所以, 以下時間的計算最理想的情況是對同一操作在盡可能避免快取的情況下進行多次的迴圈操作,取總的時間值加以平均, 從而得到比較接近真實情況的時間值。c語言的例子:   

#define tv_start 0

#define tv_end 1

int how_long(int cmd, char *res);

struct cmd_time;

void foo()

int how_long(int cmd, char *res)

/* return value: -1 error, 0 sucess , res: 20 bytes is enough */

else if(cmd == tv_end) else

}

return 0;

} else

}

下面是乙個php的例子(為簡化起見, 程式的錯誤檢查被忽略):

include "/how_long.inc";

how_long(tv_start, $timestr);

$conn = ocilogon("username", "password", "dblink");

$stmt = ociparse($conn, "select id from users where name='slimzhao'");

ocidefinebyname($stmt, id, $id);

ociexecute($stmt);

ocifetch($stmt);

ocifreestatement($stmt);

ocilogoff($conn);

how_long(tv_end, $timestr);

";

?>

其中how_long函式的php版本如下:

#耗費時間的字串, 該函式本身的開銷不計入其中.

define("tv_start", 0);

define("tv_end", 1);

function how_long($operation, &$str)

#返回值: 0--成功, -1--傳遞了非法的引數.

else if($operation == tv_end) else

} else

}

?>

上 面的資料庫操作開銷的計算僅限於對時間消耗的計算,對同時使用同一資料庫的其它應用軟體的影響,對磁碟操作的頻繁程度,資料庫操作所採取的具體策略等等因 素,都未考慮在內,高階語言也不可能提供這樣的參考資料。而資料庫本身提供的監測手段彌補了這一不足。最簡單的操作控制台:

sqlplus 

sql> set timing on

將為每次執行的資料庫操作進行計時, 精度為1/100秒, 筆者對該功能的使用中發現其時間的計算也有一定的偏差。而且時間偏差很大,嚴格說來,已不屬於誤差的範圍,該歸錯誤了,下面是乙個例子中得到的資料:

[bash$] cat tmp.sql

set timing on

host date;

select count(*) from users;

host date;

sql> @tmp.sql

wed dec 5 00:21:01 cst 2001

count(*)

----------

1243807

elapsed: 00:00:06.16

wed dec 5 00:21:05 cst 2001

從系統的時間差來看, 為4秒左右, 但oracle卻報告了6.16秒!

如果說oracle工具在時間計算上太差強人意的話,在sql語句的執行方案上可算是對sql語句如何執行的最權威的詮釋了。解讀這樣的資訊就需要對oracle內部對sql操作的過程有一定了解。

Linux平台下解除安裝ORACLE

實驗環境 作業系統版本 red hat enterprise linux server release 5.5 tikanga 資料庫版本 oracle database 10g enterprise edition release 10.2.0.1.0。解除安裝oracle 10g的過程,在不同平...

Linux平台下安裝MySQL

2.解壓 tar xvf mysql 6.6.13 1.rhel5.i386.tar 3.切換root使用者 su 4.安裝server 5.5 rpm ivh mysql server 5.5.13 1.rhel5.i386.rpm 5.更改密碼 usr bin mysqladmin u root...

Linux 平台下 PHP 安裝 啟動

php安裝 tar xzvf php 5.2.5.tar.gz cd php 5.2.5 configure prefix home redadmin php with apxs2 home redadmin apache bin apxs with mysql home redadmin mysq...