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

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


问题发现

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

1 INSERT   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一次...


于是照做:

 

 1 C: \ Documents and Settings \ sjtu_gly > SQLPLUS    / NOLOG
 2 SQL*Plus: Release  10.2 . 0.1 . 0  - Production  on  星期三 5月  14   15 : 51 : 17   2008
 3 Copyright  ( c )   1982 ,   2005 ,  Oracle .   All rights reserved .
 4
 5 SQL >  CONN system / password@oracledb As SYSDBA
 6 已连接。
 7 SQL >  SHUTDOWN   ABORT
 8 ORACLE 例程已经关闭。
 9 SQL >  STARTUP
10 ORACLE 例程已经启动。
11
12 Total System Global Area   612368384  bytes
13 Fixed Size                   1250428  bytes
14 Variable Size              104860548  bytes
15 Database  Buffers            499122176  bytes
16 Redo  Buffers                  7135232  bytes
17 数据库装载完毕。
18 ORA- 01157 : 无法标识 / 锁定数据文件  8  - 请参阅 DBWR 跟踪文件
19 ORA- 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;


照做:

 

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


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


再次新的问题

表空间文件没了  

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

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

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

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

建用户并授权语句:

 1 --  Create the user 
 2 create   user  IDDBUSER
 3   identified  by  ""
 4    default  tablespace IDINFORMATION_PHOTO
 5    temporary  tablespace  TEMP
 6   profile  DEFAULT ;
 7 --  Grant/Revoke role privileges 
 8 grant  aq_administrator_role  to  IDDBUSER;
 9 grant  connect  to  IDDBUSER;
10 grant  dba  to  IDDBUSER;
11 grant  javasyspriv  to  IDDBUSER;
12 grant  javauserpriv  to  IDDBUSER;
13 grant  resource  to  IDDBUSER;
14 --  Grant/Revoke system privileges 
15 grant   execute   any   procedure   to  IDDBUSER;
16 grant   select   any  sequence  to  IDDBUSER;
17 grant   select   any   table   to  IDDBUSER;
18 grant  unlimited tablespace  to  IDDBUSER;
19


导表语句:

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

 一切完成,OK!


结论

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

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

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

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


 1
 2 declare  
 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
12 begin
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;   
24 end ;
25
26  
27

你可能感兴趣的:(oracle)