OracleDBA日常工作手册第一章.事前阶段一、日常工作-每天应做工作内容1、工作内容-日常环境监控1.1系统运行环境监控检查文件系统以及oracle数据库数据文件所在卷的使用(剩余空间),如果文件系统的剩余空间小于20%,需要删除不用的文件以释放空间;UNIX系统的文件系统及数据文件所在卷的空间使用率:su–oraprod或者su-oratestAIX、linux查看磁盘空间:df–kHP-UX查看磁盘空间:bdf1.2数据库运行状况监控1.2.1外部确认所有的INSTANCE状态正常(保证实例正常),检查Oracle实例核心后台进程是否都存在、状态是否正常$ps-ef|greporaprod查看数据库实例是否能正常连接、访问SQLselectstatus,instance_namefromv$instance;监听是否正常$lsnrctlstatus1.2.2内部是否所有表空间都处于online状态SQLselecttablespace_name,statusfromdba_tablespaces;selectfile#,status,namefromv$datafile_header;selectfile_name,status,tablespace_namefromdba_data_files;如果数据文件的STATUS列不是AVAILABLE或者ONLINE,那么就要采取相应的措施,如对该数据文件进行恢复操作,或重建该数据文件所在的表空间。Oracle数据库日志文件是否正常SQLSelect*fromv$log;SQLSelect*fromv$logfile;1).检查trace文件记录alert和trace文件中的错误。telnet192.168.150.1su–oraprod在oraprod用户下$cd到bdump目录,通常是$ORACLE_BASE/admin/SID/bdump使用Unix的‘tail-f’命令来查看alert_SID.log文件如果发现任何新的ORA-错误,记录并解决2).查看DBSNMP的运行情况检查每个被管理机器的‘DBSNMP’进程并将它们记录到日志中。在UNIX中,在命令行中,键入ps–ef|grepdbsnmp,将回看到2个DBSNMP进程在运行。如果没有,重启DBSNMP。(注意:此步骤在oraprod下只有1个进程,需要研究)3).检查回滚段回滚段的状态一般是在线的,除了一些为复杂工作准备的专用段一般状态是离线的。a)每个数据库都有一个回滚段名字的列表。b)你可以用V$ROLLSTAT来查询在线或是离线的回滚段的现在状态;1.2.3日常操作1).不要在服务器上直接执行rm操作当有文件需要删除时,把这些文件mv到一个规定的文件夹,然后CD进入此文件夹再进行删除操作。(注意:在rm日志文件时直接rm即可,若rm文件夹一定要rm–r)2).数据库备份校验命令:rmantarget/连接到数据库,rmanrestoredatabasevalidate;3).查看数据库连接信息定时对数据库的连接情况进行检查,看与数据库建立的会话数目是不是正常,如果建立了过多的连接,会消耗数据库的资源。同时,对一些“挂死”的连接,可能需要手工进行清理。以下的SQL语句列出当前数据库建立的会话情况:Selectcount(*)fromv$session;――查看当前会话连接数selectsid,serial#,username,program,machine,statusfromv$session;其中,SID会话(session)的ID号;SERIAL#会话的序列号,和SID一起用来唯一标识一个会话;USERNAME建立该会话的用户名;PROGRAM这个会话是用什么工具连接到数据库的;STATUS当前这个会话的状态,ACTIVE表示会话正在执行某些任务,INACTIVE表示当前会话没有执行任何操作;如果DBA要手工断开某个会话,则执行:altersystemkillsession'SID,SERIAL#';注意:USERNAME列为空的会话,是Oracle的后台进程,不要对这些会话进行任何操作4).查看并发会话量并发会话量正常时段为60以下,查询系统在20以下,如果超过这些指标,则认为系统有阻塞情况,需要查找原因,引起关注。查询系统并发的脚本为:selectcount(1)fromv$sessionwherestatus='ACTIVE'andusernamenotin('SYS','SYSTEM');5).查看是否有僵死进程selectspidfromv$processwhereaddrnotin(selectpaddrfromv$session);有些僵死进程有阻塞其他业务的正常运行,定期杀掉僵死进程6).检查数据库定时作业的完成情况如果数据库使用了Oracle的JOB来完成一些定时作业,要对这些JOB的运行情况进行检查:selectjob,log_user,last_date,failuresfromdba_jobs;如果FAILURES列是一个大于0的数的话,说明JOB运行失败,要进一步的检查。7).控制文件的备份在数据库结构发生变化时,如增加了表空间,增加了数据文件或重做日志文件这些操作,都会造成Oracle数据库控制文件的变化,DBA应及进行控制文件的备份,备份方法是:执行SQL语句:alterdatabasebackupcontrolfileto'/home/backup/control.bak';或:alterdatabasebackupcontrolfiletotrace;这样,会在USER_DUMP_DEST(初始化参数文件中指定)目录下生成创建控制文件的SQL命令。8).数据库坏块的处理当Oracle数据库出现坏块时,Oracle会在警告日志文件(alert_SID.log)中记录坏块的信息:ORA-01578:ORACLEdatablockcorrupted(file#7,block#BLOCK)ORA-01110:datafileAFN:'/oracle1/oradata/V920/oradata/V816/users01.dbf'其中,<AFN>代表坏块所在数据文件的绝对文件号,BLOCK代表坏块是数据文件上的第几个数据块出现这种情况时,应该首先检查是否是硬件及操作系统上的故障导致Oracle数据库出现坏块。在排除了数据库以外的原因后,再对发生坏块的数据库对象进行处理。解决方式:1.确定发生坏块的数据库对象SELECTtablespace_name,segment_type,owner,segment_nameFROMdba_extentsWHEREfile_id=AFNANDBLOCKbetweenblock_idANDblock_id+blocks-1;2.决定修复方法如果发生坏块的对象是一个索引,那么可以直接把索引DROP掉后,再根据表里的记录进行重建;如果发生坏块的表的记录可以根据其它表的记录生成的话,那么可以直接把这个表DROP掉后重建;如果有数据库的备份,则恢复数据库的方法来进行修复;如果表里的记录没有其它办法恢复,那么坏块上的记录就丢失了,只能把表中其它数据块上的记录取出来,然后对这个表进行重建。3.用Oracle提供的DBMS_REPAIR包标记出坏块execDBMS_REPAIR.SKIP_CORRUPT_BLOCKS('schema','tablename');4.使用Createtableasselect命令将表中其它块上的记录保存到另一张表上createtablecorrupt_table_bakasselect*fromcorrupt_table;5.用DROPTABLE命令删除有坏块的表droptablecorrupt_table;6.用altertablerename命令恢复原来的表altertablecorrupt_table_bakrenametocorrupt_table;7.如果表上存在索引,则要重建表上的索引1.3检查oracle数据库表空间的使用情况1.3.1检查表空间的使用情况1、查询表空间的总容量selecttablespace_name,sum(bytes)/1024/1024MBfromdba_data_filesgroupbytablespace_name;2、查询表空间未使用的大小selecttablespace_name,sum(bytes)/1024/1024MBfromdba_free_spacegroupbytablespace_name;3、(一)查看表空间已经使用的百分比selecta.tablespace_name,a.bytes/1024/1024SumMB,(a.bytes-b.bytes)/1024/1024usedMB,b.bytes/1024/1024freeMB,round(((a.bytes-b.bytes)/a.bytes)*100,2)percent_usedfrom(selecttablespace_name,sum(bytes)bytesfromdba_data_filesgroupbytablespace_name)a,(selecttablespace_name,sum(bytes)bytes,max(bytes)largestfromdba_free_spacegroupbytablespace_name)bwherea.tablespace_name=b.tablespace_nameorderby((a.bytes-b.bytes)/a.bytes)desc(二)查看表空间空闲百分比selecta.tablespace_name,round(a.total_size)total_size(MB),round(a.total_size)-round(b.free_size,3)used_size(MB),round(b.free_size,3)free_size(MB),round(b.free_size/total_size*100,2)||'%'free_ratefrom(selecttablespace_name,sum(bytes)/1024/1024total_sizefromdba_data_filesgroupbytablespace_name)a,(selecttablespace_name,sum(bytes)/1024/1024free_sizefromdba_free_spacegroupbytablespace_name)bwherea.tablespace_name=b.tablespace_name(+);(三)表空间碎片查询selecttablespace_name,Sqrt(max(blocks)/sum(blocks))*(100/Sqrt(Sqrt(count(blocks))))FSFI,count(blocks),sum(blocks),max(blocks)fromsys.dba_free_spacegroupbytablespace_name;表空间的碎片合并:altertablespacetablespace_namecoalesce;然后再执行查看表空间碎片的SQL语句,看表空间的碎片有没有减少。如果没有效果,并且表空间对表空间的扩充对表空间的数据文件大小进行扩展,或向表空间增加数据文件,具体操作见“存储管理”部份。1.3.2查看oracle数据库的表空间包含的数据文件与增加或者删除数据文件1、查看表空间中包含的数据文件以及数据文件的状态与是否自动扩展大小selectfile_name,tablespace_name,status,autoextensible,increment_by,bytes/1024/1024bytesfromdba_data_files2、增加