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