? 未提交的事务不回退
? 在不关闭文件的情况下例程被终止 ? 下一次启动将要求例程恢复
课堂练习:
使用以上各个参数关闭数据库,观察关闭过程中oracle的提示信息
4.3 常见问题的处理
本小节主要是指数据库本身没有破坏,由于其他原因导致的启动问题
1)数据文件位置不对,原本在D:\\ORACLE,结果把路径修改了等导致的问题。 解决:开始 → 运行 → 键入“sqlplus /nolog”→ connect sys/his as sysdba → 使用带参数的startup:
Startup pfile=filespec
2)安装多个实例,在默认实例启动后,其他实例不跟参数文件直接启动导致的问题 解决:开始 → 运行 → 键入“sqlplus /nolog”→ connect sys/his as sysdba → 使用带参数的startup:
Startup pfile=filespec 3)口令文件导致的启动问题
ORA-01991: 无效的口令文件 ' D:\\oracle\\product\\10.2.0\\db_1\\database\\PWDorcl.ORA' 解决方法:
原因:密码文件丢失或损坏 方法:手工创建密码文件:
orapwd file=D:\\oracle\\product\\10.2.0\\db_1\\database\\pwdorcl.ora password=oracle 4)磁盘空间满了导致ORACLE宕机 进入http://server*:1158/em,表空间管理,根据错误提示将表空间扩展指定到其他的硬盘上。 5)参数文件设置不正确(比如数据缓冲区太大)导致ORACLE不能启动的问题
根据错误提示修改参数文件中对应的参数的值,或者按照管理工具中安装建议进行设置。 6)某一个控制文件损坏导致数据库无法启动的问题
进HIS时提示“oracle正在初如化或关闭”。 进sqlplus
conn sys/his as sysdba
SQL> shutdown
ORA-01507: 未安装数据库
ORACLE 例程已经关闭。 SQL> startup
ORACLE 例程已经启动。
Total System Global Area 63296780 bytes Fixed Size 70924 bytes Variable Size 40374272 bytes
31
Database Buffers 22773760 bytes Redo Buffers 77824 bytes ORA-00204: 读控制文件错误(块,#块)
ORA-00202: 控制文件: ' D:\\oracle\\product\\10.2.0\\oradata\\orcl\\CONTROL03.CTL' ORA-27091: skgfqio: unable to queue I/O
OSD-04006: ReadFile() 失败, 无法读取文件
O/S-Error: (OS 23) 数据错误 (循环冗余检查)。
解决方法:
控制文件CONTROL03.CTL损坏。
关闭oracle数据库,将CONTROL01.CTL拷到另一目录下,更名为CONTROL03.CTL,再拷回原目录,重新启动oracle服务,可正常启动。
2、重建实例,建一样的表空间,路径一样,然后拷贝控制文件过来就OK
3、alter database backup controlfile to trace; 把配置文件放到跟踪日志中,然后根据日志文件中的内容操作(如果缺少表空间、添加对应的表空间)
课堂练习:
以上1、3、6典型问题模拟操作
32
编写参考文献
企业DBA第1A部分《体系结构和管理》
盖国强《深入浅出oracle:DBA入门、进阶与诊断案例》 中联自编资料《ORACLE数据库实用知识》
中联自编资料《Oracle学习资料-系统文件解释》 中联自编资料《Oracle学习资料-系统管理》
33
案例分析
ORACLE常见问题处理案例
1、ORA-12560 协议适配器错误 ora-12154 :tns:无法处理服务名
这个错误是我们遇到的比较多的一种错误。
解决思路一之在服务其器上没有输入服务名的情况下出现该问题: 1、 确保数据库服务已经启动,如果服务没有启动请启动服务;
2、 检查ORACLE_SID,可以通过注册表中检查并修改之,在服务器上我们可以不用
输入服务命名进入数据库,默认的实例就是去调用注册表中的ORACLE_SID,我们可用在一个CMD下动态SET ORACLE_SID=XXX来改变。 解决思路二之在客户端出现该问题:
1、 首先用PING 服务命名看是否可用通;
2、检查TNSNAMES.ORA与SQLNET.ORA中的配置是否一致,在SQLNET.ORA中的参数NAMES.DIRECTORY_PATH= (TNSNAMES, ONAMES, HOSTNAME)是否与TNSNAMES.ORA中配置的一致,该参数表明解析客户端连接时所用的主机字符串的方式,下面列出参数的说明:
TNSNAMES表示采用TNSNAMES.ORA文件来解析
ONAMES表示Oracle使用自己的名称服务器(Oracle Name Server)来解析,目前Oracle建议使用轻量目录访问协议LDAP来取代ONAMES HOSTNAME表示使用host文件,DNS,NIS等来解析
我们平常用的主要是TNSNAMES这种方式,如果该参数中没有TNSNAMES则我们无法通过服务命名的方式访问数据库。
2、ORA-01578数据块中断(文件号 XX,块号 XXXX)
产生原因:当ORACLE访问一个数据块时,由于1、硬件的I/O错误;2、操作系统的I/O错误或缓冲问题;3、内存或paging问题;4、ORACLE试图访问一个未被格式化的系统块失败;5、数据文件部分溢出等上述几种情况的一种引起了逻辑坏块或者物理坏块,这时就会报ORA-01578的错误。 解决方式:由于ORACLE只有在访问到有问题的数据文件时才会报错,所以报错的时间有可能会比实际出错的时间要晚,如果ORA-01578出错信息提示数据坏块指向的是用户自己的数据文件,则用以下方法来解决:
如果通过下面的SQL语句查出的坏块出现有索引上,则只需重建索引即可
SQL>Select owner,segment_name,segment_type from dba_extents where file_id=
SQL>Analyze table validate structure cascade; 执行该命令后,可能会出现以下的结果:
ORA-01578:与原先错误信息有相同的参数,为永久性的物理或逻辑坏块;与原先错误信息有不同的参数,可能与内存,page space和I/O设备有关。
如果用户有此表的最新备份,那么最好是用此备份来恢复此表,或者使用event 10231
34
来取出坏块以外的数据:
<1>.先关闭数据库
<2>.编辑init
event=”10231 trace name context forever,level 10” <3>.startup restrict
<4>.创建一个临时表:SQL>create table errortemp as select * from error;(error是坏表的表名)
<5>.把event从init
Alter table errortemp rename to error <7>.创建表上的INDEX等
3、ORA-03113:通讯通道结束(end-of-file on communication channel)
产生原因:通讯不正常结束,从而导致通讯通道终止 解决思路:
<1>.检查是否有服进程不正常死机,可从alert.log得知 <2>.检查sql*Net Driver是否连接到ORACLE可执行程序 <3>.检查服务器网络是否正常,如网络不通或不稳定等 <4>.检查同一个网上是否有两个同样名字的节点 <5>.检查同一个网上是否有重复的IP地址
对于这个错误一般由服务器进程异常中断引起,这个时候我们可以从alert.log中最后一次shutdown后开始看出现的问题,在日志文件中我们可能会发现更多的错误信息,如
下部分信息:
从这个日志文件中我们发现存在数据坏块,用DBV工具检查数据文件发现的确存在坏的页面。如下部分日志信息:
Corrupt block relative dba: 0x030ee376 file=12. blocknum=975734. Fractured block found during media/instance recovery Data in bad block - type:6. format:2. rdba:0x030ee376 在ALERT.LOG中发现ORA-00600的错误信息的情况也非常多,对于ORA-00600的错误解决办法我们提供由回滚段引起的错误的解决办法,见下小节。
4、ORA-00600 ORACLE内部错误
这里提供两个恢复案例供大家研究学习。案例一中包含控制文件,在线日志,回滚段等错误,是一个比较综合的例子,案例二是ORA-00600[2662]的一个恢复例子。
35
灾难恢复案例二
36