一个完整的以在线重定义方式普通表转分区表的方案

1. 转分区表原因

生产数据库,一张表,一亿多行数据,绝大部分查询按月为维度做时间范围查

询,未分区状态下,查询IO量大,计划以分区截剪的方式减少IO量,提升前前台查询性能

2. 实施目的

将未分区的oXX_XXt_owner.id_oXXXdx_mX表以(stat_XXcle)字段为分区键,以在定义的方式转换成按月分区表的时间范围分区表,利且在线重定义的特性,保留权限的不漏赋以及极少时间的影响生产。

3. 注意事项

(1)       数据库若是双节点,只需在其中一个节点的数据库上实施。

(2)       实施中部分命令执行时间较长,命令一旦执行后请不要中断命令的执行一条命令执行完毕后,不能再次重复执行该命令。

(3)       执行命令的数据库用户需要为sys或者system用户。

4.实施步骤

4.1.  创建中间表

CREATE TABLE OXX_XXT_OWNER.ID_OXXXDX_MX_TMP

(

iXx_data_id         VARCHAR2
(42),

oXg_no              VARCHAR2
(16),

iXx_id              VARCHAR2
(24),

iXx_code            VARCHAR2
(16),

PXRIOD              VARCHAR2
(8),

stat_XXcle          VARCHAR2
(16),

……

)

TABLESPACE OXXXIEW

PARTITION BY
RANGE

(STAT_XXCLE)

(

PARTITION ONXXDX_MIN
VALUES LESS THAN
(‘20140101‘),

PARTITION ONXXDX_2014_01
VALUES LESS THAN
(‘20140201‘),

PARTITION ONXXDX_2014_02
VALUES LESS THAN
(‘20140301‘),

PARTITION ONXXDX_2014_03
VALUES LESS THAN
(‘20140401‘),

……

PARTITION ONXXDX_2018_02
VALUES LESS THAN
(‘20180301‘),

PARTITION ONXXDX_2018_03
VALUES LESS THAN
(‘20180401‘),

PARTITION ONXXDX_2018_04
VALUES LESS THAN
(‘20180501‘),

PARTITION ONXXDX_2018_05
VALUES LESS THAN
(‘20180601‘),

PARTITION ONXXDX_2018_06
VALUES LESS THAN
(‘20180701‘),

PARTITION ONXXDX_2018_07
VALUES LESS THAN
(‘20180801‘),

PARTITION ONXXDX_2018_08
VALUES LESS THAN
(‘20180901‘),

PARTITION ONXXDX_2018_09
VALUES LESS THAN
(‘20181001‘),

PARTITION ONXXDX_2018_10
VALUES LESS THAN
(‘20181101‘),

PARTITION ONXXDX_2018_11
VALUES LESS THAN
(‘20181201‘),

PARTITION ONXXDX_2018_12
VALUES LESS THAN
(‘20190101‘),

PARTITION ONXXDX_MAX
VALUES LESS THAN
(MAXVALUE));

4.2.  表在线重定义

4.2.1.  异常回退措施(正常情况不用执行,用于失败回滚用的)

若执行完以下步骤3.2.3开始 表在线重定义,在执行3.2.4,3.2.5,3.2.6时报错,命令不能执行,则执行以下命令回退 表在线重定义,并中断整个表的实施过程。

BEGIN

DBMS_REDEFINITION.ABORT_REDEF_TABLE(

UNAME        =>
‘OXX_XXT_OWNER‘,

ORIG_TABLE   =>
‘ID_OXXXDX_MX‘,

INT_TABLE    =>
‘ID_OXXXDX_MX_TMP‘);

END;

/

4.2.2.   验证表能否能在线重定义

BEGIN

DBMS_REDEFINITION.CAN_REDEF_TABLE(

UNAME          =>
‘OXX_XXT_OWNER‘,

TNAME          =>
‘ID_OXXXDX_MX‘,

OPTIONS_FLAG   => DBMS_REDEFINITION.CONS_USE_PK);

END;

/

4.2.3.  开始表在线重定义

BEGIN

DBMS_REDEFINITION.START_REDEF_TABLE(

UNAME          =>
‘OXX_XXT_OWNER‘,

ORIG_TABLE     =>
‘ID_OXXXDX_MX‘,

INT_TABLE      =>
‘ID_OXXXDX_MX_TMP‘,

OPTIONS_FLAG   => DBMS_REDEFINITION.CONS_USE_PK);

END;

/

4.2.4.   复制原表上的依赖对象

DECLARE

num_errors  PLS_INTEGER;

BEGIN

DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(

‘OXX_XXT_OWNER‘,

‘ID_OXXXDX_MX‘,

‘ID_OXXXDX_MX_TMP‘,

DBMS_REDEFINITION.CONS_ORIG_PARAMS,

TRUE,

TRUE,

TRUE,

TRUE,

num_errors);

END;

/

4.2.5.  同步原表与中间表的数据

BEGIN

DBMS_REDEFINITION.SYNC_INTERIM_TABLE(‘OXX_XXT_OWNER‘,

‘ID_OXXXDX_MX‘,

‘ID_OXXXDX_MX_TMP‘);

END;

/

4.2.6.  完成表在线重定义

BEGIN

DBMS_REDEFINITION.FINISH_REDEF_TABLE(

UNAME        =>
‘OXX_XXT_OWNER‘,

ORIG_TABLE   =>
‘ID_OXXXDX_MX‘,

INT_TABLE    =>
‘ID_OXXXDX_MX_TMP‘);

END;

/

4.3.   添加表注释

comment on
column OXX_XXT_OWNER.ID_OXXXDX_MX.dim_code1

is ‘XX代码1‘;

4.4.  重建含有stat_XXcle列的索引为本地分区索引

DROP INDEX OXX_XXT_OWNER. IDX_ID_OXXXDX_MX

DROP INDEX OXX_XXT_OWNER.IDX_ID_OXXXDX_MX2;

DROP INDEX OXX_XXT_OWNER.IDX_ID_OXXXDX_MX3

CREATE UNIQUE
INDEX OXX_XXT_OWNER.IDX_ID_OXXXDX_MX

ON OXX_XXT_OWNER.ID_OXXXDX_MX
(OXG_NO,

IXX_CODE,

……

SXPPLY_TYPE,

DXTA_SRC)

TABLESPACE TBS_XXN_DT

LOCAL;

CREATE INDEX OXX_XXT_OWNER.IDX_ID_OXXXDX_MX2

ON OXX_XXT_OWNER.ID_OXXXDX_MX
(STAT_XXCLE)

TABLESPACE TBS_XXN_DT

LOCAL;

CREATE INDEX OXX_XXT_OWNER.IDX_ID_OXXXDX_MX3

ON OXX_XXT_OWNER.ID_OXXXDX_MX
(OXG_NO, STAT_XXCLE)

TABLESPACE TBS_XXN_DT

LOCAL;

4.5.  重新统计表及索引信息

BEGIN

DBMS_STATS.gather_table_stats
(ownname           =>
‘OXX_XXT_OWNER‘,

tabname           =>
‘ID_OXXXDX_MX‘,

estimate_percent  =>
20,

degree           
=> 8,

cascade          
=> TRUE);

END;

/

4.6.  开启行迁移

ALTER TABLE OXX_XXT_OWNER.ID_OXXXDX_MX 
ENABLE ROW
MOVEMENT;

5. 验证

执行如下sql语句:

SELECT *

FROM dba_tab_partitions

WHERE table_owner =
‘OXX_XXT_OWNER‘ AND table_name
= ‘ID_OXXXDX_MX‘

返回结果不为空 则说明执行成功。

本文作者:黎俊杰(网名:踩点),从事”系统架构、操作系统、存储设备、数据库、中间件、应用程序“六个层面系统性的性能优化工作

欢迎加入 系统性能优化专业群,共同探讨性能优化技术。群号:258187244

时间: 2024-10-27 07:35:11

一个完整的以在线重定义方式普通表转分区表的方案的相关文章

Oracle在线重定义DBMS_REDEFINITION 普通表—>分区表

实验环境:RHEL 6.4 + Oracle 11.2.0.3实验:在线重定义 普通表 为 分区表,包括主键对应的索引都改造为分区索引. 1,构造普通表t_objects conn test1/test1; create table t_objects as select * from dba_objects; SQL> select count(1) from t_objects; COUNT(1) ---------- 468738 --t_objects建立主键和索引 alter tabl

如何对已经存在数据的表进行在线重定义方式实现分区

转一位大神的笔记. Oracle的普通表没有办法通过修改属性的方式直接转化为分区表,必须通过重建的方式进行转变,下面介绍三种效率比较高的方法,并说明它们各自的特点. 方法一:利用原表重建分区表. 步骤: SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE); 表已创建. SQL> INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS; 已创建6264行. SQL> COMMIT;

oracle普通表转分区表(在线重定义方式)

1.1.TAB_TAOBAO_BILL 1.1.1检查下这张表是否可以在线重定义,无报错表示可以,报错会给出错误信息: exec dbms_redefinition.can_redef_table('ycheng', 'P_TAB_TAOBAO_BILL'); 1.1.2.expdp导出表进行备份(这里的DATA_PUMP_1目录是/data1/dpdump) expdp \'\/ as sysdba\' directory=DATA_PUMP_1 tables=TAB_TAOBAO_BILL

使用ORACLE在线重定义将普通表改为分区表

1.首先建立测试表,并插入测试数据: create table myPartition(id number,code varchar2(5),identifier varchar2(20)); insert into myPartition values(1,'01','01-01-0001-000001'); insert into myPartition values(2,'02','02-01-0001-000001'); insert into myPartition values(3,

ORACLE系统包DBMS_REDEFINITION实现表的在线重定义

ORACLE自带的DBMS_REDEFINITION包功能非常强大,可以用于降低高水位线,回收碎片空间,对表做在线重定义(添加或删除字段,改变字段类型,普通表重定义表为分区表,分区表重定义表为普通表等等) 另外,它有一个非常强大的功能,"在线"二字体现得淋漓尽致,但是也并不是完全的在线,因为在完成重定义前的最后一下,会持会表级排他锁,但这个锁定时间是可控的. 如果你也曾为delete无法降低高水位线而烦恼或者由于历史表太大导致维护困难,我相信这篇文章将对你有很大的感触,因此相信绝大朋友

Oracle已有数据表建立表分区—在线重定义

今天在做数据抽取的时候,发现有一张业务表数据量达到了5000W,所以就想将此表改为分区表.分区表的有点如下: 1.改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度.2.增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用:3.维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可:4.均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能. 第一步:首先对要在线重定义的表自行验证,看该表是否可以重定义,如果不可以则会提示错误信息 SQL>

oracle在线重定义表

在一个高可用系统中,如果需要改变一个表的定义是一件比较棘手的问题,尤其是对于7×24系统.Oracle提供的基本语法基本可以满足一般性修改,但是对于把普通堆表改为分区表,把索引组织表修改为堆表等操作就无法完成了.而且,对于被大量DML语句访问的表,幸运的是,Oracle从9i版本开始提供了在线重定义表功能,通过调用DBMS_REDEFINITION包,可以在修改表结构的同时允许DML操作. 在线重定义表具有以下功能:修改表的存储参数:可以将表转移到其他表空间:增加并行查询选项:增加或删除分区:重

dbms_redefinition在线重定义表结构 可以在表分区的时候使用

dbms_redefinition在线重定义表结构 (2013-08-29 22:52:58) 转载▼ 标签: dbms_redefinition 非分区表转换成分区表 王显伟 在线重定义表结构 在线转换非分区表 分类: ORACLE新特性实践 刚接手一套系统应用数据库,因为项目建设期间种种原因,库是非归档模式也没有备份,更让我无语的是有个表增长的比较快,将近90G大小,每隔一段时间都要删除前三个月以前的数据,然后再用shrink收缩空间,因为是非分区表,shrink很是浪费时间,而且很多时间无

oracle 11g在线重定义 普通表变分区表

第一种方法使用主键id进行重定义--createusertestidentifiedby1accountunlock;--grantresource--grantcreateanytable,alteranytable,dropanytable,lockanytable,selectanytabletotest;--<1>创建测试表,以下使用在线重定义把表转换为分区表,created为分区键,object_id为.. v.17173.com/playlist_17354294.htmlv.17