数据库中删除表空间出现ORA

76次阅读
没有评论

共计 7992 个字符,预计需要花费 20 分钟才能阅读完成。

自动写代码机器人,免费开通

这篇文章主要介绍了数据库中删除表空间出现 ORA-22868 错误怎么办,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让丸趣 TV 小编带着大家一起了解一下。

 

 

在测试 CONVERT DATABASE 迁移命令时,没有迁移其中一个 OFFLINE 的表空间,因为这个表空间中的内容已经无法恢复了。

迁移完成后,发现表空间和数据文件信息还保留在数据字典中,因此想要清除掉这些信息,而引发了这个错误。

SQL select name from v$tablespace;

NAME
——————————
SYSTEM
UNDOTBS1
SYSAUX
EXAMPLE
YANGTK
MGMT_TABLESPACE
TEST
MGMT_ECM_DEPOT_TS
USERS
TEMP

10 rows selected.

SQL select name from v$datafile;

NAME
——————————————————————————
/data/oradata/ytktran/SYSTEM01.DBF
/data/oradata/ytktran/UNDOTBS01.DBF
/data/oradata/ytktran/SYSAUX01.DBF
/opt/ora10g/product/10.2.0/db_1/dbs/MISSING00004
/data/oradata/ytktran/EXAMPLE01.DBF
/data/oradata/ytktran/YANGTK01.DBF
/data/oradata/ytktran/MGMT.DBF
/data/oradata/ytktran/YANGTK02.DBF
/data/oradata/ytktran/TEST01.DBF
/data/oradata/ytktran/MGMT_ECM_DEPOT1.DBF

10 rows selected.

SQL select file_name 
  2  from dba_data_files
  3  where tablespace_name = USERS

FILE_NAME
——————————————————————————–
/opt/ora10g/product/10.2.0/db_1/dbs/MISSING00004

显然 USERS 表空间是要删除的表空间:

SQL drop tablespace users;
drop tablespace users
*
ERROR at line 1:
ORA-01549: tablespace not empty, use INCLUDING CONTENTS option

SQL drop tablespace users including contents;
drop tablespace users including contents
*
ERROR at line 1:
ORA-22868: table with LOBs contains segments in different tablespaces

由于表空间不为空,因此需要 INCLUDING CONTENTS 方式删除表空间,但是这时出现了 ORA-22868 错误。

错误信息很明确,应该是 USERS 表空间中包含了 LOB 表,而 LOB 表中的 LOB 对象存储在 USERS 表空间之外的地方。

只需要找到这些对象并删除就可以解决这个问题:

SQL col owner format a15 
SQL col tablespace_name format a15
SQL col column_name format a30
SQL select a.owner, a.table_name, b.column_name, b.tablespace_name
  2  from dba_tables a, dba_lobs b
  3  where a.owner = b.owner
  4  and a.table_name = b.table_name
  5  and a.tablespace_name = USERS
  6  and b.tablespace_name != USERS

no rows selected

SQL select a.owner, a.table_name, b.column_name, b.tablespace_name
  2  from dba_tables a, dba_lobs b
  3  where a.owner = b.owner
  4  and a.table_name = b.table_name
  5  and a.tablespace_name = USERS

no rows selected

奇怪的是,并没有符合表处于 USERS 表空间中,而 LOB 对象在 USERS 表空间之外的 LOB 对象,事实上,所有包含 LOB 的表,都不在 USERS 表空间中。

那么 Oracle 为什么会出现上面的错误呢:

SQL select count(*) 
  2  from dba_lobs
  3  where tablespace_name = USERS

  COUNT(*)
———-
  10

SQL select a.owner, a.table_name, b.column_name, b.tablespace_name
  2  from dba_tables a, dba_lobs b
  3  where a.owner = b.owner
  4  and a.table_name = b.table_name
  5  and b.tablespace_name = USERS

no rows selected

SQL select owner, table_name, column_name, tablespace_name
  2  from dba_lobs
  3  where tablespace_name = USERS

OWNER TABLE_NAME  COLUMN_NAME  TABLESPACE_NAME
—– —————— ————————————————– —————
OE  LINEITEM_TABLE  PART . SYS_XDBPD$   USERS
OE  LINEITEM_TABLE  SYS_XDBPD$  USERS
OE  ACTION_TABLE  SYS_XDBPD$  USERS
OE  PURCHASEORDER  XMLDATA . LINEITEMS . SYS_XDBPD$   USERS
OE  PURCHASEORDER  XMLDATA . SHIPPING_INSTRUCTIONS . SYS_XDBPD$   USERS
OE  PURCHASEORDER  XMLDATA . REJECTION . SYS_XDBPD$   USERS
OE  PURCHASEORDER  XMLDATA . ACTIONS . SYS_XDBPD$   USERS
OE  PURCHASEORDER  XMLDATA . SYS_XDBPD$   USERS
OE  PURCHASEORDER  XMLEXTRA . EXTRADATA   USERS
OE  PURCHASEORDER  XMLEXTRA . NAMESPACES   USERS

10 rows selected.

查询发现,USERS 表空间中包含了 10 个 LOB 对象。但是关联 DBA_TABLES 进行查询,却发现找不到任何的记录。

SQL SELECT OWNER, OBJECT_NAME, OBJECT_TYPE
  2  FROM DBA_OBJECTS
  3  WHERE OBJECT_NAME = ACTION_TABLE

OWNER  OBJECT_NAME  OBJECT_TYPE
—————————— —————————— ——————-
OE  ACTION_TABLE  TABLE

SQL SELECT OWNER, TABLE_NAME, TABLESPACE_NAME
  2  FROM DBA_TABLES
  3  WHERE TABLE_NAME = ACTION_TABLE

no rows selected

从 DBA_OBJECTS 视图中可以看到这个对象,且对象类型为 TABLE,而在 DBA_TABLES 中却找不到表信息,难道在执行 CONVERT DATABASE 命令过程,造成了数据字典的不一致。

查询一下 DBA_TABLES 视图信息:

SQL SET LONG 10000
SQL SELECT TEXT
  2  FROM DBA_VIEWS
  3  WHERE VIEW_NAME = DBA_TABLES

TEXT
——————————————————————————–
select u.name, o.name, decode(bitand(t.property,2151678048), 0, ts.name, null),
  decode(bitand(t.property, 1024), 0, null, co.name),
  decode((bitand(t.property, 512)+bitand(t.flags, 536870912)),
  0, null, co.name),
  decode(bitand(t.trigflag, 1073741824), 1073741824, UNUSABLE , VALID ),
  decode(bitand(t.property, 32+64), 0, mod(t.pctfree$, 100), 64, 0, null),
  decode(bitand(ts.flags, 32), 32, to_number(NULL),
  decode(bitand(t.property, 32+64), 0, t.pctused$, 64, 0, null)),
  decode(bitand(t.property, 32), 0, t.initrans, null),
  decode(bitand(t.property, 32), 0, t.maxtrans, null),
  s.iniexts * ts.blocksize,
  decode(bitand(ts.flags, 3), 1, to_number(NULL),
  s.extsize * ts.blocksize),
  s.minexts, s.maxexts,
  decode(bitand(ts.flags, 3), 1, to_number(NULL),
  s.extpct),
  decode(bitand(ts.flags, 32), 32, to_number(NULL),
  decode(bitand(o.flags, 2), 2, 1, decode(s.lists, 0, 1, s.lists))),
  decode(bitand(ts.flags, 32), 32, to_number(NULL),
  decode(bitand(o.flags, 2), 2, 1, decode(s.groups, 0, 1, s.groups))),
  decode(bitand(t.property, 32+64), 0,
  decode(bitand(t.flags, 32), 0, YES , NO ), null),
  decode(bitand(t.flags,1), 0, Y , 1, N , ? ),
  t.rowcnt,
  decode(bitand(t.property, 64), 0, t.blkcnt, null),
  decode(bitand(t.property, 64), 0, t.empcnt, null),
  t.avgspc, t.chncnt, t.avgrln, t.avgspc_flb,
  decode(bitand(t.property, 64), 0, t.flbcnt, null),
  lpad(decode(t.degree, 32767, DEFAULT , nvl(t.degree,1)),10),
  lpad(decode(t.instances, 32767, DEFAULT , nvl(t.instances,1)),10),
  lpad(decode(bitand(t.flags, 8), 8, Y , N ),5),
  decode(bitand(t.flags, 6), 0, ENABLED , DISABLED ),
  t.samplesize, t.analyzetime,
  decode(bitand(t.property, 32), 32, YES , NO ),
  decode(bitand(t.property, 64), 64, IOT ,
  decode(bitand(t.property, 512), 512, IOT_OVERFLOW ,
  decode(bitand(t.flags, 536870912), 536870912, IOT_MAPPING , null
))),
  decode(bitand(o.flags, 2), 0, N , 2, Y , N ),
  decode(bitand(o.flags, 16), 0, N , 16, Y , N ),
  decode(bitand(t.property, 8192), 8192, YES ,
  decode(bitand(t.property, 1), 0, NO , YES )),
  decode(bitand(o.flags, 2), 2, DEFAULT ,
  decode(s.cachehint, 0, DEFAULT , 1, KEEP , 2, RECYCLE , NULL)),
  decode(bitand(t.flags, 131072), 131072, ENABLED , DISABLED ),
  decode(bitand(t.flags, 512), 0, NO , YES ),
  decode(bitand(t.flags, 256), 0, NO , YES ),
  decode(bitand(o.flags, 2), 0, NULL,
  decode(bitand(t.property, 8388608), 8388608,
  SYS$SESSION , SYS$TRANSACTION )),
  decode(bitand(t.flags, 1024), 1024, ENABLED , DISABLED ),
  decode(bitand(o.flags, 2), 2, NO ,
  decode(bitand(t.property, 2147483648), 2147483648, NO ,
  decode(ksppcv.ksppstvl, TRUE , YES , NO))),
  decode(bitand(t.property, 1024), 0, null, cu.name),
  decode(bitand(t.flags, 8388608), 8388608, ENABLED , DISABLED ),
  decode(bitand(t.property, 32), 32, null,
  decode(bitand(s.spare1, 2048), 2048, ENABLED , DISABLED )),
  decode(bitand(o.flags, 128), 128, YES , NO )
from sys.user$ u, sys.ts$ ts, sys.seg$ s, sys.obj$ co, sys.tab$ t, sys.obj$ o,
  sys.obj$ cx, sys.user$ cu, x$ksppcv ksppcv, x$ksppi ksppi
where o.owner# = u.user#
  and o.obj# = t.obj#
  and bitand(t.property, 1) = 0
  and bitand(o.flags, 128) = 0
  and t.bobj# = co.obj# (+)
  and t.ts# = ts.ts#
  and t.file# = s.file# (+)
  and t.block# = s.block# (+)
  and t.ts# = s.ts# (+)
  and t.dataobj# = cx.obj# (+)
  and cx.owner# = cu.user# (+)
  and ksppi.indx = ksppcv.indx
  and ksppi.ksppinm = _dml_monitoring_enabled

在 DBA_TABLES 视图中没有太多的限制条件,那么导致 DBA_TABLES 中没有记录的原因多半出在连接上。

检查一下 OBJ$ 和 TAB$ 表:

SQL SELECT OBJECT_ID 
  2  FROM DBA_OBJECTS
  3  WHERE OBJECT_NAME = ACTION_TABLE

 OBJECT_ID
———-
  52449

SQL SELECT OBJ#, DATAOBJ#, NAME FROM OBJ$ WHERE OBJ# = 52449;

  OBJ#  DATAOBJ# NAME
———- ———- ——————————
  52449  ACTION_TABLE

SQL SELECT OBJ#, DATAOBJ#, TS#, BOBJ# FROM TAB$ WHERE OBJ# = 52449;

  OBJ#  DATAOBJ#  TS#  BOBJ#
———- ———- ———- ———-
  52449  0  52450

当前对象对于的 DATAOBJ#为空,说明这个对象没有对应的存储空间,而可以看到这个对象的 BOBJ# 是 52450,查询 DBA_OBJECTS 视图:

SQL SELECT OWNER, OBJECT_NAME, OBJECT_ID, DATA_OBJECT_ID, OBJECT_TYPE
  2  FROM DBA_OBJECTS
  3  WHERE OBJECT_ID IN (52449, 52450);

OWNER  OBJECT_NAME  OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE
————— —————————— ———- ————– ————
OE  ACTION_TABLE  52449  TABLE
OE  SYS_IOT_OVER_52449  52450  52450 TABLE

显然这个 ACTION_TABLE 是索引组织表。查询 ACTION_TABLE 对应的索引信息:

SQL SELECT OWNER, INDEX_NAME, INDEX_TYPE
  2  FROM DBA_INDEXES
  3  WHERE TABLE_NAME = ACTION_TABLE

OWNER  INDEX_NAME  INDEX_TYPE
—————————— —————————— —————————
OE  ACTION_TABLE_DATA  IOT – TOP
OE  SYS_IL0000052449C00004$$  LOB

看来 ACTION_TABLE 不仅是一个索引组织表,还包括 LOB 对象。而这可能就是前面碰到的 ORA-22868 错误的原因。

但是现在还有一个疑问,即使是索引组织表,也应该可以在 DBA_TABLES 视图中可以查询到的。

感谢你能够认真阅读完这篇文章,希望丸趣 TV 小编分享的“数据库中删除表空间出现 ORA-22868 错误怎么办”这篇文章对大家有帮助,同时也希望大家多多支持丸趣 TV,关注丸趣 TV 行业资讯频道,更多相关知识等着你来学习!

向 AI 问一下细节

丸趣 TV 网 – 提供最优质的资源集合!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2024-02-04发表,共计7992字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)