一、每天的工作
1、检查数据库状态
确认所有的INSTANCE状态以及listener状态正常,登陆到所有数据库或例程,检测ORACLE后台进程:
$ ps –ef|grep ora
$ lsnrctl status
SQL> select status from v$instance;(单实例)
SQL> select INSTANCE_NAME,host_name,status,active_state,STARTUP_TIME from gv$instance;(RAC集群)
DataGuard备库检查:
查看归档日志最大的序列号:
SQL>SELECT MAX(SEQUENCE#), THREAD# FROM V$ARCHIVED_LOG GROUP BY THREAD#;---如果是单实例对单实例dg,这里的最大序列号应该一样
查看备库归档日志应用情况:
SQL>set linesize 200
SQL>col name for a70
SQL>SELECT
ARCH.THREAD# "Thread",name,
ARCH.SEQUENCE# "Last Sequence Received",
APPL.SEQUENCE# "Last Sequence Applied",
(ARCH.SEQUENCE# - APPL.SEQUENCE#) "Difference"
FROM
(SELECT THREAD# ,SEQUENCE#,name FROM V$ARCHIVED_LOG WHERE (THREAD#,FIRST_TIME ) IN (SELECT THREAD#,MAX(FIRST_TIME) FROM V$ARCHIVED_LOG GROUP BY THREAD#)) ARCH,
(SELECT THREAD# ,SEQUENCE# FROM V$LOG_HISTORY WHERE (THREAD#,FIRST_TIME ) IN (SELECT THREAD#,MAX(FIRST_TIME)
FROM V$LOG_HISTORY GROUP BY THREAD#)) APPL
WHERE ARCH.THREAD# = APPL.THREAD#
ORDER BY 1;
查询DataGuard当前处于哪种日志传输方式:
SQL>select process,client_process,sequence#,status from v$managed_standby;
PROCESS列显示进程信息
CLIENT_PROCESS列显示对应的主数据库中的进程
SEQUENCE#列显示归档redo的序列号
STATUS列显示的进程状态
查看归档日志是否连续:
SQL>select * from v$archive_gap;
2、检查文件系统和asm存储空间
如果文件系统或者asm的剩余空间过小或增长较快,需对其进行确认并删除不用的文件以释放空间。
文件系统检查
$df –k
$df -h
Asm检查
Sql> select name,state,total_mb,free_mb,
round(free_mb/total_mb,3)*100||'%' pt_free
from v$asm_diskgroup;
3、检查警告日志文件(alert_sid.log)
Oracle在运行过程中,会在警告日志文件(alert_SID.log)中记录数据库的一些运行情况:数据库的启动、关闭,启动时的非缺省参数;数据库的重做日志切换情况,记录每次切换的时间,及如果因为检查点(checkpoint)操作没有执行完成造成不能切换,会记录不能切换的原因;对数据库进行的某些操作,如创建或删除表空间、增加数据文件;
数据库发生的错误,如表空间不够、出现坏块、数据库内部错误(ORA-600)定期检查日志文件,根据日志中发现的问题及时进行处理
问题 | 处理 |
启动参数不对 | 检查初始化参数文件 |
因为检查点操作或归档操作没有完成造成重做日志不能切换 | 如果经常发生这样的情况,可以考虑增加重做日志文件组;想办法提高检查点或归档操作的效率; |
有人未经授权删除了表空间 | 检查数据库的安全问题,是否密码太简单;如有必要,撤消某些用户的系统权限 |
出现坏块 | 检查是否是硬件问题(如磁盘本生有坏块),如果不是,检查是那个数据库对象出现了坏块,对这个对象进行重建或者用备份恢复 |
表空间不够 | 增加数据文件到相应的表空间 |
出现ORA-600 | 根据日志文件的内容查看相应的TRC文件,如果是Oracle的bug,要及时打上相应的补丁 |
10g 的alert_SID.log通常是在$ORACLE_BASE/admin/<SID>/bdump目录下,
11g 的alert_SID.log通常是在 $ORACLE_BASE/diag/rdbms/<SID>/<SID>/trace(文本文件)目录下
或
$ORACLE_BASE/diag/rdbms/<SID>/<SID>/alert(xml格式文件)目录下
使用 Unix ‘tail’或者more命令查看该日志信息(为了方便查询,每天查询后将查询的日志mv到与日志同一目录下的bak目录下);
tail -500 alert.log|egrep -i "Error|Fail|WARNING|Invalid|ORA-|Global Enqueue Services|dead|ORA-"
4、定期检查listener日志
如果这些日志量非常大,占用很大的资源空间,可考虑定期删除以便释放资源。
通过 SQL> show parameter user_dump_dest参数查看其存放位置;
Listener日志: $ORACLE_HOME/network/log
tail -500 log|egrep -i "Error|Fail|WARNING|Invalid|ORA-|Global Enqueue Services|dead|ORA-"
5、检查数据库连接信息
定时对数据库的连接情况进行检查,看与数据库建立的会话数目是不是正常,如果建立了过多的连接,会消耗数据库的资源。同时,对一些“挂死”的连接,可能需要手工进行清理。
以下的SQL语句列出当前数据库建立的会话情况:
SQL> Select count(*) from v$session; ――查看当前会话连接数(单实例)
SQL> select INST_ID,count(*) from gv$session group by INST_ID;
---查看所有实例当前会话连接数(rac集群)
SQL> set linesize 180
SQL> col USERNAME for a20
SQL> col program for a50
SQL> select sid,serial#,username,program,machine,status from v$session;
其中,
SID 会话(session)的ID号;
SERIAL# 会话的序列号,和SID一起用来唯一标识一个会话;
USERNAME 建立该会话的用户名;
PROGRAM 这个会话是用什么工具连接到数据库的;
STATUS 当前这个会话的状态,ACTIVE表示会话正在执行某些任务,INACTIVE表示当前会话没有执行任何操作;
如果要手工断开某个会话,则执行:(一般不建议使用这种方式去杀掉数据库的连接,这样有时候session不会断开。容易引起死连接。建议通过sid查到操作系统的spid,使用ps –ef|grep spidno的方式确认spid不是ORACLE的后台进程。使用操作系统的kill -9命令杀掉连接)
SQL> alter system kill session 'SID,SERIAL#';
注意:
USERNAME列为空的会话,是Oracle的后台进程,不要对这些会话进行任何操作。
6、检查数据库当日备份的有效性。
对RMAN备份方式: 检查第三方备份工具的备份日志以确定备份是否成功
对EXPORT备份方式: 检查exp日志文件以确定备份是否成功
对其他备份方式: 检查相应的日志文件
7、检查数据文件的状态
SQL>set linesize 150
SQL>col file_name for a50
SQL>select file_name,status from dba_data_files;
SQL>select count(*) from dba_data_files;
SQL>select count(*) from dba_data_files where status='AVAILABLE';如果数据文件的STATUS列不是AVAILABLE,那么就要采取相应的措施,如对该数据文件进行恢复操作,或重建该数据文件所在的表空间。
8、检查表空间的使用情况
SQL>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";
如果表空间剩余空间不够,删除已经过期的数据对象,如果无对象可删除,给相应表空间增加数据文件。
SQL>alter tablespace <tablespace_name> add datafile ‘<file>’ size <size> autoextend off;
数据库结构结构发生了改变,备份一下控制文件:
SQL>alter database backup controlfile to '/home/backup/control.bak';
9、检查数据库的等待事件
SQL>set pages 80
SQL>set lines 120
SQL>col event for a40
SQL>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%';
如果数据库长时间持续出现大量像latch free,enqueue,buffer busy waits,db file sequential read,db file scattered read等等待事件时,需要对其进行分析,可能存在问题的语句。
10、索表的处理
查询目前锁对象信息
SQL>col sid for 999999
SQL>col username for a10
SQL>col schemaname for a10
SQL>col osuser for a16
SQL>col machine for a16
SQL>col terminal for a20
SQL>col owner for a10
SQL>col object_name for a30
SQL>col object_type for a10
SQL>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;
解锁处理:
SQL>alter system kill session '&sid,&serial#';
11、检查数据库性能,记录数据库的cpu使用、io、内存情况等等
使用vmstat,iostat,sar,top等命令进行信息收集并检查这些信息,判断资源使用情况。
12、查看是否有僵死进程
SQL>select spid from v$process where addr not in (select paddr from v$session);
有些僵尸进程有阻塞其他业务的正常运行,定期杀掉僵尸进程
二、每周的工作
1、监控数据量的增长情况
根据本周每天的检查情况找到空间扩展很快的数据库对象,并采取相应的措施
1)删除历史数据
规定数据库中至少保留多长时间的历史数据,所以以前的历史数据可以考虑备份然后进行清除以便释放其所占的资源空间。
2) 扩表空间
SQL>alter tablespace <tablespace_name> add datafile ‘<file>’ size <size> autoextend off;
注意:
在数据库结构发生变化时,如增加了表空间,增加了数据文件或重做日志文件这些操作,都会造成Oracle数据库控制文件的变化,DBA应及进行控制文件的备份,备份方法:
执行SQL语句:
SQL>alter database backup controlfile to '/home/backup/control.bak';
或:
SQL>alter database backup controlfile to trace;
这样,会在USER_DUMP_DEST(初始化参数文件中指定)目录下生成创建控制文件的SQL命令。
2、表空间碎片查询和整理
1)表空间碎片
SQL>select
tablespace_name,
sqrt(max(blocks) / sum(blocks)) * (100 / sqrt(sqrt(count(blocks)))) fsfi
from dba_free_space
group by tablespace_name
order by 2;
如果fsif<30,则说明碎片化程度高,需要碎片整理
可以将表空间的缺省存储参数pctincrease改为非0,一般将其设为1,如:
alter tablespace tablespace_name default storage(pctincrease 1);
这样smon便会将自由范围自动合并。
也可以手工合并自由范围:
alter tablespace tablespace_name coalesce;
2)表碎片
SQL>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);
通过上面sql找出碎片程度高的表,用exp/expdp导出,然后drop表,再用imp/impdp导入。
3、索引监控(11g只需设置optimizer_capture_plan_baselines=true)
找出查询效率低的表,如果有索引查看索引的状态,如果无索引,建立索引。
开始索引监控:
SQL> alter index index_name monitoring usage;
查看索引有没被使用:
SQL> select INDEX_NAME,MONITORING,USED from v$object_usage;
关闭索引监控(索引监控对性能有影响,监控完关闭)
SQL> alter index index_name nomonitoring usage;
4、检查无效的数据库对象,不起作用的约束,无效的触发器
SQL>SELECT owner, object_name, object_type FROM dba_objects WHERE status= 'INVALID';
SQL>SELECT owner, constraint_name, table_name, constraint_type, status
FROM dba_constraints WHERE status ='DISABLE' and constraint_type='P';
SQL>SELECT owner, trigger_name, table_name, status FROM dba_triggers WHERE status = 'DISABLED';
5、检查数据库定时作业的完成情况
如果数据库使用了Oracle的JOB来完成一些定时作业,要对这些JOB的运行情况进行检查:
SQL>select job,log_user,last_date,failures from dba_jobs
Where failures>0;
如果FAILURES列是一个大于0的数的话,说明JOB运行失败,要进一步的检查
6、每周业务高峰期收集2次awr和addm报告
Awr:
SQL> @?rdbms/admin/awrrpt.sql(单实例)
SQL> @?rdbms/admin/awrrpti.sql(rac集群)
Addm:
SQL> @?/rdbms/admin/addmrpt.sql(单实例)
SQL> @?/rdbms/admin/addmrpti.sql(rac集群)
三、每月的工作
1、寻找数据库性能调整的机会
根据awr收集的统计数据和addm给出的建议,比较每天对数据库性能的监控报告,确定是否有必要对数据库性能进行调整
2、数据库性能调整
如有必要,进行性能调整
3、提出下一步空间管理计划
根据每周的监控,提出空间管理的改进方案