数据库日常检查文档
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
因篇幅问题不能全部显示,请点此查看更多更全内容