5.12地震,至今还有很多同胞未救出,愿他们能尽早被救出.这边随笔记录了最近的一些Oracle的问题和解决方法.ora-01033:oracle正在初始化或关闭,ORA-01157: 无法标识/锁定数据文件,oracle中操作大字段的方法.
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![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
5
SQL> CONN system/password@oracledb As SYSDBA
6
已连接。
7
SQL> SHUTDOWN ABORT
8
ORACLE 例程已经关闭。
9
SQL> STARTUP
10
ORACLE 例程已经启动。
11![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
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![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
21![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
将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![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
4
数据库已更改。
5![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
6
SQL> alter database open;
7![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
8
数据库已更改。
9![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
10![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
之后能登陆了,但是用户下的表数据全无.
再次新的问题
表空间文件没了
表空间文件被删除,只能重新再建,并导入数据,因此解决方法不是很好.
删除用户,表空间.建表空间,分配大小.建用户,授权.
建表空间语句:
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![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
导表语句:
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![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
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![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
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![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
26
27![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)