Oracle大字段操作,ora-01033,ORA-01157
5.12地震,至今还有很多同胞未救出,愿他们能尽早被救出.这边随笔记录了最近的一些Oracle的问题和解决方法.ora-01033:oracle正在初始化或关闭,ORA-01157: 无法标识/锁定数据文件,oracle中操作大字段的方法.
问题发现
二进制字段不能直接在sql语句中操作,有人写了类似语句:
 INSERT INTO USER1.TRA_PIC (ID,PIC) SELECT ID,PIC FROM USER2.ID_PIC_000 WHERE LENGTH(ID) = 5
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一次...
于是照做:
 C:\Documents and Settings\sjtu_gly>SQLPLUS   /NOLOG
C:\Documents and Settings\sjtu_gly>SQLPLUS   /NOLOG2
 SQL*Plus: Release 10.2.0.1.0 - Production on 星期三 5月 14 15:51:17 2008
SQL*Plus: Release 10.2.0.1.0 - Production on 星期三 5月 14 15:51:17 20083
 Copyright (c) 1982, 2005, Oracle.  All rights reserved.
Copyright (c) 1982, 2005, Oracle.  All rights reserved.4

5
 SQL> CONN system/password@oracledb As SYSDBA
SQL> CONN system/password@oracledb As SYSDBA6
 已连接。
已连接。7
 SQL> SHUTDOWN   ABORT
SQL> SHUTDOWN   ABORT8
 ORACLE 例程已经关闭。
ORACLE 例程已经关闭。9
 SQL> STARTUP
SQL> STARTUP10
 ORACLE 例程已经启动。
ORACLE 例程已经启动。11

12
 Total System Global Area  612368384 bytes
Total System Global Area  612368384 bytes13
 Fixed Size                  1250428 bytes
Fixed Size                  1250428 bytes14
 Variable Size             104860548 bytes
Variable Size             104860548 bytes15
 Database Buffers          499122176 bytes
Database Buffers          499122176 bytes16
 Redo Buffers                7135232 bytes
Redo Buffers                7135232 bytes17
 数据库装载完毕。
数据库装载完毕。18
 ORA-01157: 无法标识/锁定数据文件 8 - 请参阅 DBWR 跟踪文件
ORA-01157: 无法标识/锁定数据文件 8 - 请参阅 DBWR 跟踪文件19
 ORA-01110: 数据文件 8: 'E:\ORACLEDATA\SYNTONG\IDINFORMATION_PHOTO.ORA'
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;
照做:
 SQL>  alter database datafile 'E:\ORACLEDATA\SYNTONG\IDINFORMATION_PHOTO.ORA' of
SQL>  alter database datafile 'E:\ORACLEDATA\SYNTONG\IDINFORMATION_PHOTO.ORA' of2
 fline drop;
fline drop;3

4
 数据库已更改。
数据库已更改。5

6
 SQL> alter database open;
SQL> alter database open;7

8
 数据库已更改。
数据库已更改。9

10

之后能登陆了,但是用户下的表数据全无.
再次新的问题
表空间文件没了表空间文件被删除,只能重新再建,并导入数据,因此解决方法不是很好.
删除用户,表空间.建表空间,分配大小.建用户,授权.
建表空间语句:
 CREATE TABLESPACE IDINFORMATION_PHOTO
CREATE TABLESPACE IDINFORMATION_PHOTO 2
 DATAFILE ' /oradata/prod/hist2004.dbf1' size 8000MB
DATAFILE ' /oradata/prod/hist2004.dbf1' size 8000MB近8G的文件,用了十多分钟.
建用户并授权语句:
 -- Create the user
-- Create the user 2
 create user IDDBUSER
create user IDDBUSER3
 identified by ""
  identified by ""4
 default tablespace IDINFORMATION_PHOTO
  default tablespace IDINFORMATION_PHOTO5
 temporary tablespace TEMP
  temporary tablespace TEMP6
 profile DEFAULT;
  profile DEFAULT;7
 -- Grant/Revoke role privileges
-- Grant/Revoke role privileges 8
 grant aq_administrator_role to IDDBUSER;
grant aq_administrator_role to IDDBUSER;9
 grant connect to IDDBUSER;
grant connect to IDDBUSER;10
 grant dba to IDDBUSER;
grant dba to IDDBUSER;11
 grant javasyspriv to IDDBUSER;
grant javasyspriv to IDDBUSER;12
 grant javauserpriv to IDDBUSER;
grant javauserpriv to IDDBUSER;13
 grant resource to IDDBUSER;
grant resource to IDDBUSER;14
 -- Grant/Revoke system privileges
-- Grant/Revoke system privileges 15
 grant execute any procedure to IDDBUSER;
grant execute any procedure to IDDBUSER;16
 grant select any sequence to IDDBUSER;
grant select any sequence to IDDBUSER;17
 grant select any table to IDDBUSER;
grant select any table to IDDBUSER;18
 grant unlimited tablespace to IDDBUSER;
grant unlimited tablespace to IDDBUSER;19

导表语句:
 imp IDDBUSER/password@oracledb file=E:\新建文件夹\data.bak fromuser=IDDBUSER touser = IDDBUSER
imp IDDBUSER/password@oracledb file=E:\新建文件夹\data.bak fromuser=IDDBUSER touser = IDDBUSER一切完成,OK!
结论
1.建表空间时,文件很大时需要的时间较长.
2.不能随便用sql语句操作大字段.
3.即使操作出现问题,也不要急于重启关机等操作,这些都是对付Windows产品的,Oracle只需等待,总会提示出错,并自动会完成些提示修复等操作.这次我的解决方法也不是很好,尤其是删除了表空间,导致很大的问题,面壁下先.
4.数据库中一般不能直接操作大字段,oracle中可以用dbms_lob包下的一些函数实现.如下语句

2
 declare
declare 3
 source_lob blob;
    source_lob blob;4
 dest_lob blob;
    dest_lob blob;5
 copy_amount integer;
    copy_amount integer;6
 num integer;
    num integer;7
 cursor cur_01 is
    cursor cur_01 is 8
 select sno from iddbuser.v_id_pic
        select sno from iddbuser.v_id_pic  9
 where sno<>'04031' and  sno<>'09260' and sno<>'00753' and sno<>'01969'
        where sno<>'04031' and  sno<>'09260' and sno<>'00753' and sno<>'01969'10
 order by sno;
        order by sno;11

12
 begin
begin13
 for rec_01 in cur_01 loop
    for rec_01 in cur_01 loop14
 select count(*) into num from USER1.tra_pic where psnno=rec_01.sno;
        select count(*) into num from USER1.tra_pic where psnno=rec_01.sno;15
 if num=0 then
        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);
            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;
            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;
            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);
            dbms_lob.copy(dest_lob, source_lob, copy_amount);21
 commit;
            commit;22
 end if;
        end if;23
 end loop;
    end loop;   24
 end;
end;25

26
 
 27

 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号