oracle导出部分索引,PL/SQLDeveloper导出分区索引脚本

93b728478fdab8b036eaf6733cd54d11.png

不准确分析及规避方法

1 案例回访

硬件环境:IBM XSERIES 3650

操作系统:Windows2003标准版+Sp02

数据库版本:Oracle9.2.0.1

PL/SQL Developer版本:7.0.2.1076

由于业务需要,需先drop一张分区表T_SMS,再重建此表,要求表结构、索引等完全一致。但当时开局版本一时无法找到,故决定利用PL/SQL Developer工具“View SQL”获取到的SQL语句来重建分区表。(此分区表按天进行分区,且由于每天数据量庞大,故每天凌晨都会truncate上个月的数据,保证表中最多只保留30天数据。)

重建表后第二天发现此表索引失效,导致无法进行insert等操作。经过分析,truncate分区操作最可能造成索引失效。但此表建立的是本地分区索引,按天truncate操作后,Oracle会自动重建本地分区索引,不应该需要手工干预,且以前此表没有出现过索引失效的问题。故初步判断可能是新旧表结构不同造成,立即查看此表索引类型,发现索引并不是本地索引,且从PL/SQL Developer工具中导出的建索引语句中也并不是本地索引。

那为何原表索引为本地分区索引,利用PL/SQL Developer工具导出脚本后索引类型就改变了呢?是不是PL/SQL Developer工具在导出索引脚本方面存在bug?

2 案例分析

刚才已经通过查看当时建表语句即可定位为PL/SQL Developer工具导出的脚本问题,我们可以再通过以下几个试验来验证一下。

2.1 建索引时加local关键字

(1)建索引语句如下:

create index T_SMS_IDMONTHDAY on T_SMS (MONTHDAY)

local tablespace SMS_DAT;

(2)利用PL/SQL Developer工具“View SQL”获取的建索引脚本如下:

create index T_SMS_IDMONTHDAY on T_SMS (MONTHDAY);

(3)分析:

可见,建本地分区索引后再利用PL/SQL Developer工具导出脚本即变为了全局索引,索引类型发生了变化。

2.2 建索引时不加local关键字或加global关键字

(1)建索引语句如下:

create index T_SMS_IDMONTHDAY on T_SMS (MONTHDAY)

[global] tablespace SMS_DAT;

(2)利用PL/SQL Developer工具“View SQL”获取的建索引脚本如下:

create index T_SMS_IDMONTHDAY on T_SMS (MONTHDAY)

tablespace SMS_DAT

pctfree 10

initrans 2

maxtrans 255

storage

(

initial 64K

minextents 1

maxextents unlimited

);

(3)分析:

可见,建索引时无论不加local关键字还是加global关键字再利用PL/SQL Developer工具导出的脚本都变为了全局索引,同时多了些存储相关的选项。

2.3 分别利用PL/SQL Developer 工具的“Oracle Export”、“SQL Insert”、“PL/SQL Developer”三种方式导出

通过导出后再导入的方式来验证,只有“Oracle Export”方式导出再导入后,表结构和索引结构没有发生变化,另两种方式都改变了索引类型。  3 规避方法介绍

从上述对比试验中可以看出,只有Oracle自带的Export命令导出再导入后的索引结构和原有结构一致,其他方式都无法准确获取到分区索引的脚本。

虽然我们可以通过把Export导出条件设置为不存在结果集来导出空表,再利用导出的dump文件导入到其他库来新建表和索引。但这种方式无法直观的看到建表的SQL脚本,可扩展性差。

本地索引:

CREATE INDEX T_SMS_IDMONTHDAY ON T_SMS

(MONTHDAY)

TABLESPACE SMS_DAT

INITRANS 2

MAXTRANS 255

LOCAL (

PARTITION P01

LOGGING

NOCOMPRESS

TABLESPACE SMS_DAT

PCTFREE 10

INITRANS 2

MAXTRANS 255

STORAGE (

INITIAL 64K

MINEXTENTS 1

MAXEXTENTS 2147483645

BUFFER_POOL DEFAULT

),

PARTITION P02

LOGGING

NOCOMPRESS

TABLESPACE SMS_DAT

PCTFREE 10

INITRANS 2

MAXTRANS 255

STORAGE (

INITIAL 64K

MINEXTENTS 1

MAXEXTENTS 2147483645

BUFFER_POOL DEFAULT

)

……(此处省略部分代码)

)

NOPARALLEL;

全局索引:

CREATE INDEX T_SMS_IDMONTHDAY ON T_SMS

(MONTHDAY)

LOGGING

TABLESPACE SMS_DAT

PCTFREE 10

INITRANS 2

MAXTRANS 255

STORAGE (

INITIAL 64K

MINEXTENTS 1

MAXEXTENTS 2147483645

PCTINCREASE 0

BUFFER_POOL DEFAULT

)

NOPARALLEL;

2829f2ca24f0d0090cbba57f30759f23.png

PL/SQLDeveloper导出分区索引脚本.doc

下载Word文档到电脑,方便收藏和打印[全文共1915字]

编辑推荐:

8b95f2eb3d3f7ce4dc3bf1178c74941e.png

8b95f2eb3d3f7ce4dc3bf1178c74941e.png

8b95f2eb3d3f7ce4dc3bf1178c74941e.png

8b95f2eb3d3f7ce4dc3bf1178c74941e.png

8b95f2eb3d3f7ce4dc3bf1178c74941e.png

下载Word文档

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值