一、日常巡检命令
1、检查Oracle实例状态
-
SQL> set pages 600 lines 600 -
SQL> select instance_name,host_name,startup_time,status,database_status from v$instance;
说明:“STATUS”表示Oracle当前的实例状态,必须为“OPEN”;“DATABASE_STATUS”表示Oracle当前数据库的状态,必须为“ACTIVE”。

2、检查归档是否打开
-
SQL> select name,log_mode,open_mode from v$database; -
SQL> archive log list
说明:两个命令都可以查看。“LOG_MODE”表示Oracle当前的归档方式。“ARCHIVELOG”表示数据库运行在归档模式下,“NOARCHIVELOG”表示数据库运行在非归档模式下。在我们的系统中数据库必须运行在归档方式下。


如没开启归档,需要开启归档,步骤如下:
-
SQL> startup mount #启动数据库到mount状态,必须的 -
SQL> alter database archivelog; #打开归档 -
SQL> archive log list; #检查归档状态 -
SQL> alter database open; #打开数据库 -
SQL> select instance_name,host_name,startup_time,status,database_status from v$instance;#查看实例状态
-
SQL> alter system switch logfile; #切换日志


3、检查oracle数据库的服务进程
-
[oracle@myoracledemo ~]$ ps -ef|grep ora_|grep -v grep&&ps -ef|grep ora_|grep -v grep|wc -l
说明:在检查Oracle的进程命令输出后,输出显示至少应包括以下一些进程:
. Oracle写数据文件的进程,输出显示为:“oradbw0_CKDB”
. Oracle写日志文件的进程,输出显示为:“ora_lgwr CKDB”
. Oracle监听实例状态的进程,输出显示为:“orasmon CKDB”
. Oracle监听客户端连接进程状态的进程,输出显示为:“orapmon CKDB”
. Oracle进行归档的进程,输出显示为:“oraarc0 CKDB”
. Oracle进行检查点的进程,输出显示为:“orackpt CKDB”
. Oracle进行恢复的进程,输出显示为:“orareco CKDB”

4、检查Oracle监听状态
-
[oracle@myoracledemo ~]$ lsnrctl status
说明:“Services Summary”项表示Oracle的监听进程正在监听哪些数据库实例,输出显示中至少应该有“orcl11g”这一项。

-
[oracle@myoracledemo ~]$ ps -ef|grep lsn|grep -v grep

4、检查系统和oracle日志文件
-
[root@myoracledemo ~]# cat /var/log/messages |grep failed
说明:查看是否有与Oracle用户相关的报错信息

5、检查Oracle日志文件
-
[oracle@myoracledemo log]$ cat /u01/app/oracle/diag/rdbms/orcl11g/orcl11g/trace/alert_orcl11g.log |grep ora- -
[oracle@myoracledemo log]$ cat /u01/app/oracle/diag/rdbms/orcl11g/orcl11g/trace/alert_orcl11g.log |grep err -
[oracle@myoracledemo log]$ cat /u01/app/oracle/diag/rdbms/orcl11g/orcl11g/trace/alert_orcl11g.log |grep fail

查看重做日志文件
-
SQL> select group#,members,bytes,status,archived from v$log;

6、检查Oracle控制文件状态
-
SQL> select status,name from v$controlfile;
说明:“STATUS”应该为空。状态为空表示控制文件状态正常。

7、检查Oracle在线日志状态
-
SQL> select group#,status,type,member from v$logfile;
说明:输出结果应该有3条以上(包含3条)记录,“STATUS”应该为非“INVALID”,非“DELETED”。注:“STATUS”显示为空表示正常

8、检查Oracle表空间的状态
-
SQL> select tablespace_name,status from dba_tablespaces;
说明:输出结果中STATUS应该都为ONLINE。

9、检查Oracle所有数据文件状态
-
SQL> select name,status from v$datafile;
说明:输出结果中“STATUS”应该都为“ONLINE”。
-
SQL> select file_name,status from dba_data_files;
输出结果中“STATUS”应该都为“AVAILABLE”。

10、检查无效对象
-
SQL> select owner,object_name,object_type from dba_objects where status!='VALID' and owner!='SYS' and owner!='SYSTEM';
说明:如果有记录返回,则说明存在无效对象。若这些对象与应用相关,那么需要重新编译生成这个对象
-
SQL> SELECT owner, object_name, object_type FROM dba_objects WHERE status= 'INVALID';

11、检查所有回滚段状态
-
SQL> select segment_name,status from dba_rollback_segs;
说明:输出结果中所有回滚段的“STATUS”应该为“ONLINE”。

12、检查数据库连接情况
-
SQL> select count(*) from v$session; -
SQL> set pages 600 lines 600 -
SQL> select sid,serial#,username,program,machine,status from v$session;
说明:SID 会话(session)的ID号;
SERIAL# 会话的序列号,和SID一起用来唯一标识一个会话;
USERNAME 建立该会话的用户名;
PROGRAM 这个会话是用什么工具连接到数据库的;
STATUS 当前这个会话的状态,ACTIVE表示会话正在执行某些任务,INACTIVE表示当前会话没有执行任何操作;
如果建立了过多的连接,会消耗数据库的资源,同时,对一些“挂死”的连接可能需要手工进行清理。如果DBA要手工断开某个会话,则执行:(一般不建议使用这种方式去杀掉数据库的连接,这样有时候session不会断开。容易引起死连接。建议通过sid查到操作系统的spid,使用ps –ef|grep spidno的方式确认spid不是ORACLE的后台进程。使用操作系统的kill -9命令杀掉连接 )
-
SQL> alter system kill session 'SID,SERIAL#'; -
SQL> alter system kill session '137,27';



注意:上例中SID为1到10(USERNAME列为空)的会话,是Oracle的后台进程,不要对这些会话进行任何操作。
13、检查表空间的使用情况
-
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";
14、检查一些扩展异常的对象
-
SQL>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;
15、检查system表空间内的内容
-
SQL>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';
说明:如果记录返回,则表明system表空间内存在一些非system和sys用户的对象。应该进一步检查这些对象是否与我们应用相关。如果相关请把这些对象移到非System表空间,同时应该检查这些对象属主的缺省表空间值。

16、检查数据库的等待事件
-
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等等待事件时,需要对其进行分析,可能存在问题的语句

17、查找前十条性能差的sql
-
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 ;

18、等待时间最多的5个系统等待事件的获取
-
SQL>SELECT * FROM (SELECT * FROM V$SYSTEM_EVENT WHERE EVENT NOT LIKE 'SQL%' ORDER BY TOTAL_WAITS DESC) WHERE ROWNUM<=5;

19、检查运行很长的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;

20、检查碎片程度高的表
-
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);

21、检查表空间的 I/O 比例
-
SQL> 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;

22、检查文件系统的 I/O 比例
-
SQL> 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#;

23、检查死锁及处理
-
col sid for 999999 -
col username for a10 -
col schemaname for a10 -
col osuser for a16 -
col machine for a16 -
col terminal for a20 -
col owner for a10 -
col object_name for a30 -
col object_type for a10 -
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;

处理方式:
-
oracle级kill掉该session: -
alter system kill session '&sid,&serial#'; -
操作系统级kill掉session: -
#>kill -9 pid
24、检查是否有僵尸进程
-
SQL> select spid from v$process where addr not in (select paddr from v$session);

25、检查消耗CPU最高的进程
-
SQL> 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)) SQL FROM 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%';
输入进程PID1868后,可以看到具体的信息

26、检查缓冲区命中率
-
SQL> 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' ;

27、检查共享池命中率
-
SQL> select sum(pinhits)/sum(pins)*100 from v$librarycache;

28、检查排序区
-
SQL> select name,value from v$sysstat where name like '%sort%';

29、检查日志缓冲区
-
SQL> select name,value from v$sysstat where name in ('redo entries','redo buffer allocation retries');

30、检查Oracle Job是否有失败
-
SQL> 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;

31、监控数据量的增长情况
-
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;

32、检查失效的索引
-
SQL> select index_name,table_name,tablespace_name,status From dba_indexes Where owner='CTAIS2' And status<>'VALID';

33、检查不起作用的索引
-
SQL> SELECT owner, constraint_name, table_name, constraint_type, status -
FROM dba_constraints -
WHERE status ='DISABLE' and constraint_type='P';

34、检查无效的trigger
-
SQL> SELECT owner, trigger_name, table_name, status FROM dba_triggers WHERE status = 'DISABLED';
如有失效触发器则启用,如:
-
Sql>alter Trigger TRIGGER_NAME Enable;
35、查看数据库使用参数文件(SPFILE 还是 PFILE)
-
SQL> show parameter spfile;

36、开启AWR报告进行性能分析
-
SQL>show parameter statistics_level; #查看awr是否启用 -
SQL> ALTER SYSTEM SET statistics_level = ALL SCOPE = BOTH; #启动设置参数 -
SQL> show parameter statistics_level;#查看awr参数 -
SQL> select * from dba_hist_wr_control; 查看当前的AWR保存策略 -
SQL> exec DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT (); #手动生成快照 -
SQL>select * from sys.wrh$_active_session_history 查看历史快照 -
SQL>@$ORACLE_HOME/rdbms/admin/awrrpt.sql #生成AWR报告(生成整个数据库) -
------------------------------------------------------------------------------ -
SQL>@$ORACLE_HOME/rdbms/admin/awrgrpt.sql #生成 Oracle RAC AWR 报告 -
SQL>@$ORACLE_HOME/rdbms/admin/awrrpti.sql #生成 RAC 环境中特定数据库实例的 AWR 报告 -
SQL>@$ORACLE_HOME/rdbms/admin/awrgrpti.sql #生成 Oracle RAC 环境中多个数据库实例的 AWR 报告 -
SQL>@$ORACLE_HOME/rdbms/admin/awrsqrpt.sql #生成 SQL 语句的 AWR 报告 -
SQL>@$ORACLE_HOME/rdbms/admin/awrsqrpi.sql #生成特定数据库实例上某个 SQL 语句的 AWR 报告 -
SQL>@$ORACLE_HOME/rdbms/admin/awrddrpt.sql #生成单实例 AWR 时段对比报告

切换到主机目录下,查看html文件即可

37、查询系统检查点SCN的命令
-
SQL> select CHECKPOINT_CHANGE# from v$database;

38、查询控制文件中数据文件的SCN命令
-
SQL> select name,file#,checkpoint_change# from v$datafile;

39、查询数据文件头部的SCN号
-
select name,checkpoint_change# from v$datafile_header;

40、控制文件中的数据文件终止scn
-
SQL> select name,last_change# from v$datafile;

41、查询字符集命令
-
SQL> select userenv ('language') from dual;

42、检查软分析百分比
-
SQL> select sum(a.value)/count(*) pct from v$metric_history a where a.metric_name = 'Soft Parse Ratio' and group_id = 2 and a.begin_time >= sysdate - 1 and a.end_time < sysdate;

43、检查share pool可用空间百分比
-
SQL> select freesize freesize_MB, totalsize totalsize_MB, round((freesize/totalsize)*100,2) " FREE%" from (select ceil(sum(bytes) / (1024 * 1024)) totalsize from v$sgastat where pool = 'shared pool' ), (select ceil(bytes / (1024 * 1024)) freesize from v$sgastat where name = 'free memory' and pool = 'shared pool');

二、运维小技巧
1、查询用户下所有创建表的语句
-
SQL>select -
'select dbms_metadata.get_ddl('||''''||'TABLE'||''''||','||''''||table_name||''''||') from dual;'||chr(10)||'select '||''''||'/'||''''|| ' from dual;' -
from user_tables;

2、查询当时创建用户的sql语句
-
SQL>select dbms_metadata.get_ddl('USER',u.username) from dba_users u;

3、创建DBLINK
-
create public database link HO -
connect to SKDATA identified by oracle -
using '(DESCRIPTION = -
(ADDRESS_LIST = -
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.59.249)(PORT = 1521)) -
) -
(CONNECT_DATA = -
(SERVICE_NAME = SYS$USERS) -
) -
)';

4、查询是否创建了DBLINK
-
SQL> select * from dba_db_links;

5、设置密码无期限
-
SQL> ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;

6、Rman物理备份
-
[oracle@myoracledemo ~]$ rman target / -
RMAN> show all; -
RMAN> crosscheck archivelog all; -
RMAN> crosscheck backup; -
RMAN> delete expired archivelog all; -
RMAN> delete expired backup; -
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON; -
RMAN> run -
{ -
allocate channel d1 type disk; -
sql 'alter system archive log current'; -
backup format '/home/oracle/rmanbak/lacgsfull_%U' database include current controlfile plus archivelog ; -
release channel d1; -
} -
RMAN> list backup of database; #查看备份文件




备份脚本:
-
[oracle@myoracledemo rmanbak]$ cat 1.sh -
#!/bin/bash -
. ~/.bash_profile -
echo -------------------------start-----------------------;date -
rman target /<<EOF -
backup as compressed backupset database include current controlfile format '/home/oracle/rmanbak/full_%U.bak'; -
delete noprompt obsolete; -
#自动删除七天前的归档日志 -
delete noprompt force archivelog all completed before 'sysdate-7'; -
exit; -
EOF -
echo -------------------------end-----------------------;date
添加定时任务:
-
[oracle@myoracledemo rmanbak]$ crontab -l -
0 1 * * * /home/oracle/rmanbak/rmanbak.sh >rmanbak.log 2>&1
7、定时删除归档日志
-
[oracle@myoracledemo ~]$ cat del_arch.sh -
#!/bin/bash -
source ~/.bash_profile -
deltime=`date +"20%y%m%d%H%M%S"` -
rman target / nocatalog msglog /home/oracle/scripts/del_arch_${deltime}.log<<EOF -
crosscheck archivelog all; -
delete noprompt archivelog until time 'sysdate-7'; -
delete noprompt force archivelog until time 'SYSDATE-10'; -
EOF -
添加定时任务删除 -
[root@myoracledemo ~]# cat /var/spool/cron/oracle -
0 1 * * * /home/oracle/rmanbak/rmanbak.sh >rmanbak.log 2>&1 -
12 00 * * * /home/oracle/del_arch.sh

8、检查回收站的配置
-
SQL> select y.ksppstvl value from sys.x$ksppi x, sys.x$ksppcv y where x.inst_id = userenv('Instance') and y.inst_id = userenv('Instance') and x.indx = y.indx and x.ksppinm like lower('recyclebin');

