您的当前位置:首页正文

Oracle数据库日常检查文档

来源:个人技术集锦
Oracle数据库日常检查文档

数据库日常检查文档

1. 检查表空间使用情况:

1.1 检查是否开启自扩展功能:

select tablespace_name,,

round((increment_by*8191)/(1024*1024),2)||'M' as 自扩展大小M from dba_data_files;

目的:检查表空间是否开启自扩展功能。

若检查自扩展特别小,请用下面的方法把自扩展根据数据量增长情况调大。 alter database datafile '新增加数据文件路径' autoextend

on next *M maxsize unlimited;--把*替换为你需要的自扩展大小

1.2 检查表空间的使用情况:

select a.tablespace_name,a.totals 总大小M,b.frees 空闲大小M, round((a.totals-b.frees)/a.totals,4)*100||'%' 使用率

from (select sum(bytes)/(1024*1024) as totals,tablespace_name from dba_data_files

group by tablespace_name) a,

(select sum(bytes)/(1024*1024) as frees,tablespace_name from dba_free_space

group by tablespace_name) b

where a.tablespace_name=b.tablespace_name ;

目的:当表空间没有开启自扩展功能时,表空间的使用率大于等于85%时,需要向表空间增加数据文件。开启自扩展功能的表空间,检查常用的表空间自扩展的大小不小于100M。 注:

检查ulog用户对应的表空间: select default_tablespace from dba_users

where username='ULOG';

Ulog用户下的tlog表主要是记录日志的,因为大部分的报表涉及记录日志。所以,ulog用户对应的表空间不管是开启还是未开启自扩展功能,当ulog对应的表空间的使用率大于等于85%时,就对性能有影响,考虑truncate释放空间或是扩空间。

1 / 7

Oracle数据库日常检查文档

解决办法:

手工降低使用率的方法:

Alter database datafile ‘数据文件的路径’ resize **M; 另一种情况:

当前的文件是开启自扩展的,但是要扩展的数据文件已经到达限制值32G了,此时的解决办法:

alter tablespace 表空间名 add datafile '新增加数据文件路径' size 5120M;--向表空间中增加数据文件

alter database datafile '新增加数据文件路径' autoextend on next 100M maxsize unlimited;--开启自动扩展

alter database datafile '达到最大值的数据文件路径' AUTOEXTEND off;--关闭之前文件的自扩展

2. 定期检查磁盘的使用情况:

2.1 Windows下检查

执行下面sql,获得数据文件的路径:

select from dba_data_files;

Windows下直接检查数据文件所在的盘的总大小和可用空间,当使用率为85% 时,清除数据文件所在的盘上无用的数据,或考虑增加硬件。

2.2 Linux或是unix下:

Linux或是unix下检查oracle的安装所用的盘,检查变量ORACLE_BASE所在目录的磁盘的使用情况,当使用率大于或等于90%时,需要清除无用的资料或是考虑增加硬件。 例如,linux下用df命令 : [root@rac1 /]# df 文件系统 1K-块 已用 可用 已用% 挂载点 /dev/sda1 10115104 8671272 921724 91% / /dev/sda2 15398476 5604628 8999036 39% /u01/oracle tmpfs 871640 0 871640 0% /dev/shm 3. 常规检查:

3.1 检查是否有无效的对象:

select owner as 用户,object_name as 对象名,object_type as 对象类型

2 / 7

Oracle数据库日常检查文档

from dba_objects where status='INVAID';

目的:若查询有结果,对无效对象需要重新编译。 Alter object_type owner.object_name compile;

3.2 检查不可用的主键:

select owner,constraint_name,table_name from dba_constraints

where status!='ENABLED' and constraint_type='P';

目的:若查询有数据,执行下面语句的执行结果。

select 'alter table '||owner||'.'||table_name||' '||constraint_name||';' from dba_constraints

where status!='ENABLED' and constraint_type='P';

3.3 检查不可用的触发器:

select owner,trigger_name

from dba_triggers where status!='ENABLED';

目的:若查询有数据,执行下面语句的执行结果。

select 'alter trigger '||owner||'.'||trigger_name||' enable;' from dba_triggers where status!='ENABLED';

enable constraints

3.4 检查session和process:

对照当前使用数和参数设置值: Select count(*) from v$session ; Select count(*) from v$process; 数据库设置值:

select name,value from v$parameter where name in('sessions','processes');

注:以 ‘v$’开头的表需要是业务高峰时的数据对分析才有作用。

注:现场工程在使用pl/sql developer时,因多个sql窗口会增加sessions和process数,尽量在一个sql窗口操作。

3 / 7

Oracle数据库日常检查文档

3.5 检查job: 检查参数:

当前数据库的并发可执行的job数量: select name,value from v$parameter

where name='job_queue_processes';

查询当前数据中所有的job:

select * from dba_jobs;

涉及检查项:

LOG_USER,提交任务的用户 ;

PRIV_USER ,赋予任务权限的用户 ;

SCHEMA_USER ,对任务作语法分析的用户模式; THIS_DATE ,表示正在运行任务的开始时间;

LAST_DATE:最后一次成功运行完此job的时间; NEXT_DATE:下一次运行job的开始时间; INTERVAL:用于计算下一运行时间的表达式; What:执行任务的PL/SQL块。 结果判断:

1、 若有创建在sys或是system用户下的业务job需要删除,重新创建在业务用户下。 2、 如果Next_date是晚上21点执行的job,在第二天上午9点查询dba_jobs表时,

this_date列不为空表示此job仍在执行。那么就需要优化what列显示的存储过程了。

3、 当FAILURE<>0时,job不能执行成功。检查并发可执行的job进程数是否够用,根

据next_date判断下次需要并发执行的job数与参数job_queue_processes的设置数比较?若不够,

修改方法:

Alter system set job_queue_processes=11 scope=both;

3.6 检查数据文件的状态:

select * from v$data status not in('SYSTEM','ONLINE');

目的:若查询无结果,表示数据文件正常。

4 / 7

Oracle数据库日常检查文档

3.7 检查数据库的模式:

Select name,Created, Log_Mode From V$Database;

若log_mode为archive,当value不为空时,检查对应目录下的空间使用情况:

select value from v$parameter where name= 'log_archive_dest_1';

若归档日志存在use_db_recovery_下,检查下面视图归档日志的使用情况:

select percent_space_used

from v$flash_recovery_area_usage where 'ARCHIVELOG';

当空间使用百分比(percent_space_used)为85%时,需要释放空间。

若使用的是asm 自动存储管理,检查空闲大小是否够用:

select group_number,name,total_MB as 总大小,free_MB as 空闲大小 from v$asm_diskgroup; 3.8 检查锁的情况: 检查是否发生阻塞:

select /*+ ordered*/ sql_text, spid, p.pid, s.sid, s.username, s.program, process from v$sqlarea q, v$session s, v$process p where q.address = s.sql_address

and q.hash_value = s.sql_hash_value and s.paddr = p.addr and exists (select sid

from v$lock

where block=1 and sid=s.sid);

目的:若有结果,发回sql的执行结果,开发人员检查sql涉及的程序。 导出结果后杀掉session。

5 / 7

Oracle数据库日常检查文档

杀session步骤:

Alter system kill session ‘SID,SERIAL#’;

有时候杀掉session后,session对应的进程好长时间不释放,占用资源,需要从操作系统级杀掉session:

select spid, osuser, s.program

from v$session s,v$process p

where s.paddr=p.addr and s.sid=&sid;

1)在unix上,用root身份执行命令: #kill -9 123(上面语句查询出的spid)

2)在windows用orakill杀死线程,orakill是oracle提供的一个可执行命令,语法为: orakill sid thread 例如:orakill cangzhoucg 123

检查是否有锁等待:

select /*+ ordered*/ sql_text, spid, p.pid, s.sid, s.username, s.program, process from v$sqlarea q, v$session s, v$process p where q.address = s.sql_address

and q.hash_value = s.sql_hash_value and s.paddr = p.addr and exists (select sid

from v$lock

where request > 0 and block<>1 and sid=s.sid);

检查目的:检查哪些语句一直在等待资源释放,正常的锁等待时间不会持续很长,持续时间较长的就尽快导出结果以便处理。

4. 检查数据库的alert日志

执行下面sql获得alert日志的路径:

select a.value||' 下的alert_'||b.instance_name||'.log' from v$parameter a,gv$instance b

where a.name ='background_dump_dest';

注:若数据库为集群环境,查出的结果是二条,需要分别取二台数据库服务器所查目录下的alert日志。

目的:检查最近日期的alert日志是否有以’ora-’开头的错误或异常信息。

5. 检查tlog的错误日志

select * from ulog.tlog where llevel=30 and ldate>=sysdate-1 order by id desc;

6 / 7

Oracle数据库日常检查文档

目的:检查tlog表的错误日志。

6.

数据库连接不上时

当发现连接不上数据库,若是单实例的从以下方面检查: 1、 检查网络是否正常;

2、 检查数据库目前的运行状态,若用pl/sql也连接不上时,采用sqlplus执行。 Select instance_name,status from v$instance;--正常情况下status为open状态

若是rac,首先检查集群服务是否都启动正常:

Crs_stat –t --此命令在windows下直接在c:>下执行,若在linux或是unix下,切换操作系统用户oracle下,执行此命令,正常情况下状态都应该online。

7 / 7

因篇幅问题不能全部显示,请点此查看更多更全内容