NPPYQ的学习笔记

每天进步一点点

导航

Oracle大字段操作,ora-01033,ORA-01157

5.12地震,至今还有很多同胞未救出,愿他们能尽早被救出.这边随笔记录了最近的一些Oracle的问题和解决方法.ora-01033:oracle正在初始化或关闭,ORA-01157: 无法标识/锁定数据文件,oracle中操作大字段的方法.


问题发现

二进制字段不能直接在sql语句中操作,有人写了类似语句:

1INSERT INTO USER1.TRA_PIC (ID,PIC) SELECT ID,PIC FROM USER2.ID_PIC_000 WHERE LENGTH(ID) = 5

其中PIC为BLOB类型.

之后导致问题:
登陆即报错:
ora-01033:oracle正在初始化或关闭

重新启动该数据库服务,还是发现不行.

而且只能以系统管理员身份用系统用户登陆,但不能打开表.


解决方法

对于"ora-01033:oracle正在初始化或关闭"的问题,网上找到一些答案,但是大多是因为服务没有启动的原因或者其他,只有重启下数据服务就好了.不适合我的问题.

最后找到一个方法:

先关掉SQL*PLUS,  
  运行SQLPLUS   /NOLOG  
  CONN   USERNAME/PASSWORD@CID   AS   SYSDBA  
  提示“Oracle连接到空闲例程。”  
  再SHUTDOWN   ABORT一次,  
  再STARTUP一次...


于是照做:

 

 1C:\Documents and Settings\sjtu_gly>SQLPLUS   /NOLOG
 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;


照做:

 

 1SQL>  alter database datafile 'E:\ORACLEDATA\SYNTONG\IDINFORMATION_PHOTO.ORA' of
 2fline drop;
 3
 4数据库已更改。
 5
 6SQL> alter database open;
 7
 8数据库已更改。
 9
10


之后能登陆了,但是用户下的表数据全无.


再次新的问题

表空间文件没了  

表空间文件被删除,只能重新再建,并导入数据,因此解决方法不是很好.

删除用户,表空间.建表空间,分配大小.建用户,授权.
建表空间语句:

1CREATE TABLESPACE IDINFORMATION_PHOTO 
2DATAFILE ' /oradata/prod/hist2004.dbf1' size 8000MB

近8G的文件,用了十多分钟.

建用户并授权语句:

 1-- Create the user 
 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


导表语句:

1imp IDDBUSER/password@oracledb file=E:\新建文件夹\data.bak fromuser=IDDBUSER touser = IDDBUSER

 一切完成,OK!


结论

1.建表空间时,文件很大时需要的时间较长.

2.不能随便用sql语句操作大字段.

3.即使操作出现问题,也不要急于重启关机等操作,这些都是对付Windows产品的,Oracle只需等待,总会提示出错,并自动会完成些提示修复等操作.这次我的解决方法也不是很好,尤其是删除了表空间,导致很大的问题,面壁下先.

4.数据库中一般不能直接操作大字段,oracle中可以用dbms_lob包下的一些函数实现.如下语句


 1
 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

posted on 2008-05-16 17:19  NPPYQ  阅读(3576)  评论(1编辑  收藏  举报