Oracle大字段操作,ora-01033,ORA-01157
5.12地震,至今还有很多同胞未救出,愿他们能尽早被救出.这边随笔记录了最近的一些Oracle的问题和解决方法.ora-01033:oracle正在初始化或关闭,ORA-01157: 无法标识/锁定数据文件,oracle中操作大字段的方法.
问题发现
二进制字段不能直接在sql语句中操作,有人写了类似语句:
其中PIC为BLOB类型.
之后导致问题:
登陆即报错:
ora-01033:oracle正在初始化或关闭
重新启动该数据库服务,还是发现不行.
而且只能以系统管理员身份用系统用户登陆,但不能打开表.
解决方法
对于"ora-01033:oracle正在初始化或关闭"的问题,网上找到一些答案,但是大多是因为服务没有启动的原因或者其他,只有重启下数据服务就好了.不适合我的问题.
最后找到一个方法:
先关掉SQL*PLUS,
运行SQLPLUS /NOLOG
CONN USERNAME/PASSWORD@CID AS SYSDBA
提示“Oracle连接到空闲例程。”
再SHUTDOWN ABORT一次,
再STARTUP一次...
于是照做:
2SQL*Plus: Release 10.2.0.1.0 - Production on 星期三 5月 14 15:51:17 2008
3Copyright (c) 1982, 2005, Oracle. All rights reserved.
4
5SQL> CONN system/password@oracledb As SYSDBA
6已连接。
7SQL> SHUTDOWN ABORT
8ORACLE 例程已经关闭。
9SQL> STARTUP
10ORACLE 例程已经启动。
11
12Total System Global Area 612368384 bytes
13Fixed Size 1250428 bytes
14Variable Size 104860548 bytes
15Database Buffers 499122176 bytes
16Redo Buffers 7135232 bytes
17数据库装载完毕。
18ORA-01157: 无法标识/锁定数据文件 8 - 请参阅 DBWR 跟踪文件
19ORA-01110: 数据文件 8: 'E:\ORACLEDATA\SYNTONG\IDINFORMATION_PHOTO.ORA'
20
21
将ORACLE 例程重启,如上,但是出现新的问题:
新的问题
ORA-01157: 无法标识/锁定数据文件 8 - 请参阅 DBWR 跟踪文件网上继续找资料解决,如下:
在mount状态:
归档的话:
SQL>alter database datafile 'I:\ORADATA\EXAMORA\TEST01.DBF' offline;
非归档的话:
SQL>alter database datafile 'I:\ORADATA\EXAMORA\TEST01.DBF' offline drop;
然后再
SQL>alter database open;
照做:
2fline drop;
3
4数据库已更改。
5
6SQL> alter database open;
7
8数据库已更改。
9
10
之后能登陆了,但是用户下的表数据全无.
再次新的问题
表空间文件没了表空间文件被删除,只能重新再建,并导入数据,因此解决方法不是很好.
删除用户,表空间.建表空间,分配大小.建用户,授权.
建表空间语句:
2DATAFILE ' /oradata/prod/hist2004.dbf1' size 8000MB
近8G的文件,用了十多分钟.
建用户并授权语句:
2create user IDDBUSER
3 identified by ""
4 default tablespace IDINFORMATION_PHOTO
5 temporary tablespace TEMP
6 profile DEFAULT;
7-- Grant/Revoke role privileges
8grant aq_administrator_role to IDDBUSER;
9grant connect to IDDBUSER;
10grant dba to IDDBUSER;
11grant javasyspriv to IDDBUSER;
12grant javauserpriv to IDDBUSER;
13grant resource to IDDBUSER;
14-- Grant/Revoke system privileges
15grant execute any procedure to IDDBUSER;
16grant select any sequence to IDDBUSER;
17grant select any table to IDDBUSER;
18grant unlimited tablespace to IDDBUSER;
19
导表语句:
一切完成,OK!
结论
1.建表空间时,文件很大时需要的时间较长.
2.不能随便用sql语句操作大字段.
3.即使操作出现问题,也不要急于重启关机等操作,这些都是对付Windows产品的,Oracle只需等待,总会提示出错,并自动会完成些提示修复等操作.这次我的解决方法也不是很好,尤其是删除了表空间,导致很大的问题,面壁下先.
4.数据库中一般不能直接操作大字段,oracle中可以用dbms_lob包下的一些函数实现.如下语句
2declare
3 source_lob blob;
4 dest_lob blob;
5 copy_amount integer;
6 num integer;
7 cursor cur_01 is
8 select sno from iddbuser.v_id_pic
9 where sno<>'04031' and sno<>'09260' and sno<>'00753' and sno<>'01969'
10 order by sno;
11
12begin
13 for rec_01 in cur_01 loop
14 select count(*) into num from USER1.tra_pic where psnno=rec_01.sno;
15 if num=0 then
16 insert into USER1.tra_pic rec_01 values (rec_01.sno,rec_01.sno,'2',empty_blob(),'20080515',1,1,2);
17
18 select pic into dest_lob from USER1.tra_pic where psnno = rec_01.sno for update;
19 select pic into source_lob from iddbuser.v_id_pic where sno = rec_01.sno;
20 dbms_lob.copy(dest_lob, source_lob, copy_amount);
21 commit;
22 end if;
23 end loop;
24end;
25
26
27