参考文档:
https://blog.csdn.net/z_x_1000/article/details/17263077
https://www.cnblogs.com/login2012/p/5775602.html
https://www.iteye.com/blog/yangyangcom-2200174
一、问题背景
最开始发现应用服务打不开,于是登录服务器发现Oracle数据关闭了,按照步骤重启,但是数据库启动后,应用程序还是无法连接数据库。开始查找原因,原来数据库表空间出现问题。解决过程中,前后出现了三个问题:
- ORA-01219: 数据库未打开: 仅允许在固定表/视图中查询
- ORA-01114: 将块写入文件 时出现 IO 错误
- ORA-01041: 内部错误,hostdef 扩展名不存在
本文分别介绍三个问题的处理过程。
二、问题1-ORA-01219: 数据库未打开: 仅允许在固定表/视图中查询
问题描述:
我们在操作Oracle时常常会遇到一个莫名其妙的问题,首先是用plsql登录的时候用sys能够登录,但是无法操作左边的表啊,表空间之类的,报错为ORA-01219: 数据库未打开: 仅允许在固定表/视图中查询
到网上一查应该是某个.dbf文件残留;或者误删除(有意删除).dbf文件导致出现上述警告
解决方案:
一、首先介绍3种进入sql*plus操作的方式(编辑代码后续给出)
方式1:登录到本地sql*plus解决
以管理员身份登录,用户名Scott 密码为tiger(是具体情况而定)
方式2.登录当本地网页版主页处
utl:http://localhost:1158/em
sysdba身份登录上去,用户名可以是sys,至于登录口令是你安装的时候设置的(哈哈傻了吧,忘了吧。。。)登录后显示右边图片中的维护,找到sql*plus链接处,或者直接点击下面的sql*plus处
如图
显示如下sql*plus登录页面,登录时需要以数据库管理员身份登录
就可以进入编码阶段了
方式3.到运行处输入sqlplus/nolog 命令即可(如果显示你的命名无效之类的,说明你的Oracle路径没配置到path上,路径配置直参考:C:\oracle\product\10.2.0\db_1\bin)
然后就显示如下页面
二、接下来说到核心了,进入sql*plus可编辑处窗口后即输入以下编码(文字可忽略)
1.先链接 输入SQL> conn 用户名/密码 as sysdba 参考SQL> conn sys/orcl as sysdba
2.查看你的数据库信息SQL> select * from v$log;
3.关闭 例程,并卸载了数据库(放心,不是那个卸载意思,没事儿!) SQL> shutdown immediate;
4.从启数据库,并装载数据库 SQL> startup
5.修改数据库打开方式SQL> alter database open;
6.SQL> alter database open resetlogs;
三、问题2-ORA-01114: 将块写入文件 时出现 IO 错误
今天应用服务器后台报一下错误:
2015-04-08 08:59:56,986 WARN [org.hibernate.util.JDBCExceptionReporter] - <SQL Error: 1114, SQLState: 64000>
2015-04-08 08:59:56,986 ERROR [org.hibernate.util.JDBCExceptionReporter] - <ORA-01114: 将块写入文件 时出现 IO 错误 (块 # )
ORA-01114: 将块写入文件 201 时出现 IO 错误 (块 # 47520)
ORA-27072: 文件 I/O 错误
Additional information: 4
Additional information: 47520
Additional information: 65536
在网上找资料说,是数据库临时表空间满了或者坏掉了。
查询临时表空间的大小
select name, bytes/1024/1024 as "大小(M)" from v$tempfile order by bytes;
看到系统中最大数据文件/oradata/esbmonitor/temp01.dbf大小为372M,初步估计是temp表空间无法扩展的原因。
解决办法:
1、查询该用户下的默认临时表空间
select * from database_properties where property_name='DEFAULT_TEMP_TABLESPACE';
2、创建新的临时表空间
create temporary tablespace temp01 tempfile '/oradata/esbmonitor/temp01.dbf'
size 1000M autoextend on;
3、修改默认表空间
alter database default temporary tablespace temp01;
四、问题3-ORA-01041: 内部错误,hostdef 扩展名不存在
在工作中打算将生产环境的数据库设置成归档模式时,遇到的问题。
一、重启数据库
Sql代码:
- shutdown immediate;
- startup mount;
也就是在我执行startup mount时报了一个"ORA-01041: 内部错误,hostdef 扩展名不存在"这样的错误.
二、原因:本人页碰到类似的错误,主要是我在toad中执行了sqlpus的命令,关闭了数据库,此时的监听也关闭了,然后我直接在服务器上面登录sqlpus,开启数据库,监听自己开启,此问题也没有了。
三、解决办法:
- 关掉当前的sqlplus窗口
- 打开cmd窗口,输入sqlplus /nolog
- conn /as sysdba;
- startup; 即可
四、验证:本人为此做了一个错误验证,电脑A为服务器,电脑B为远程访问端服务器处于一切正常状态,客户端进行访问,sys用户连接到服务器后执行shutdown immediate操作,数据库正常关闭,此时在服务器端登录cmd执行lsnrctl stop命令停止oracle监听服务,停止成功后客户端再执行startup mount操作,提示报错:未启动监听(该报错是正常的),然后在服务器端再执行lsnrctl start命令启动oracle监听服务,启动成功后客户端再执行startu mount操作,就会出现上述所产生的错误(ORA-01041: 内部错误,hostdef 扩展名不存在),按照上述方法可以解决问题。