一般像这种情况可能是这个表正在被使用,有可能有lock暂时不能使用 就会有资源争用导致资源忙等待解决方法: 1.重启数据库 startup force 2.等待锁释放 3.强制kill会话
应该是产生了锁,其他资源需要等待。不过可以查询出哪个进程产生的锁 引用一个人的博客:如何查找被锁的表到底是哪一行被锁定了 简单的总结一下。 首先v$session中的这几个字段的含义分别为 row_wait_row#---被锁定行的rownum,但是准确的说是对应的于rowid的rownum,并非是单纯的rownum。下面再详细的说。 row_wait_obj#---row_wait_row#对应的rowid所在的表的object id。 row_wait_file#-- row_wait_row#对应的rowid所在的数据文件id row_wait_block#--row_wait_row#对应的rowid所在的block的id 只有一个session等待另一个session的时候,这几个列的值才是有效的。 想要知道某一个表具体被锁定的是哪一行,可以利用上面这几个值,查找出被锁定行的rowid。 使用dbms_rowidb包的一个子过程(Subprograms)rowid_create DBMS_ROWID.ROWID_CREATE ( rowid_type IN NUMBER, object_number IN NUMBER, relative_fno IN NUMBER, block_number IN NUMBER, row_number IN NUMBER) RETURN ROWID; 其中rowid_type的取值为 0 表示生成一个restricted ROWID(pre-oracle8 format); 取值为1 表示生成一个extended ROWID. object_number取值是dba_objects视图中的data_object_id,并不是object_id,也就是说不能用row_wait_obj#. relative_fno取值是Relative文件号,在dba_data_files里可以查到 block_number取值是数据文件的块号,也就是v$session中的row_wait_block#的值 row_number通过rowid对应出来的rownum,也就是row_wait_row#的值。 通过使用 select DBMS_ROWID.ROWID_CREATE(1,data_object_id,relative_fno,row_wait_block#,row_wait_row#) from dual; 查找出的rowid即为被锁定的行。 如果有多行数据被锁定,row_wait_row#显示的是靠''前''的行。 例子: 16:13:06 SQL> select * from test; A B C ---------- ---------- ---------- 600 600 600 100 100 100 100 100 100 300 600 300 100 100 100 100 100 100 500 500 500 300 600 300 100 100 100 300 600 300 100 100 100 300 600 300 500 500 500 900 300 900 session1; update test set b=300 where a=900; session2: update test set b=300 where a=900; 16:12:14 SQL> select row_wait_file#,row_wait_obj#,row_wait_block#,row_wait_row# from v$session where username = 'TEST'; ROW_WAIT_FILE# ROW_WAIT_OBJ# ROW_WAIT_BLOCK# ROW_WAIT_ROW# -------------- ------------- --------------- ------------- 1 -1 0 0 4 6728 178 21 16:11:06 SQL> select data_object_id from dba_objects where object_id = 6728; DATA_OBJECT_ID -------------- 6822 16:12:34 SQL> select DBMS_ROWID.ROWID_CREATE(1,6822,4,178,21) from dual; DBMS_ROWID.ROWID_C ------------------ AAABqmAAEAAAACyAAV 16:12:51 SQL> select * from test where rowid = chartorowid('AAABqmAAEAAAACyAAV'); A B C --------- ---------- ---------- 900 300 900 16:13:11 SQL> 通过杀数据库进程来解表 select * from V$LOCKED_OBJECT select object_name as 对象名称,s.sid,s.serial#,p.spid as 系统进程号 from v$locked_object l , dba_objects o , v$session s , v$process p where l.object_id=o.object_id and l.session_id=s.sid and s.paddr=p.addr; sid及serial#为第一步查出来的数据 alter system kill session '151,52574';
通过杀数据库进程来解表 select * from V$LOCKED_OBJECT select object_name as 对象名称,s.sid,s.serial#,p.spid as 系统进程号 from v$locked_object l , dba_objects o , v$session s , v$process p where l.object_id=o.object_id and l.session_id=s.sid and s.paddr=p.addr; sid及serial#为第一步查出来的数据 alter system kill session '151,52574'; 楼上的这个就可,你的这个表正在被占用,所以你操作不了。
回7楼修改表结构时SQL写错啦 而且没有COMMIT
SYS用户 dorp table tablename; commit 以后 select * from dba_recyclebin; 中为怎么看到tablename 在哪里看到DORP的tablename
drop table之后是不需要commit的
回11那请问 dorp table c
回11
那请问 dorp table test以后select * from dba_recyclebin 确查到不到 test recyclebin 的value是ON 我怎么才能找到table test 并还原
在当前schema下: show recyclebin: 只要空间压力不大,可以: flashback table test to before drop;
ora-38305 :object not in recyclebin
回13在当前schema下: show recyclebin: 只要空间压力不大,可以: flashback table test to before drop; ora-38305 :object not in recyclebin
就会有资源争用导致资源忙等待解决方法:
1.重启数据库 startup force
2.等待锁释放
3.强制kill会话
引用一个人的博客:如何查找被锁的表到底是哪一行被锁定了
简单的总结一下。
首先v$session中的这几个字段的含义分别为
row_wait_row#---被锁定行的rownum,但是准确的说是对应的于rowid的rownum,并非是单纯的rownum。下面再详细的说。
row_wait_obj#---row_wait_row#对应的rowid所在的表的object id。
row_wait_file#-- row_wait_row#对应的rowid所在的数据文件id
row_wait_block#--row_wait_row#对应的rowid所在的block的id
只有一个session等待另一个session的时候,这几个列的值才是有效的。
想要知道某一个表具体被锁定的是哪一行,可以利用上面这几个值,查找出被锁定行的rowid。
使用dbms_rowidb包的一个子过程(Subprograms)rowid_create
DBMS_ROWID.ROWID_CREATE (
rowid_type IN NUMBER,
object_number IN NUMBER,
relative_fno IN NUMBER,
block_number IN NUMBER,
row_number IN NUMBER)
RETURN ROWID;
其中rowid_type的取值为 0 表示生成一个restricted ROWID(pre-oracle8 format); 取值为1 表示生成一个extended ROWID.
object_number取值是dba_objects视图中的data_object_id,并不是object_id,也就是说不能用row_wait_obj#.
relative_fno取值是Relative文件号,在dba_data_files里可以查到
block_number取值是数据文件的块号,也就是v$session中的row_wait_block#的值
row_number通过rowid对应出来的rownum,也就是row_wait_row#的值。
通过使用
select DBMS_ROWID.ROWID_CREATE(1,data_object_id,relative_fno,row_wait_block#,row_wait_row#) from dual;
查找出的rowid即为被锁定的行。
如果有多行数据被锁定,row_wait_row#显示的是靠''前''的行。
例子:
16:13:06 SQL> select * from test;
A B C
---------- ---------- ----------
600 600 600
100 100 100
100 100 100
300 600 300
100 100 100
100 100 100
500 500 500
300 600 300
100 100 100
300 600 300
100 100 100
300 600 300
500 500 500
900 300 900
session1; update test set b=300 where a=900;
session2: update test set b=300 where a=900;
16:12:14 SQL> select row_wait_file#,row_wait_obj#,row_wait_block#,row_wait_row# from v$session where username = 'TEST';
ROW_WAIT_FILE# ROW_WAIT_OBJ# ROW_WAIT_BLOCK# ROW_WAIT_ROW#
-------------- ------------- --------------- -------------
1 -1 0 0
4 6728 178 21
16:11:06 SQL> select data_object_id from dba_objects where object_id = 6728;
DATA_OBJECT_ID
--------------
6822
16:12:34 SQL> select DBMS_ROWID.ROWID_CREATE(1,6822,4,178,21) from dual;
DBMS_ROWID.ROWID_C
------------------
AAABqmAAEAAAACyAAV
16:12:51 SQL> select * from test where rowid = chartorowid('AAABqmAAEAAAACyAAV');
A B C
--------- ---------- ----------
900 300 900
16:13:11 SQL>
通过杀数据库进程来解表
select * from V$LOCKED_OBJECT
select object_name as 对象名称,s.sid,s.serial#,p.spid as 系统进程号
from v$locked_object l , dba_objects o , v$session s , v$process p
where l.object_id=o.object_id and l.session_id=s.sid and s.paddr=p.addr;
sid及serial#为第一步查出来的数据
alter system kill session '151,52574';
select * from V$LOCKED_OBJECT
select object_name as 对象名称,s.sid,s.serial#,p.spid as 系统进程号
from v$locked_object l , dba_objects o , v$session s , v$process p
where l.object_id=o.object_id and l.session_id=s.sid and s.paddr=p.addr;
sid及serial#为第一步查出来的数据
alter system kill session '151,52574';
楼上的这个就可,你的这个表正在被占用,所以你操作不了。
而且没有COMMIT
dorp table tablename;
commit
以后
select * from dba_recyclebin; 中为怎么看到tablename
在哪里看到DORP的tablename
那请问 dorp table test以后select * from dba_recyclebin 确查到不到 test
recyclebin 的value是ON
我怎么才能找到table test 并还原
show recyclebin:
只要空间压力不大,可以:
flashback table test to before drop;
ora-38305 :object not in recyclebin
show recyclebin:
只要空间压力不大,可以:
flashback table test to before drop;
ora-38305 :object not in recyclebin
造成ora-38305 ,可能有2个原因:
1)如果你使用 sys用户删除, 对象是不会存储在 recyclebin的
用非sys用户试试
2)可能由于空间不够造成表被从回收站中剔除