0
点赞
收藏
分享

微信扫一扫

Oracle数据库巡检脚本

鱼板番茄 2022-04-14 阅读 95
数据库

目录

1. 检查数据库基本状况

1.1. 检查Oracle实例状态

1.2. 检查Oracle在线日志状态

1.3. 检查Oracle表空间的状态

1.4. 检查Oracle所有数据文件状态

1.5. 检查无效对象

1.6. 检查所有回滚段状态

2. 检查Oracle相关资源的使用情况

2.1. 检查Oracle初始化文件中相关参数值

2.2. 检查数据库连接情况

2.3. 检查系统磁盘空间

2.4. 检查表空间使用情况

2.5. 检查一些扩展异常的对象

2.6. 检查system表空间内的内容

2.7. 检查对象的下一扩展与表空间的最大扩展值

3. 检查Oracle数据库备份结果

3.1. 检查数据库备份日志信息

3.2. 检查backup卷中文件产生的时间

3.3. 检查oracle用户的email

4. 检查Oracle数据库性能

4.1. 检查数据库的等待事件

4.2. Disk Read最高的SQL语句的获取

4.3. 查找前十条性能差的sql

4.4. 等待时间最多的5个系统等待事件的获取

4.5. 检查运行很久的SQL

4.6. 检查消耗CPU最高的进程

4.7. 检查碎片程度高的表

4.8. 检查表空间的I/O比例

4.9. 检查文件系统的I/O比例

4.10.检查死锁及处理

5. 检查数据库cpu、I/O、内存性能

5.1 CPU使用情况:

5.2 内存使用情况:

5.3 系统I/O情况:

5.4 系统负载情况:

5.5.查看是否有僵死进程

5.6.检查行链接/迁移

5.7 定期做统计分析

5.8 检查缓冲区命中率

5.9 检查共享池命中率

5.10 检查排序区

5.11 检查日志缓冲区

6. 检查数据库安全性

6.1. 检查系统安全日志信息

6.2. 检查用户修改密码

7. 其他检查

7.1 检查当前crontab任务是否正常

7.2 Oracle Job是否有失败

7.3. 监控数据量的增长情况

7.4. 检查失效的索引

7.5. 检查不起作用的约束

7.6. 检查无效的trigger


1. 检查数据库基本状况

1.1. 检查Oracle实例状态

目录

1. 检查数据库基本状况

1.1. 检查Oracle实例状态

1.2. 检查Oracle在线日志状态

1.3. 检查Oracle表空间的状态

1.4. 检查Oracle所有数据文件状态

1.5. 检查无效对象

1.6. 检查所有回滚段状态

2. 检查Oracle相关资源的使用情况

2.1. 检查Oracle初始化文件中相关参数值

2.2. 检查数据库连接情况

2.3. 检查系统磁盘空间

2.4. 检查表空间使用情况

2.5. 检查一些扩展异常的对象

2.6. 检查system表空间内的内容

2.7. 检查对象的下一扩展与表空间的最大扩展值

3. 检查Oracle数据库备份结果

3.1. 检查数据库备份日志信息

3.2. 检查backup卷中文件产生的时间

3.3. 检查oracle用户的email

4. 检查Oracle数据库性能

4.1. 检查数据库的等待事件

4.2. Disk Read最高的SQL语句的获取

4.3. 查找前十条性能差的sql

4.4. 等待时间最多的5个系统等待事件的获取

4.5. 检查运行很久的SQL

4.6. 检查消耗CPU最高的进程

4.7. 检查碎片程度高的表

4.8. 检查表空间的I/O比例

4.9. 检查文件系统的I/O比例

4.10.检查死锁及处理

5. 检查数据库cpu、I/O、内存性能

5.1 CPU使用情况:

5.2 内存使用情况:

5.3 系统I/O情况:

5.4 系统负载情况:

5.5.查看是否有僵死进程

5.6.检查行链接/迁移

5.7 定期做统计分析

5.8 检查缓冲区命中率

5.9 检查共享池命中率

5.10 检查排序区

5.11 检查日志缓冲区

6. 检查数据库安全性

6.1. 检查系统安全日志信息

6.2. 检查用户修改密码

7. 其他检查

7.1 检查当前crontab任务是否正常

7.2 Oracle Job是否有失败

7.3. 监控数据量的增长情况

7.4. 检查失效的索引

7.5. 检查不起作用的约束

7.6. 检查无效的trigger

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. 检查无效对象

  1. select owner, object_name, object_type

  2. from dba_objects

  3. where status != 'VALID'

  4. and owner != 'SYS'

  5. and owner != 'SYSTEM';

  1. SELECT owner, object_name, object_type

  2. FROM dba_objects

  3. WHERE status = 'INVALID';

1.6. 检查所有回滚段状态

select segment_name,status from dba_rollback_segs;

2. 检查Oracle相关资源的使用情况

2.1. 检查Oracle初始化文件中相关参数值

  1. select resource_name, max_utilization, initial_allocation,   limit_value

  2. from v$resource_limit;

2.2. 检查数据库连接情况

  1. select count(*) from v$session;

  2. select sid,serial#,username,program,machine,status from v$session;

  • 通过sid查到操作系统的spid
ps –ef|grep spidno

  • 杀掉连接
alter system kill session 'SID,SERIAL#';

2.3. 检查系统磁盘空间

  1. [oracle@AS14 ~]$ df -h

  2. Filesystem Size Used Avail Use% Mounted on

  3. /dev/sda5 9.7G 3.9G 5.4G 42% /

  4. /dev/sda1 479M 16M 438M 4% /boot

  5. /dev/sda2 49G 19G 28G 41% /data

  6. none 1014M 0 1014M 0% /dev/shm

2.4. 检查表空间使用情况

  1. select f.tablespace_name,

  2. a.total,

  3. f.free,

  4. round((f.free / a.total) * 100) "% Free"

  5. from (select tablespace_name, sum(bytes / (1024 * 1024)) total

  6. from dba_data_files

  7. group by tablespace_name) a,

  8.   (select tablespace_name, round(sum(bytes / (1024 * 1024))) free

  9. from dba_free_space

  10. group by tablespace_name) f

  11. WHERE a.tablespace_name = f.tablespace_name(+)

  12. 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. 检查一些扩展异常的对象

  1. select Segment_Name,

  2.        Segment_Type,

  3.        TableSpace_Name,

  4.         (Extents / Max_extents) * 100 Percent

  5.   From sys.DBA_Segments

  6.  Where Max_Extents != 0

  7.    and (Extents / Max_extents) * 100 >= 95

  8.  order By Percent;

2.6. 检查system表空间内的内容

  1. select distinct (owner)

  2. from dba_tables

  3. where tablespace_name = 'SYSTEM'

  4. and owner != 'SYS'

  5. and owner != 'SYSTEM'

  6. union

  7. select distinct (owner)

  8. from dba_indexes

  9. where tablespace_name = 'SYSTEM'

  10. and owner != 'SYS'

  11. and owner != 'SYSTEM';

2.7. 检查对象的下一扩展与表空间的最大扩展值

  1. select a.table_name, a.next_extent, a.tablespace_name

  2. from all_tables a,

  3.   (select tablespace_name, max(bytes) as big_chunk 

  4. from dba_free_space 

  5. group by tablespace_name) f

  6. where f.tablespace_name = a.tablespace_name 

  7. and a.next_extent > f.big_chunk

  8. union

  9. select a.index_name, a.next_extent, a.tablespace_name

  10. from all_indexes a,

  11.   (select tablespace_name, max(bytes) as big_chunk 

  12. from dba_free_space 

  13. group by tablespace_name) f

  14. where f.tablespace_name = a.tablespace_name 

  15. 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. 检查数据库的等待事件

  1. set pages 80

  2. set lines 120

  3. col event for a40

  4. select sid, event, p1, p2, p3, WAIT_TIME, SECONDS_IN_WAIT

  5.   from v$session_wait

  6.  where event not like 'SQL%'

  7.    and event not like 'rdbms%';

4.2. Disk Read最高的SQL语句的获取

  1. SELECT SQL_TEXT

  2. FROM (SELECT * FROM V$SQLAREA ORDER BY DISK_READS)

  3. WHERE ROWNUM <= 5;

4.3. 查找前十条性能差的sql

  1. SELECT *

  2. FROM (SELECT PARSING_USER_ID  EXECUTIONS,

  3. SORTS,

  4. COMMAND_TYPE,

  5. DISK_READS,

  6.   SQL_TEXT

  7. FROM V$SQLAREA

  8. ORDER BY DISK_READS DESC)

  9. WHERE ROWNUM < 10;

  10. select * from V$SQLAREA order by disk_reads  desc

4.4. 等待时间最多的5个系统等待事件的获取

  1. SELECT *

  2.   FROM (SELECT *

  3.           FROM V$SYSTEM_EVENT

  4.          WHERE EVENT NOT LIKE 'SQL%'

  5.          ORDER BY TOTAL_WAITS DESC)

  6.  WHERE ROWNUM <= 5;

4.5. 检查运行很久的SQL

  1. COLUMN USERNAME FORMAT A12

  2. COLUMN OPNAME FORMAT A16

  3. COLUMN PROGRESS FORMAT A8

  4. SELECT USERNAME,

  5.        SID,

  6.        OPNAME,

  7.        ROUND(SOFAR * 100 / TOTALWORK, 0) || '%' AS PROGRESS,

  8.        TIME_REMAINING,

  9.        SQL_TEXT

  10.   FROM V$SESSION_LONGOPS, V$SQL

  11.  WHERE TIME_REMAINING <> 0

  12.    AND SQL_ADDRESS = ADDRESS

  13.    AND SQL_HASH_VALUE = HASH_VALUE;

4.6. 检查消耗CPU最高的进程

  1. SET LINE 240

  2. SET VERIFY OFF

  3. COLUMN SID FORMAT 999

  4. COLUMN PID FORMAT 999

  5. COLUMN S_# FORMAT 999

  6. COLUMN USERNAME FORMAT A9 HEADING "ORA USER"

  7. COLUMN PROGRAM FORMAT A29

  8. COLUMN SQL FORMAT A60

  9. COLUMN OSNAME FORMAT A9 HEADING "OS USER"

  10. SELECT P.PID PID,

  11.        S.SID SID,

  12.        P.SPID SPID,

  13.        S.USERNAME USERNAME,

  14.        S.OSUSER OSNAME,

  15.        P.SERIAL# S_#,

  16.        P.TERMINAL,

  17.        P.PROGRAM PROGRAM,

  18.        P.BACKGROUND,

  19.        S.STATUS,

  20.        RTRIM(SUBSTR(A.SQL_TEXT, 1, 80)) SQLFROM V$PROCESS P,

  21.        V$SESSION S,

  22.        V$SQLAREA A WHERE P.ADDR = S.PADDR AND S.SQL_ADDRESS = A.ADDRESS(+) AND P.SPID LIKE '%&1%';

4.7. 检查碎片程度高的表

  1. SELECT segment_name table_name, COUNT(*) extents  

  2. FROM dba_segments  WHERE owner NOT IN('SYS', 'SYSTEM')  GROUP BY segment_name

  3. HAVING COUNT(*) = (SELECT MAX(COUNT(*))                      FROM dba_segments                     GROUP BY segment_name);

4.8. 检查表空间的I/O比例

  1. SELECT DF.TABLESPACE_NAME NAME,

  2.        DF.FILE_NAME       "FILE",

  3.        F.PHYRDS           PYR,

  4.        F.PHYBLKRD         PBR,

  5.        F.PHYWRTS          PYW,

  6.        F.PHYBLKWRT        PBW  

  7. FROM V$FILESTAT F,

  8. DBA_DATA_FILES DF  WHERE F.FILE# = DF.FILE_ID  ORDER BY DF.TABLESPACE_NAME;

4.9. 检查文件系统的I/O比例

  1. SELECT SUBSTR(A.FILE#, 1, 2) "#",

  2.        SUBSTR(A.NAME, 1, 30) "NAME",

  3.        A.STATUS,

  4.        A.BYTES,

  5.        B.PHYRDS,

  6.        B.PHYWRTS

  7.   FROM V$DATAFILE A, V$FILESTAT B

  8.  WHERE A.FILE# = B.FILE#;

4.10.检查死锁及处理

  1. --查询目前锁对象信息:

  2. select sid,

  3.        serial#,

  4.        username,

  5.        SCHEMANAME,

  6.        osuser,

  7.        MACHINE,     

  8.        terminal,

  9.        PROGRAM,

  10.        owner,

  11.        object_name,

  12.        object_type,

  13.        o.object_id

  14.   from dba_objects o, v$locked_object l, v$session s

  15.  where o.object_id = l.object_id

  16.    and s.sid = l.session_id; 

alter system kill session '&sid,&serial#';

kill -9 pid

5. 检查数据库cpu、I/O、内存性能

5.1 CPU使用情况:

  1. [root@sale8 ~]# top

  2. top - 10:29:35 up 73 days, 19:54, 1 user, load average: 0.37, 0.38, 0.29

  3. Tasks: 353 total, 2 running, 351 sleeping, 0 stopped, 0 zombie

  4. Cpu(s): 1.2% us, 0.1% sy, 0.0% ni,98.8% id, 0.0% wa, 0.0% hi, 0.0% si

  5. Mem: 16404472k total, 12887428k used, 3517044k free, 60796k buffers

  6. Swap: 8385920k total, 665576k used, 7720344k free, 10358384k cached

  7. PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

  8. 30495 oracle 15 0 8329m 866m 861m R 10 5.4 7:53.90 oracle

  9. 32501 oracle 15 0 8328m 1.7g 1.7g S 2 10.6 1:58.38 oracle

  10. 32503 oracle 15 0 8329m 1.6g 1.6g S 2 10.2 2:06.62 oracle

5.2 内存使用情况:

  1. # free -m

  2. total used free shared buffers cached

  3. Mem: 2026 1958 67 0 76 1556

  4. -/+ buffers/cache: 326 1700

  5. Swap: 5992 92 5900

5.3 系统I/O情况:

  1. # iostat -k 1 3

  2. Linux 2.6.9-22.ELsmp (AS14) 07/29/2009

  3. avg-cpu: %user %nice %sys%iowait %idle

  4. 0.16 0.00 0.05 0.36 99.43

  5. Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn

  6. sda 3.33 13.16 50.25 94483478 360665804

  7. avg-cpu: %user %nice %sys%iowait %idle

  8. 0.00 0.00 0.00 0.00 100.00

  9. Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn

  10. sda 0.00 0.00 0.00 0 0

5.4 系统负载情况:

  1. uptime

  2. 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.检查行链接/迁移

  1. select table_name, num_rows, chain_cnt

  2.   From dba_tables

  3.  Where owner = 'CTAIS2'

  4.    And chain_cnt <> 0

  1. ../rdbms/admin/utlchain.sql

  2. analyze table tablename list chained rows;

  1. 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';

  2. delete from sb_zsxx where rowid in (select head_rowid from chained_rows where table_name = 'SB_ZSXX');

  3. insert into sb_zsxx select * from chained_row where table_name = 'SB_ZSXX';

5.7 定期做统计分析

  • 查看表或索引的统计信息是否需更新,如:
  1. Select table_name, num_rows, last_analyzed

  2. From user_tables

  3. where table_name = 'DJ_NSRXX'

  4. select count(*) from DJ_NSRXX如num_rows和count(*)

  • 如果行数相差很多,则该表需要更新统计信息,建议一周做一次统计信息收集,如:
exec sys.dbms_stats.gather_schema_stats(ownname=>'CTAIS2',cascade => TRUE,degree => 4);

5.8 检查缓冲区命中率

  1. SELECT a.VALUE + b.VALUE logical_reads,

  2.        c.VALUE phys_reads,

  3.        round(100 * (1 - c.value / (a.value + b.value)), 4) hit_ratio  

  4. FROM v$sysstat a,

  5. v$sysstat b,

  6. 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 检查日志缓冲区

  1. select name, value

  2. from v$sysstat

  3. where name in ('redo entries', 'redo buffer allocation retries');

6. 检查数据库安全性

6.1. 检查系统安全日志信息

  • 检查登录成功的日志
  1. [root@rac2 ~]# grep -i accepted /var/log/secure

  2. Jan 8 08:44:43 rac2 sshd[29559]: Accepted password for root from ::ffff:10.10.10.6 port 1119 ssh2……

  • 检查登录失败的日志
  1. [root@rac2 ~]# grep -i inval /var/log/secure &&grep -i failed /var/log/secure

  2. Jan 9 10:30:44 rac2 sshd[3071]: Invalid user ydbuser from ::ffff:192.168.3.5

  3. Jan 9 10:30:56 rac2 sshd[3071]: Failed password for invalid user ydbuser from ::ffff:192.168.3.5 port 36005 ssh2

  4. Jan 9 10:30:56 rac2 sshd[3071]: Failed password for invalid user ydbuser from ::ffff:192.168.3.5 port 36005 ssh2

  5. 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是否有失败

  1. select job, what, last_date, next_date, failures, broken

  2. from dba_jobs

  3. Where schema_user = 'CAIKE';

  • 重建job
  1. exec sys.dbms_job.remove(1);

  2. commit;

  3. exec sys.dbms_job.isubmit(1,

  4.                           'REFRESH_ALL_SNAPSHOT;',

  5.                           SYSDATE + 1 / 1440,

  6.                           'SYSDATE+4/1440');

  7. commit;

7.3. 监控数据量的增长情况

  1. --监控数据增长状况

  2. select A.tablespace_name, (1 - (A.total) / B.total) * 100 used_percent  

  3. from (select tablespace_name, sum(bytes) total          

  4. from dba_free_space          group by tablespace_name) A,

  5.         (select tablespace_name, sum(bytes) total          

  6. 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. 检查失效的索引

  1. select index_name, table_name, tablespace_name, status

  2.   From dba_indexes

  3.  Where owner = 'CTAIS2'

  4.    And status <> 'VALID';

  • 对该索引做rebuild
alter index INDEX_NAME rebuild tablespace TABLESPACE_NAME;

7.5. 检查不起作用的约束

  1. SELECT owner, constraint_name, table_name, constraint_type, status  

  2. FROM dba_constraints  WHERE status = 'DISABLE'    and constraint_type = 'P';

  • 如有失效约束则启用
alter Table TABLE_NAME Enable Constraints CONSTRAINT_NAME;

7.6. 检查无效的trigger

  1. SELECT owner, trigger_name, table_name, status

  2.   FROM dba_triggers

  3.  WHERE status = 'DISABLED';

  • 如有失效触发器则启用
alter Trigger TRIGGER_NAME Enable;

举报

相关推荐

0 条评论