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