绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
ORA-02261错误导致数据泵数据库迁移失败案例分析
2020-08-13 23:49:02

使用逻辑数据迁移,前天我们讨论了迁移schema应该注意的事项,顺带讨论Oracle数据库的逻辑结构,今天我们分享一个真实的案例。

这家公司通过某种方式找到我,说他们遇到一个数据迁移的故障,一直无法导入数据,希望帮助解决。我先了解了具体环境以及他们的操作过程,数据库是11.2.0.4版本,没有打新PSU,位于上海的数据库通过数据泵导出的方式做了逻辑备份,然后通过网络传到北京公司的服务器上,再北京总公司创建一个一致的数据库环境,希望将数据导入做测试用,但是一直失败,导致后续工作无法展开。

 约了一个周末的下午,根据对方的地址很快找到那座办公楼,在对方李总的热情接待中我也感受到对方对于解决问题的迫切心情,寒暄几句,我就找了个工位,连上公司内网。我习惯将问题重现一下,看看具体信息,这里倒不是不信任对方,只是觉得自己看到更多的信息,更有助于自己的判断。我习惯性的通过opatch lspatches查看数据库补丁集,发现根本没有打新的PSU,于是我尝试通过import导入数据库,发现报错如下

连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

With the Partitioning option

已成功加载/卸载了主表 "SYSTEM"."SYS_IMPORT_SCHEMA_03" 

启动 "SYSTEM"."SYS_IMPORT_SCHEMA_03":  system/******** directory=dir1 dumpfile=gd.dmp schemas=gd logfile=2018impdp.log 

处理对象类型 SCHEMA_EXPORT/USER

处理对象类型 SCHEMA_EXPORT/SYSTEM_GRANT

处理对象类型 SCHEMA_EXPORT/ROLE_GRANT

处理对象类型 SCHEMA_EXPORT/DEFAULT_ROLE

处理对象类型 SCHEMA_EXPORT/TABLESPACE_QUOTA

处理对象类型 SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA

处理对象类型 SCHEMA_EXPORT/SEQUENCE/SEQUENCE

处理对象类型 SCHEMA_EXPORT/TABLE/TABLE

ORA-39083: 对象类型 TABLE:"GD"."BUS_FEST" 创建失败, 出现错误:

ORA-02261: 表中已存在这样的关键字或主键

失败的 sql :

CREATE TABLE "GD"."BUS_FEST" ("ID" NVARCHAR2(40) NOT NULL ENABLE, "DISTRICT" NVARCHAR2(10) NOT NULL ENABLE, "MARINE" NVARCHAR2(40), "AGENCY" NVARCHAR2(20), "CUSTOMER" NVARCHAR2(20), "DEPUTIZE" NVARCHAR2(20), "DEVIOR" NVARCHAR2(20), "SOURCE" NVARCHAR2(4) NOT NULL ENABLE, "ORIGIN" NVARCHAR2(40), "VESSEL" NVARCHAR2(40) NOT NULL ENABLE, "VOYAGE" NVARCHAR2(50) NOT

从错误提示看,是由于创建某个表的逻辑语句失败了,这个语句就是创建一张表。这里就有疑问了这样的表由什么特别呢,于是,我道出了这个表的定义

DBMS_METADATA.GET_DDL('TABLE','BUS_FEST')

--------------------------------------------------------------------------------


  CREATE TABLE "GD"."BUS_FEST"

   (    "ID" NVARCHAR2(40) NOT NULL ENABLE,

        "DISTRICT" NVARCHAR2(10) NOT NULL ENABLE,

省略部分字段定义。。。。。。

        "UPDATE_DATE" TIMESTAMP (0) NOT NULL ENABLE,

        "DEL_FLAG" NVARCHAR2(1) NOT NULL ENABLE,

        "DEL_TIME" TIMESTAMP (0),

        "HASCLEAN" NVARCHAR2(10),

         PRIMARY KEY ("ID")

  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 CO

MPUTE STATISTICS

  STORAGE(INITIAL 65536 NEXT 1048576 MINEX

TENTS 1 MAXEXTENTS 2147483645

  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1

  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CE

LL_FLASH_CACHE DEFAULT)

  TABLESPACE "tp1"  ENABLE,

         SUPPLEMENTAL LOG GROUP "GGS_1" ("

ID") ALWAYS,

         SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS,


         SUPPLEMENTAL LOG DATA (UNIQUE INDEX) COLUMNS,

         SUPPLEMENTAL LOG DATA (FOREIGN KEY) COLUMNS,

         CONSTRAINT "SYS_C0018402" FOREIGN KEY (

"AGENCY")

          REFERENCES "GD"."AGENCY" ("ID")

ENABLE,

         FOREIGN KEY ("VESSEL")

          REFERENCES "GD"."VESSEL" ("I

D") ENABLE,

         FOREIGN KEY ("DISTRICT")

          REFERENCES "GD"."SYS_AREA"

 ("ID") ENABLE,

         FOREIGN KEY ("CUSTOMER")

          REFERENCES "GD"."CUSTOMER" ("ID") ENAB

LE,

         FOREIGN KEY ("DEPUTIZE")

          REFERENCES "MLP_CORPUS_GD"."BAS_DEPUTIZE" ("I

D") ENABLE,

         FOREIGN KEY ("MARINE")

          REFERENCES "GD"."SYS_OFFICE"

 ("ID") ENABLE

   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRAN

S 255

  STORAGE(

  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT

CELL_FLASH_CACHE DEFAULT)

  TABLESPACE "tp1"

  PARTITION BY LIST ("DISTRICT")

  SUBPARTITION BY RANGE ("CREATE_DATE")

  SUBPARTITION TEMPLATE (

    SUBPARTITION "BM_T_20140101" VALUES LESS

THAN ( TIMESTAMP' 2014-01-01 00:00:00' )


  TABLESPACE "tp1" ,

这是一个分区表,开启了补充日志。当时就想是不是跟这个表 定义有什么关联,于是在源库如下方式创建一个普通表

create tble t  as select * From BUS_MANIFEST where rownum<11

将这个表单独导出,并导入北京的数据库,这个操作很顺利,这里就有理由猜测是不是错误ORA-02261,以及补充日志是否触发了某个bug。

在MOS搜索,ORA-02261  SUPPLEMENTAL LOG,很快就锁定了如下一篇文章

Bug 16595641 : IMPORT FAILS WITH ORA-02261 WHEN SUPPLEMENTAL LOGGING IS ON THE TABLE COLUMN

好吧,既然是bug ,就下载补丁,升级OPatch,在我自己的笔记本完成补丁升级后,再次测试,顺利通过。目前验证这个问题是bug引起,于是在北京的测试库上打上补丁,再次导入没有报错,

经过大约2个小时不到,数据导入成功。

这里有个问题,其实对方已经意识到时bug问题,也打了补丁,但是没有生效,这个问题我没有进一步确认,但是我感觉很可能找到的补丁不同,导致没有根本解决这个问题,我们必须分析补丁说明,看看跟我们问题的匹配度,经过测试验证,就可以确定是否是bug引起的了。这里还有一个方法,就是将这个dump文件导入12C的数据库,如果成功也可以判定高概率是bug引起,所以对于DBA务必在自己的测试环境有不同版本的数据库备用,这样需要的时候就非常方便,看看时间11:50,还好今天的文章不会过了零点。


分享好友

分享这个小栈给你的朋友们,一起进步吧。

Oracle运维新鲜事-技术与管理各占半边天
创建时间:2020-08-04 11:34:57
本技术栈旨在分享技术心得,运维趣事,故障处理经验,调优案例,故障处理涉及集群,DG,OGG,大家生产中遇到的问题基本都会囊括了,我会发布生产库遇到的故障,希望在交流中互助互益,共同提高,也希望大家讨论,如果您有生产中遇到的集群问题,也可以在这里提出来,一起讨论,现实中也帮助不少同学解决了生产库的故障。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • Abraham林老师
    栈主
  • 小雨滴
    嘉宾
  • hawkliu
    嘉宾
  • u_97a59a25246404
    嘉宾

小栈成员

查看更多
  • 栈栈
  • dapan
  • 小菜鸟___
  • hwayw
戳我,来吐槽~