目录
1. 检查数据库基本状况
1.1. 检查Oracle实例状态
目录
1.2. 检查Oracle在线日志状态
select group#,status,type,member from v$logfile;
1.3. 检查Oracle表空间的状态
select tablespace_name,status from dba_tablespaces;
1.4. 检查Oracle所有数据文件状态
select name,status from v$datafile;
select file_name,status from dba_data_files;
1.5. 检查无效对象
select owner, object_name, object_type
from dba_objects
where status != 'VALID'
and owner != 'SYS'
and owner != 'SYSTEM';
SELECT owner, object_name, object_type
FROM dba_objects
WHERE status = 'INVALID';
1.6. 检查所有回滚段状态
select segment_name,status from dba_rollback_segs;
2. 检查Oracle相关资源的使用情况
2.1. 检查Oracle初始化文件中相关参数值
select resource_name, max_utilization, initial_allocation, limit_value
from v$resource_limit;
2.2. 检查数据库连接情况
select count(*) from v$session;
select sid,serial#,username,program,machine,status from v$session;
- 通过sid查到操作系统的spid
ps –ef|grep spidno
- 杀掉连接
alter system kill session 'SID,SERIAL#';
2.3. 检查系统磁盘空间
[oracle@AS14 ~]$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda5 9.7G 3.9G 5.4G 42% /
/dev/sda1 479M 16M 438M 4% /boot
/dev/sda2 49G 19G 28G 41% /data
none 1014M 0 1014M 0% /dev/shm
2.4. 检查表空间使用情况
select f.tablespace_name,
a.total,
f.free,
round((f.free / a.total) * 100) "% Free"
from (select tablespace_name, sum(bytes / (1024 * 1024)) total
from dba_data_files
group by tablespace_name) a,
(select tablespace_name, round(sum(bytes / (1024 * 1024))) free
from dba_free_space
group by tablespace_name) f
WHERE a.tablespace_name = f.tablespace_name(+)
order by "% Free";
- 修改表空间大小
alter database datafile 'D:\ORACLE\PRODUCT\ORADATA\TEST\USERS01.DBF' resize 50m;
- 增加数据文件
alter tablespace 表空间名 add datafile 'E:\ORACLE\ORADATA\ORCL\NNC_DATA011.DBF' size 30000m;
2.5. 检查一些扩展异常的对象
select Segment_Name,
Segment_Type,
TableSpace_Name,
(Extents / Max_extents) * 100 Percent
From sys.DBA_Segments
Where Max_Extents != 0
and (Extents / Max_extents) * 100 >= 95
order By Percent;
2.6. 检查system表空间内的内容
select distinct (owner)
from dba_tables
where tablespace_name = 'SYSTEM'
and owner != 'SYS'
and owner != 'SYSTEM'
union
select distinct (owner)
from dba_indexes
where tablespace_name = 'SYSTEM'
and owner != 'SYS'
and owner != 'SYSTEM';
2.7. 检查对象的下一扩展与表空间的最大扩展值
select a.table_name, a.next_extent, a.tablespace_name
from all_tables a,
(select tablespace_name, max(bytes) as big_chunk
from dba_free_space
group by tablespace_name) f
where f.tablespace_name = a.tablespace_name
and a.next_extent > f.big_chunk
union
select a.index_name, a.next_extent, a.tablespace_name
from all_indexes a,
(select tablespace_name, max(bytes) as big_chunk
from dba_free_space
group by tablespace_name) f
where f.tablespace_name = a.tablespace_name
and a.next_extent > f.big_chunk;
3. 检查Oracle数据库备份结果
3.1. 检查数据库备份日志信息
cat /backup/hotbackup/hotbackup-09-7-22.log|grep –i error
3.2. 检查backup卷中文件产生的时间
ls –lt /backup/hotbackup
3.3. 检查oracle用户的email
tail –n 300 /var/mail/oracle
4. 检查Oracle数据库性能
4.1. 检查数据库的等待事件
set pages 80
set lines 120
col event for a40
select sid, event, p1, p2, p3, WAIT_TIME, SECONDS_IN_WAIT
from v$session_wait
where event not like 'SQL%'
and event not like 'rdbms%';
4.2. Disk Read最高的SQL语句的获取
SELECT SQL_TEXT
FROM (SELECT * FROM V$SQLAREA ORDER BY DISK_READS)
WHERE ROWNUM <= 5;
4.3. 查找前十条性能差的sql
SELECT *
FROM (SELECT PARSING_USER_ID EXECUTIONS,
SORTS,
COMMAND_TYPE,
DISK_READS,
SQL_TEXT
FROM V$SQLAREA
ORDER BY DISK_READS DESC)
WHERE ROWNUM < 10;
select * from V$SQLAREA order by disk_reads desc
4.4. 等待时间最多的5个系统等待事件的获取
SELECT *
FROM (SELECT *
FROM V$SYSTEM_EVENT
WHERE EVENT NOT LIKE 'SQL%'
ORDER BY TOTAL_WAITS DESC)
WHERE ROWNUM <= 5;
4.5. 检查运行很久的SQL
COLUMN USERNAME FORMAT A12
COLUMN OPNAME FORMAT A16
COLUMN PROGRESS FORMAT A8
SELECT USERNAME,
SID,
OPNAME,
ROUND(SOFAR * 100 / TOTALWORK, 0) || '%' AS PROGRESS,
TIME_REMAINING,
SQL_TEXT
FROM V$SESSION_LONGOPS, V$SQL
WHERE TIME_REMAINING <> 0
AND SQL_ADDRESS = ADDRESS
AND SQL_HASH_VALUE = HASH_VALUE;
4.6. 检查消耗CPU最高的进程
SET LINE 240
SET VERIFY OFF
COLUMN SID FORMAT 999
COLUMN PID FORMAT 999
COLUMN S_# FORMAT 999
COLUMN USERNAME FORMAT A9 HEADING "ORA USER"
COLUMN PROGRAM FORMAT A29
COLUMN SQL FORMAT A60
COLUMN OSNAME FORMAT A9 HEADING "OS USER"
SELECT P.PID PID,
S.SID SID,
P.SPID SPID,
S.USERNAME USERNAME,
S.OSUSER OSNAME,
P.SERIAL# S_#,
P.TERMINAL,
P.PROGRAM PROGRAM,
P.BACKGROUND,
S.STATUS,
RTRIM(SUBSTR(A.SQL_TEXT, 1, 80)) SQLFROM V$PROCESS P,
V$SESSION S,
V$SQLAREA A WHERE P.ADDR = S.PADDR AND S.SQL_ADDRESS = A.ADDRESS(+) AND P.SPID LIKE '%&1%';
4.7. 检查碎片程度高的表
SELECT segment_name table_name, COUNT(*) extents
FROM dba_segments WHERE owner NOT IN('SYS', 'SYSTEM') GROUP BY segment_name
HAVING COUNT(*) = (SELECT MAX(COUNT(*)) FROM dba_segments GROUP BY segment_name);
4.8. 检查表空间的I/O比例
SELECT DF.TABLESPACE_NAME NAME,
DF.FILE_NAME "FILE",
F.PHYRDS PYR,
F.PHYBLKRD PBR,
F.PHYWRTS PYW,
F.PHYBLKWRT PBW
FROM V$FILESTAT F,
DBA_DATA_FILES DF WHERE F.FILE# = DF.FILE_ID ORDER BY DF.TABLESPACE_NAME;
4.9. 检查文件系统的I/O比例
SELECT SUBSTR(A.FILE#, 1, 2) "#",
SUBSTR(A.NAME, 1, 30) "NAME",
A.STATUS,
A.BYTES,
B.PHYRDS,
B.PHYWRTS
FROM V$DATAFILE A, V$FILESTAT B
WHERE A.FILE# = B.FILE#;
4.10.检查死锁及处理
--查询目前锁对象信息:
select sid,
serial#,
username,
SCHEMANAME,
osuser,
MACHINE,
terminal,
PROGRAM,
owner,
object_name,
object_type,
o.object_id
from dba_objects o, v$locked_object l, v$session s
where o.object_id = l.object_id
and s.sid = l.session_id;
alter system kill session '&sid,&serial#';
kill -9 pid
5. 检查数据库cpu、I/O、内存性能
5.1 CPU使用情况:
[root@sale8 ~]# 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
5.2 内存使用情况:
# free -m
total used free shared buffers cached
Mem: 2026 1958 67 0 76 1556
-/+ buffers/cache: 326 1700
Swap: 5992 92 5900
5.3 系统I/O情况:
# 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
5.4 系统负载情况:
uptime
12:08:37 up 162 days, 23:33, 15 users, load average: 0.01, 0.15, 0.10
5.5.查看是否有僵死进程
select spid from v$process where addr not in (select paddr from v$session);
5.6.检查行链接/迁移
select table_name, num_rows, chain_cnt
From dba_tables
Where owner = 'CTAIS2'
And chain_cnt <> 0;
../rdbms/admin/utlchain.sql
analyze table tablename list chained rows;
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';
5.7 定期做统计分析
- 查看表或索引的统计信息是否需更新,如:
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);
5.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';
5.9 检查共享池命中率
select sum(pinhits) / sum(pins) * 100 from v$librarycache;
5.10 检查排序区
select name,value from v$sysstat where name like '%sort%';
5.11 检查日志缓冲区
select name, value
from v$sysstat
where name in ('redo entries', 'redo buffer allocation retries');
6. 检查数据库安全性
6.1. 检查系统安全日志信息
- 检查登录成功的日志
[root@rac2 ~]# grep -i accepted /var/log/secure
Jan 8 08:44:43 rac2 sshd[29559]: Accepted password for root from ::ffff:10.10.10.6 port 1119 ssh2……
- 检查登录失败的日志
[root@rac2 ~]# grep -i inval /var/log/secure &&grep -i failed /var/log/secure
Jan 9 10:30:44 rac2 sshd[3071]: Invalid user ydbuser from ::ffff:192.168.3.5
Jan 9 10:30:56 rac2 sshd[3071]: Failed password for invalid user ydbuser from ::ffff:192.168.3.5 port 36005 ssh2
Jan 9 10:30:56 rac2 sshd[3071]: Failed password for invalid user ydbuser from ::ffff:192.168.3.5 port 36005 ssh2
Jan 10 22:44:38 rac2 sshd[21611]: Failed password for root from ::ffff:10.10.10.6 port 1723 ssh2
6.2. 检查用户修改密码
- 修改密码
alter user USER_NAME identified by PASSWORD;
7. 其他检查
7.1 检查当前crontab任务是否正常
[oracle@AS14 ~]$ crontab -l
7.2 Oracle Job是否有失败
select job, what, last_date, next_date, failures, broken
from dba_jobs
Where schema_user = 'CAIKE';
- 重建job
exec sys.dbms_job.remove(1);
commit;
exec sys.dbms_job.isubmit(1,
'REFRESH_ALL_SNAPSHOT;',
SYSDATE + 1 / 1440,
'SYSDATE+4/1440');
commit;
7.3. 监控数据量的增长情况
--监控数据增长状况
select A.tablespace_name, (1 - (A.total) / B.total) * 100 used_percent
from (select tablespace_name, sum(bytes) total
from dba_free_space group by tablespace_name) A,
(select tablespace_name, sum(bytes) total
from dba_data_files group by tablespace_name) B where A.tablespace_name = B.tablespace_name;
- 删除历史数据
移动规定数据库中至少保留6个月的历史数据,所以以前的历史数据可以考虑备份然后进行清除以便释放其所占的资源空间。
- 扩表空间
alter tablespace <tablespace_name> add datafile ‘<file>’ size <size> autoextend off;
备份方法是
- 执行SQL语句:
alter database backup controlfile to '/home/backup/control.bak';
或:
alter database backup controlfile to trace;
7.4. 检查失效的索引
select index_name, table_name, tablespace_name, status
From dba_indexes
Where owner = 'CTAIS2'
And status <> 'VALID';
- 对该索引做rebuild
alter index INDEX_NAME rebuild tablespace TABLESPACE_NAME;
7.5. 检查不起作用的约束
SELECT owner, constraint_name, table_name, constraint_type, status
FROM dba_constraints WHERE status = 'DISABLE' and constraint_type = 'P';
- 如有失效约束则启用
alter Table TABLE_NAME Enable Constraints CONSTRAINT_NAME;
7.6. 检查无效的trigger
SELECT owner, trigger_name, table_name, status
FROM dba_triggers
WHERE status = 'DISABLED';
- 如有失效触发器则启用
alter Trigger TRIGGER_NAME Enable;