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其中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 /NOLOG2
SQL*Plus: Release 10.2.0.1.0 - Production on 星期三 5月 14 15:51:17 20083
Copyright (c) 1982, 2005, Oracle. All rights reserved.4

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

12
Total System Global Area 612368384 bytes13
Fixed Size 1250428 bytes14
Variable Size 104860548 bytes15
Database Buffers 499122176 bytes16
Redo Buffers 7135232 bytes17
数据库装载完毕。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;
照做:
SQL> alter database datafile 'E:\ORACLEDATA\SYNTONG\IDINFORMATION_PHOTO.ORA' of2
fline drop;3

4
数据库已更改。5

6
SQL> alter database open;7

8
数据库已更改。9

10

之后能登陆了,但是用户下的表数据全无.
再次新的问题
表空间文件没了表空间文件被删除,只能重新再建,并导入数据,因此解决方法不是很好.
删除用户,表空间.建表空间,分配大小.建用户,授权.
建表空间语句:
CREATE TABLESPACE IDINFORMATION_PHOTO 2
DATAFILE ' /oradata/prod/hist2004.dbf1' size 8000MB近8G的文件,用了十多分钟.
建用户并授权语句:
-- Create the user 2
create user IDDBUSER3
identified by ""4
default tablespace IDINFORMATION_PHOTO5
temporary tablespace TEMP6
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

导表语句:
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 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
begin13
for rec_01 in cur_01 loop14
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

浙公网安备 33010602011771号