要实现对oracle的监控,首先要保证运行controler的机器能够连接上oracle数据库,所以需要安装oracle客户端。
首先需要配置监听的oracle数据库服务。下面是三种方法
1、安装一个完整的oralce(包括客户端和服务端),在界面易于操作
操作步骤如下
1.1)、安装一个oracle过程中会有一个监听程度建立,数据库安装完成后可以查查看监听程序是否存在如下操作
1.2)、打开Net Manger,确认已有一个监听程序,红色标识的内容中是安装服务的机器名称
1.3)添加监听服务
1.4) 输入一个名称如现在监控192.168.100.236,输服务名为L236,选择下一步
确认后,选择下一步
1.5) 输入要监控的数据库ip
输入完成后选择下一步
1.6 )输入数据库服务名称,后选择下一步
1.7) 此时可以进行测试,判断是否可以连接到所监控的数据库
1.8)选择测试出现
1.9) 选择更改登录输入正确的用户名和密码
1.10)输入完后,确认出现点击测试出现如下提示,连接测试成功信息
1.11)还可以用sqlplus确认,操作如下 1、sqlplus INPUT@L236. 其中L236上面设置的服务名称。2、数据INPUT用户密码后回车。进入sql。
单独安装客户端,直接配置tnsnames.ora文件
利用程序中oralce客户端文件直接看到配置
配置该文件
52LOADRUN =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.52)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = gtadb)
)
)
其中 52LOADRUN是监听数据库oracle的服务名称,可以自己命名, 192.168.0.52 和数据库服务名称需要根据实际内容输入。
利用安装目录文件修改直接修改添加,
在oracle安装目录下product\11.1.0\db_1\NETWORK\ADMIN 下 listener.ora文件是监听的配置。
tnsnames.ora 是上面操作听见服务的文件。经过第一个方法里面多了一个
L236 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 输入监听的服务器IP)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME =oracle服务名)
)
)
内容
如直接将上面内容修改为服务名为L237,或者修改HOST 和SERVICE_NAME 名称即可
L237 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST =输入监听的服务器IP)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = oracle服务名)
)
)
文件保存后,通过NET Manager
利用sqlplus 也确认成功
1、打开监控器,在Database Server Resource Graphs 图下双击Oracle,打开Oracle监视图
2、在该图上右键点击,然后点击Add Measurements,在随后出现的图上点击Add 按钮,添加要监控的数据库服务器
3、点击OK,然后在下图选择红色标识的Add 按钮
4、在这里输入用户名和密码。其中红色标识出来的内容是我们在添加Oracle服务中设置的服务名称。输入完成后,点击OK,就可以选择要监控的指标。
备注这里输入的用户应具有管理员权限,但这里不支持SYS这个管理员用户。
5上一步骤操作完后出现数据库指标,选择自己要添加的指标后
1.1 V$SYSSTAT常用指标
指标名称 |
指标描述 |
指标范围 |
指标单位 |
CPU used by this session |
所有session的cpu占用量,不包括后台进程 |
|
|
DB block changes(当前请求的块数目) |
当前模式块意思是在操作中正好提取的块数目,而不是在一致性读的情况下而产生的块数。正常的情况下,一个查询提取的块是在查询开始的那个时间点上存在的数据块,当前块是在这个时刻存在的数据块,而不是在这个时间点之前或者之后的数据块数目 |
它们三者之间的关系大致可概括为: |
|
Consistent Gets(一致读) |
数据请求总数在回滚段buffer中的数据一致性读所需要的数据块)这里的概念是在处理你这个操作的时候需要在一致性读状态上处理多少个块,这些块产生的主要原因是因为由于在你查询的过程中,由于其他会话对数据块进行操 作,而对所要查询的块有了修改,但是由于我们的查询是在这些修改之前调用的,所以需要对回滚段中的数据块的前映像进行查询,以保证数据的一致性。这样就产 生了一致性读。 |
||
Physical reads(物理读) |
OS blocks read数,包括插入到sga缓存区物理读以及PGA中的直接读这项统计并非I/O请求书 产生物理读主要原因是1)在数据库高速缓存中不存在这些块;2)全表扫描;3)磁盘排序 |
||
Physical writes |
从SGA缓存区被DBWR写到磁盘的数据块以及PGA进程直写的数据块数量 |
|
|
Exectute count |
执行的sql语句数量 |
|
|
Logons current |
当前连接到实例的session,如果当前有两个快照则取平均值 |
|
|
Logons cumulative |
自实例启动后总的登陆次数 |
|
|
Parse count(hard) |
在shared pool中解析调用的未命中次数。当sql语句执行并且该语句不在shard pool或虽然在shared pool但因为两者存在部分差异而不能被使用时产生硬解析。如果一条sql语句原文与当前存在的相同,但查询表不同则认为他们是两条不同的语句,则硬解析即会发生。硬解析会带来cpu和资源使用的高昂开销,因为它需要oracle在shared pool中重新分配内存,然后再确定执行计划,最终语句才会被执行 |
|
|
Parse count(total) |
解析调用总数,包括软解析和硬解析。当session执行了一条sql语句,该语句已经存在于shared pool并且可以被使用则产生软解析。当语句被使用(即共享)所有数据相关的现有sql语句(如最优化的执行计划)必须同样用于当前的声明。 |
|
|
Parse time cpu |
总cpu解析时间(单位10ms)。包括应解析和软解析 |
|
|
Parse time elapsed |
完成解析调用的总时间花费 |
|
|
Redo log space requests |
在redo logs 中服务进程的等待空间,表示需要更长时间的log switch |
|
|
Redo size |
Redo 发生的总次数(以及因此写入的log buffer),以byte为单位。这项统计显示出update活跃性 |
|
|
Session logical reads |
逻辑读请求数 |
|
|
Sort(memory) Sort(disk) |
1、Sort(memory)适于在sort_area_size(不需要在磁盘进行排序)的排序操作的数量。 2、Sort(disk)则是由于排序所需空间太大,sort_area_size 不能满足而不得不在磁盘进行排序操作的数量。 3、这两项统计通常用于计算in-memory sort ratio该项显示内存中完全的排序所占比例。理想状态下,在OLTP系统中,大部分排序不仅小且能够完全在内存里完成排序。公式为 Sort(memory)/( Sort(memory)+Sort(disk))
|
|
|
1.2 名词解释
1.2.1 SGA
系统全局区又称SGA (System Global Area)是Oracle Instance的 基本组成部分,在实例启动时分配。是一组包含一个Oracle实例的数据和控制信息的共享内存结构。主要是用于存储数据库信息的内存区,该信息为数据库进程所共享。它包含Oracle 服务器的数据和控制信息,它是在Oracle服务器所驻留的计算机的实际内存中得以分配,如果实际内存不够再往虚拟内存中写。
组成
SGA主要由数据高速缓冲区(Database Buffer Cache)、共享池(Shared Pool)、重做日志缓冲区(Redo Log Cache)、大型池(Large Pool)、Java池(Java Pool)、流池(Streams Pool)和其他结构(如固定SGA、锁管理等)组成。
1.2.2 PGA:
(Program Global Areas,程序全局区)此区域包含单个服务器进程或单个后台进程的数据和控制信息,与几个进程共享的SGA 正相反。PGA 是只被一个进程使用的私有区域。PGA 在创建进程时分配,在终止进程时回收
2.1添加自定义指标方法
更改了在dat文件夹下的vmon.cfg文件,添加了自定义计数器
--------------------------------------------------------------------------------
在vmon.cfg文件中:
[V$ Monitor]
Counters=150
;CustomCounters=12
;How many seconds for each data sample?
SamplingRate=1
需要去掉第三行前面的分号,自定义的计数器就可以显示出来了
2.2常用自定义指标
3.1 v$sql视图
在V$sql中保存共享缓存池的sql语句,如利用select * from V$sql先执行一次查询
再利用具体的sql内容查询V$sql中的内容,让大家知道如何使用V$sql视图
SQL_TEXT:SQL文本的前1000个字符
sql_fulltext:完整的sql语句内容
SHARABLE_MEM:占用的共享内存大小(单位:byte)
PERSISTENT_MEM:生命期内的固定内存大小(单位:byte)
RUNTIME_MEM:执行期内的固定内存大小
SORTS:完成的排序数
LOADED_VERSIONS:显示上下文堆是否载入,1是0否
OPEN_VERSIONS:显示子游标是否被锁,1是0否
USERS_OPENING:执行语句的用户数
FETCHES:SQL语句的fetch数。
EXECUTIONS:自它被载入缓存库后的执行次数
USERS_EXECUTING:执行语句的用户数
LOADS:对象被载入过的次数
FIRST_LOAD_TIME:初次载入时间
INVALIDATIONS:无效的次数
PARSE_CALLS:解析调用次数
DISK_READS:读磁盘次数
BUFFER_GETS:读缓存区次数
ROWS_PROCESSED:解析SQL语句返回的总列数
COMMAND_TYPE:命令类型代号
OPTIMIZER_MODE:SQL语句的优化器模型
OPTIMIZER_COST:优化器给出的本次查询成本
PARSING_USER_ID:第一个解析的用户ID
PARSING_SCHEMA_ID:第一个解析的计划ID
KEPT_VERSIONS:指出是否当前子游标被使用DBMS_SHARED_POOL包标记为常驻内存
ADDRESS:当前游标父句柄地址
TYPE_CHK_HEAP:当前堆类型检查说明
HASH_VALUE:缓存库中父语句的Hash值
PLAN_HASH_VALUE:数值表示的执行计划。
CHILD_NUMBER:子游标数量
MODULE:在第一次解析这条语句是通过调用DBMS_APPLICATION_INFO.SET_MODULE设置的模块名称。
ACTION:在第一次解析这条语句是通过调用DBMS_APPLICATION_INFO.SET_ACTION设置的动作名称。
SERIALIZABLE_ABORTS:事务未能序列化次数
OUTLINE_CATEGORY:如果outline在解释cursor期间被应用,那么本列将显示出outline各类,否则本列为空
CPU_TIME:解析/执行/取得等CPU使用时间(单位,毫秒)
ELAPSED_TIME:解析/执行/取得等消耗时间(单位,毫秒)
OUTLINE_SID:outline session标识
CHILD_ADDRESS:子游标地址
SQLTYPE:指出当前语句使用的SQL语言版本
REMOTE:指出是否游标是一个远程映象(Y/N)
OBJECT_STATUS:对象状态(VALID or INVALID)
IS_OBSOLETE:当子游标的数量太多的时候,指出游标是否被废弃(Y/N)
3.2 V$SESSION视图
V$SESSION是基础信息视图,用于找寻用户 SID或 SADDR。视图中,每一个连接到数据库实例中的 session都拥有一条记录。包括用户 session及后台进程如 DBWR, LGWR, arcchiver等等。
V$SESSION中的常用列
V$SESSION是基础信息视图,用于找寻用户 SID或 SADDR。不过,它也有一些列会动态的变化,可用于检查用户。如例:
SQL_HASH_VALUE, SQL_ADDRESS:这两列用于鉴别默认被 session执行的 SQL语句。如果为 null或 0,那就说明这个 session没有执行任何 SQL语句。 PREV_HASH_VALUE和 PREV_ADDRESS两列用来鉴别被 session执行的上一条语句。
STATUS:这列用来判断 session状态是:
Achtive:正执行 SQL语句 (waiting for/using a resource)
Inactive:等待操作 (即等待需要执行的 SQL语句 )
Killed:被标注为删除
下列各列提供 session的信息,可被用于当一个或多个 combination未知时找到 session。
Session信息
SID: SESSION标识,常用于连接其它列
SERIAL#:如果某个 SID又被其它的 session使用的话则此数值自增加 (当一个 SESSION结束,另一个 SESSION开始并使用了同一个 SID)。
AUDSID:审查 session ID唯一性,确认它通常也用于当寻找并行查询模式
USERNAME:当前 session在 oracle中的用户名。
Client信息
数据库 session被一个运行在数据库服务器上或从中间服务器甚至桌面通过 SQL*Net连接到数据库的客户端进程启动,下列各列提供这个客户端的信息
OSUSER:客户端操作系统用户名
MACHINE:客户端执行的机器
TERMINAL:客户端运行的终端
PROCESS:客户端进程的 ID
PROGRAM:客户端执行的客户端程序
要显示用户所连接 PC的 TERMINAL、 OSUSER,需在该 PC的 ORACLE.INI或 Windows中设
详细字段解释:
SADDR: session address
SID: session identifier,常用于连接其它列。
SERIAL#: sid 会重用,但是同一个sid被重用时,serial#会增加,不会重复。
AUDSID: audit session id。可以通过audsid查询当前session的sid。select sid from v$session where audsid=userenv('sessionid');
PADDR: process address,关联v$process的addr字段,可以通过这个字段查处当前session对应操作系统的那个进程的id。
USER#: session's user id。等于dba_users中的user_id。Oracle内部进程的user#为0。
USERNAME: session's username。等于dba_users中的username。Oracle内部进程的username为空。
COMMAND: session正在执行的SQL Id。1代表create table,3代表select。
TADDR: 当前的transaction address。可以用来关联v$transaction的addr字段。
LOCKWAIT: 可以通过这个字段查询出当前正在等待的锁的相关信息。sid & lockwait与v$lock中的sid & kaddr相对应。
STATUS: 用来判断session状态。Active:正执行SQL语句。Inactive:等待操作。Killed:被标注为删除。
SERVER: server type (dedicated or shared)
SCHEMA#: schema user id。Oracle内部进程的schema#为0。
SCHEMANAME: schema username。Oracle内部进程的schemaname为sys。
OSUSER: 客户端操作系统用户名。
PROCESS: 客户端process id。
MACHINE: 客户端machine name。
TERMINAL: 客户端执行的terminal name。
PROGRAM: 客户端应用程序。比如ORACLE.EXE (PMON)或者sqlplus.exe
TYPE: session type (background or user)
SQL_ADDRESS, SQL_HASH_VALUE, SQL_ID, SQL_CHILD_NUMBER: session正在执行的sql statement,和v$sql中的address, hash_value, sql_id, child_number相对应。
PREV_SQL_ADDR, PREV_HASH_VALUE, PREV_SQL_ID, PREV_CHILD_NUMBER: 上一次执行的sql statement。
MODULE, MODULE_HASH, ACTION, ACTION_HASH, CLIENT_INFO: 应用通过DBMS_APPLICATION_INFO设置的一些信息。
FIXED_TABLE_SEQUENCE: 当session完成一个user call后就会增加的一个数值,也就是说,如果session inactive,它就不会增加。因此可以根据此字段的值变化来监控某个时间点以来的session的性能情况。例如,一个小时以前,某个session的FIXED_TABLE_SEQUENCE是10000,而现在是20000,则表明一个小时内其user call比较频繁,可以重点关注此session的performance statistics。
ROW_WAIT_OBJ#: 被锁定行所在table的object_id。和dba_objects中的object_id关联可以得到被锁定的table name。
ROW_WAIT_FILE#: 被锁定行所在的datafile id。和v$datafile中的file#关联可以得到datafile name。
ROW_WAIT_BLOCK#: Identifier for the block containing the row specified in ROW_WAIT_ROW#
ROW_WAIT_ROW#: session当前正在等待的被锁定的行。
LOGON_TIME: session logon time
示例:
1.查找你的 session信息
SELECT SID, OSUSER, USERNAME, MACHINE, PROCESS
FROM V$SESSION WHERE audsid = userenv( 'SESSIONID' );
2.当 machine已知的情况下查找 session
SELECT SID, OSUSER, USERNAME, MACHINE, TERMINAL
FROM V$SESSION
WHERE terminal = 'pts/tl' AND machine = 'rgmdbs1' ;
3.查找当前被某个指定 session正在运行的 sql语句。假设 sessionID为 100
select b.sql_text
from v$session a,v$sqlarea b
where a.sql_hashvalue=b. hash_value and a.sid= 1 00
或者
select b.sql_text
from v$session a,v$sqlarea b //v$sqlarea 只包括sql的1000个字符,V$SQLTEXT is all
where a.sql_hash_value = b.HASH_VALUE and a.TERMINAL = 'BackHam';//BackHam is my computer name
寻找被指定 session执行的 SQL语句是一个公共需求,如果 session是瓶颈的主要原因,那根据其当前在执行的语句可以查看 session在做些什么。