januschow826
作者januschow826·2014-08-17 17:16
数据库管理员·CP

DB2监控工具

字数 10350阅读 2360评论 0赞 0
1.监控工具:
    快照监视器(snapshot monitor):  特定时刻数据库活动的信息。返回的数据量由监控器开关决定,这些开关在DBM配置文件或会话级别设置。会有额外的性能影响。快照监视器数据是收集和存放在内存中(DBM的mon_heap_sz参数)
    事件监视器(event monitor):     记录DB2数据库一段时间内的数据活动。允许收集一段时间内的信息包括死锁,链接,SQL语句。可能产生大的数据量,对系统影响比较大。
    db2pd:                 用户收集DB2实例和数据库的统计信息。包括数据库事务,表空间,表统计信息,动态SQL,数据库配置等。可将结果保存文件中。不需要获取DB2内部锁(latches)和到数据库的连接。
    db2mtrk:             用于查看实例,数据库,代理进程当前对内存的使用情况。

2.快照监视器:
    数据库管理器级别,通过修改DBM参数设置监控监视器开关: db2 get dbm cfg |grep dft_mon  / db2 update dbm cfg using DFT_MON_TIMESTAMP off
    每个连接到数据库的应用程序(会话)都有自己的监视器开关,与DBM和其他无关。会话连接数据库时,继承DBM的监视器开关设置:db2 get monitor switches  /  db2 update monitor switches using lock on
    通过执行命令db2 get snapshot for locks/db/applications/tables/tablspaces/bufferpools/dynamic sql on sample >snap.out 或调用db2GetSnapshot() API得到快照
          db2 get snapshot for application agentid (appication-handle) |grep -i id  获取应用的详细信息,进程号等
    重置计数器,将所有监视器的计数器归零:reset monitor for db sample 或者reset monitor all
    利用表函数得到快照,必须连接数据库。使用表函数发出SQL查询,返回一张监视器数据表。每列代表一个监视器元素,每行代表正在被监控的数据对象:select * from table((表函数)([DB名称],[分区号])) as [结果集名称]
        db2 "select * from table(snapshot_table('sample',-1)) as T"
        db2 "select * from table(snapshot_lock(cast(null as char),-1)) as lock_info"
    快照表函数有2个输入参数,varchar(255)用于数据库名称,输入null表示当前已链接数据库。smallint用于分区号,-1或null表示当前已连接分区,-2表示捕获全局分区。
    性能管理视图(都属于sysibmadm模式):
                    applications 数据库运行的应用,        log_utilization   日志利用率的信息
                    bp_hitratio 缓冲池命中率,         log_running_sql    执行时间最长的SQL
                    bp_read_io/bp_write_io 缓冲池读写信息等    snapbp           缓冲池的基本信息
                    container_utilization  表空间容器利用率    snaptab          表的信息
                    locks_held  当前锁的信息            tbsp_utilization  表空间利用率信息
                    lockwaits   锁等待的信息            top_dynamic_sql   资源消耗最多的SQL
    1.监控案例:db2 get snapshot for all on sample > snap.out
    识别是否存在死锁:    grep -n "Deadlocks detected" snap.out | grep -v "= 0" | more
    执行最频繁的语句:    grep -n "Number of executions" snap.out |grep -v "= 0" |sort -rn -k 5 |more
    读取行数最多的语句:grep -n "Rows read" snap.out |grep -v "= 0" |sort -rn -k 4 | more
    总执行时间最长:    grep -n "Total execution time " snap.out | grep -v "= 0" |sort -rn -k 5| more
    显示语句文本:    grep -n "Statement text" snap.out |more

    2.监控案例(表函数)
    先连接数据库:db2 connect to sample
    执行查询:   db2 "select snapshot_timestamp,table_name,rows_written,rows_read from table(snapshot_table('sample',-1)) as T"
    创建一个或多个表保存监视器的数据:
        db2 "create table instance_snap(snap_time timestamp not null,local_cons bigint,rem_cons bigint)"
        db2 "insert into instance_snap select snapshot_timestamp,local_cons,rem_cons_in from table(snapshot_dbm(-1)) as snapshot_dbm"
        db2 "select * from instance_snap"
    3.snapshot管理视图
    便于snapshot监视器结果的分析和统计,实例监控开关需要打开。

    执行时间最长的20条语句:
        db2 "select ROWS_READ/(NUM_EXECUTIONS+1) as AVG_ROWS_READ,ROWS_WRITTEN/(NUM_EXECUTIONS+1) as AVG_ROWS_WRITTEN,STMT_SORTS/(NUM_EXECUTIONS+1) as AVG_SORTS,TOTAL_EXEC_TIME/(NUM_EXECUTIONS+1) as AVG_EXEC_TIME,substr(STMT_TEXT,1,200) as SQL_STMT from sysibmadm.snapdyn_sql order by AVG_EXEC_TIME desc fetch first 20 rows only"
    排序最多的20条语句:
    db2 "select STMT_SORTS/(NUM_EXECUTIONS+1) as AVG_SORTS,TOTAL_EXEC_TIME/(NUM_EXECUTIONS+1) as AVG_EXEC_TIME,substr(STMT_TEXT,1,200) as SQL_STMT from sysibmadm.snapdyn_sql order by AVG_SORTS desc fetch first 20 rows only"

3.db2pd
    db2pd监控各种DB2数据库活动的监控工具。交互执行,且运行非常快,不需要获取任何锁。不需要建立到数据库的连接。
    显示DB2的版本和当前操作系统的信息: db2pd -version -osinfo
    检测动态SQL语句的内容和当前隔离级别:db2pd -d sample -dynamic
    显示系统中静态语句包的信息:          db2pd -d sample -static                  (可以估算被调用次数最多的静态存储过程)
    检测存在锁等待的表:          db2pd -d sample -locks wait showlocks    得到存在锁等待的表空间ID和表ID号,Sts列G(granted)表示此事务拥有type锁,W表示事务等待。Owner列显示锁的所有者。
                      select tabschema,tabname from syscat.tables where tbspaceid = 2 and tableid =6   确定存在锁等待的schema和表名
                      db2pd -d sample -transactions          将事务映射到应用程序。AppHandl对应TranHdl,db2 list applications可以查看到所对应的连接
    显示应用程序和相应代理信息:          db2pd -agents                (可以将代理线程与应用程序对应起来)
    输出EDU列别奥    :          db2pd -edus (interval=3)
    显示缓冲池信息,命中率:          db2pd -d sample -bufferpool        (需要打开bufferpool监控器开关)
    检测系统日志的使用情况:          db2pd -d sample -logs
    tcb表状态信息:              db2pd -d sample -tcbstats        (包含被访问过的表的信息)
    通常调用一次db2pd带多个选项:      db2pd -d sample -locks wait showlocks -transactions -agents -applications -dynamic -file db2pd.out  -repat 15 40(每隔15秒执行一次,共执行40次)

4.db2top
    在多分区数据库系统,使用db2top需要特别谨慎。对于多分区的数据库做全局快照需要很大内存空间,对系统性能有影响。

左上角:最近一次快照的时间;refresh:每隔多少秒一次快照,可以在命令行用-i指定;右边括号表示系统捕获快照所耗时间
下一行:当前的运行规则。d表示delta;a表示active,显示活动变化的数值;e表示扩展显示;p表示分区,all所有分区,cur当前分区,数字表示指定分区。
右上角:操作系统类型,当前监视的分区,实例和数据库名。
功能键:k键,切换d=y/n; /键,进入搜索功能;
              Z/z键,升序/降序排列,从0列开始;
              L键+哈希值,指定SQL语句;
              x键,找到当前语句的访问计划(sqllib/misc/explain.ddl已经执行过)。
子窗口:
        d:数据库
        t:表空间
        D:动态SQL
        l:应用程序
        b:缓冲池
        U:锁
        T:表    --可以显示每个表的大小
    
5.事件监视器:(未被广泛运用,会产生非常大的文件)
    事件监视器记录某事件(Event)或转变(Transition)出现时某段时间内数据库活动情况。事件监视器类似其他数据库对象,它由SQL DDL语句创建的。可以像快照监视器开关那样打开和关闭。
    创建事件监视器时,必须先声明被监视事件的类型。当事件发生时,相应事件记录被记录下来。database,tables,deadlocks,tablespaces,connections,statements,transactions。
    事件监视器的输出放在目录或者命名管道中,或者表中。
    事件监视器创建方法: 1.创建一个SQL event monitor,写入文件:db2 create event monitor SQLCOST for deadlocks,statements write to file '/db2db/event' (write to table)
             2.激活||取消激活事件监视器:        db2 "set event monitor SQLCOST state =1 "    ||   db2 "set event monitor SQLCOST state =0 "
             3.使用db2evmon工具格式化原始数据:        db2evmon -db sample -evm SQLCOST > sqltrace.txt
    db2 list tables for all |grep -i stmt,找到输出表,分析输出:
    1.按照执行时间降序排列执行时间最长的SQL语句:
        db2 "select stmt_text,(stop_time-start_time) ExecutionTime  from stmt_sql_trace where stmt_operation not in (7,8,9,19) order by decimal(ExecutionTime) desc fetch first 10 rows only"
    2.按照执行频率降序排列执行次数最多的SQL语句:
        db2 "select distinct(stmt_text),count(*) Count  from stmt_sql_trace where stmt_operation not in (7,8,9,19) group by stmt_text order by count(*) desc fetch first 10 rows only"
    3.按照CPU时间降序排列最耗CPU时间的SQL语句:
        db2 "select stmt_text,user_cpu_time UserCPU from stmt_sql_trace where stmt_operation not in (7,8,9,19) order by usercpu desc fetch first 10 rows only"
    4.按照总排序时间降序排列时间最长的SQL语句:
        db2 "select stmt_text,total_sort_time TotalSortTime from stmt_sql_trace where stmt_operation not in(7,8,9,19) order by decimal(total_sort_time) desc fetch first 10 rows only"

6.db2mtrk:
    db2mtrk是DB2进行内存跟踪的工具,可以用于查看实例,数据库,代理进程当前对内存的使用情况。
    db2mtrk -i -v -d -p -m
        -i 显示当前实例的内存使用情况
        -d 显示数据库的内存使用情况
        -v 显示详细信息
        -p 显示代理进程专用内存使用率
        -m 显示最大的内存使用上限

7.活动监视器(基于图形界面,底层调用监控命令和参数)



如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广