检查数据库 CPU、I/O、内存性能
记录数据库的 CPU 使用、IO、内存等使用情况,使用 vmstat,iostat,sar,top 等命令进行信息收集并检查这些信息,判断资源使用情况。
1. CPU使用情况:
root# top
top - 10:29:35 up 73 days, 19:54, 1 user, load average: 0.37, 0.38, 0.29
Tasks: 353 total, 2 running, 351 sleeping, 0 stopped, 0 zombie
Cpu(s): 1.2% us, 0.1% sy, 0.0% ni,98.8% id, 0.0% wa, 0.0% hi, 0.0% si
Mem: 16404472k total, 12887428k used, 3517044k free, 60796k buffers
Swap: 8385920k total, 665576k used, 7720344k free, 10358384k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
30495 oracle 15 0 8329m 866m 861m R 10 5.4 7:53.90 oracle
32501 oracle 15 0 8328m 1.7g 1.7g S 2 10.6 1:58.38 oracle
32503 oracle 15 0 8329m 1.6g 1.6g S 2 10.2 2:06.62 oracle
2. 内存使用情况:
root# free -m
total used free shared buffers cached
Mem: 2026 1958 67 0 76 1556
-/+ buffers/cache: 326 1700
Swap: 5992 92 5900
3. 系统 I/O 情况:
root# iostat -k 1 3
Linux 2.6.9-22.ELsmp (AS14) 07/29/2009
-------------------------------------------------
avg-cpu: %user %nice %sys%iowait %idle
0.16 0.00 0.05 0.36 99.43
-------------------------------------------------
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 3.33 13.16 50.25 94483478 360665804
-------------------------------------------------
avg-cpu: %user %nice %sys%iowait %idle
0.00 0.00 0.00 0.00 100.00
-------------------------------------------------
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.00 0.00 0.00 0 0
4. 系统负载情况:
root# uptime
12:08:37 up 162 days, 23:33, 15 users, load average: 0.01, 0.15, 0.10
5. 查看是否有僵死进程
select
spid
from
v$process
where
addr not in (select paddr from v$session);
有些僵尸进程有阻塞其他业务的正常运行,定期杀掉僵尸进程。
6. 检查行链接/迁移
select
table_name, num_rows, chain_cnt
From
dba_tables
Where
owner = 'CTAIS2'
And chain_cnt <> 0;
analyze table tablename list chained rows;
可通过表 chained_rows 中 table_name,head_rowid 看出哪些行是迁移行
create table aa as
select
a.*
from
sb_zsxx a,chained_rows b
where
a.rowid=b.head_rowid
and b.table_name = 'SB_ZSXX';
delete from sb_zsxx
where rowid in (select
head_rowid
from
chained_rows
where table_name = 'SB_ZSXX');
insert into sb_zsxx
select
*
from
chained_row
where
table_name = 'SB_ZSXX';
7 定期做统计分析
对于采用 Oracle Cost-Based-Optimizer 的系统,需要定期对数据对象的统计信息进行采集更新,使优化器可以根据准备的信息作出正确的 explain plan 。
在以下情况更需要进行统计信息的更新:
a. 应用发生变化
b. 大规模数据迁移、历史数据迁出、其他数据的导入等
c .数据量发生变化
查看表或索引的统计信息是否需更新,如:
Select
table_name,num_rows,last_analyzed
From
user_tables
where
table_name = 'DJ_NSRXX'
select count() from DJ_NSRXX如num_rows和count()
如果行数相差很多,则该表需要更新统计信息,建议一周做一次统计信息收集,如:
exec sys.dbms_stats.gather_schema_stats(ownname=>'CTAIS2',cascade => TRUE,degree => 4);
8 检查缓冲区命中率
SELECT
a.VALUE + b.VALUE logical_reads,
c.VALUE phys_reads,
round(100 * (1 - c.value / (a.value + b.value)), 4) hit_ratio
FROM
v$sysstat a, v$sysstat b, v$sysstat c
WHERE
a.NAME = 'db block gets'
AND b.NAME = 'consistent gets'
AND c.NAME = 'physical reads';
如果命中率低于 90% 则需加大数据库参数 db_cache_size。
9 检查共享池命中率
select
sum(pinhits) / sum(pins) * 100
from
v$librarycache;
如低于 95%,则需要调整应用程序使用绑定变量,或者调整数据库参数 shared pool 的大小。
10 检查排序区
select
name,value
from
v$sysstat
where
name like '%sort%';
如果 disk/(memoty+row) 的比例过高,则需要调整 sort_area_size(workarea_size_policy=false) 或 pga_aggregate_target(workarea_size_policy=true)。
11 检查日志缓冲区
select
name,value
from
v$sysstat
where
name in ('redo entries','redo buffer allocation retries');
如果 redo buffer allocation retries/redo entries 超过 1%,则需要增大 log_buffer。