基于oracle在线,Oracle 基于 dbms_redefinition 在线重定义表

Oracle 支持在线重定义表,也就是说我们可以在修改表结构(DDL)的同时进行相关的DQL、DML操作,使得前端的DML根本感觉不到表结构实际上已经发生了变化,对于用户而言是完全透明的。当然在线重定义期间,前端性能会稍微有所下降。Oracle提供的重定义包dbms_redefinition即是用与完成此操作。其实质是Oracle使用了智能物化视图及物化视图日志的方式。在对象结构重组期间,表现为一个本地对象的复制,重组期间发生的任何变化都会被刷新到最新。

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

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

1、在线重定义表的主要功能:

修改表或簇的存储参数

将表移动到相同或不同schema下不同的tablespace(如果不要求表始终可用的话,也可以直接使用alter table move 实现)

为表添加,修改或删除列

为表添加或删除分区,改变分区结构

改变物化视图日志或者Streams Advanced Queuing queue 表结构

增加并行查询支持

重建表以减少碎片

将堆表变为索引组织表或相反

2、图示在线重定义

下面的图示便于理解是如何进行在线重定义,其本质是基于基表的一个快照

3、在线重定义的步骤

a、选择在线重定义的方式,基于键(主键或唯一键)还是rowid(无主键或唯一键的情形)

b、校验表能否被在线重定义,使用过程CAN_REDEF_TABLE

c、创建用于在线重定义的临时表(该临时表使用新的表结构,即添加删除列,列长度变化,存储属性变化等)

d、如果重定义的为分区表且使用rowid方式,应该为临时表开启行移动(ALTER TABLE ... ENABLE ROW MOVEMENT;)

e、对于大型表的在线重定义可以通过启用并行以提高性能(此步骤可选)

ALTER SESSION FORCE PARALLEL DML PARALLEL degree-of-parallelism;

ALTER SESSION FORCE PARALLEL QUERY PARALLEL degree-of-parallelism;

f、调用过程start_redef_table启动在线重定义,如果启动失败,应调用ABORT_REDEF_TABLE先终止查找原因后再次启动

g、从被重定义的表复制依赖对象到临时表(triggers, indexes, materialized view logs, grants, and constraints)及统计信息到临时表

h、同步被重定义的表到临时表(调用过程sync_interim_table,此步可选)

i、调用过程FINISH_REDEF_TABLE完成表的在线重订义

j、删除临时表

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
将一张 7 亿行的进行在线分区需要经过以下步骤: 1. 首先需要创建分区,可以使用 `CREATE TABLE` 语句创建一个基于范围的分区。 2. 然后需要创建分区索引,可以使用 `CREATE INDEX` 语句创建一个基于范围的分区索引。 3. 然后需要将数据从原迁移到新的分区中。可以使用 Oracle 提供的在线定义(Online Redefinition)功能,该功能允许在不停机的情况下对进行定义。使用在线定义可以将原数据插入到新的分区中,并在插入的过程中进行分区操作。 4. 最后需要命名原,并将新命名为原的名称。这样做可以确保应用程序仍然可以访问,而不需要修改应用程序代码。 下面是一个基于范围的分区的示例,展示如何使用在线定义将原迁移到新的分区中: ``` -- 创建分区 CREATE TABLE my_table_partitioned ( id NUMBER, name VARCHAR2(50), created_date DATE ) PARTITION BY RANGE(created_date) ( PARTITION p1 VALUES LESS THAN (TO_DATE('2020-01-01', 'YYYY-MM-DD')), PARTITION p2 VALUES LESS THAN (TO_DATE('2021-01-01', 'YYYY-MM-DD')), PARTITION p3 VALUES LESS THAN (MAXVALUE) ); -- 创建分区索引 CREATE INDEX my_table_partitioned_idx ON my_table_partitioned(created_date) LOCAL; -- 使用在线定义将原迁移到新的分区中 DECLARE l_table_name VARCHAR2(30) := 'MY_TABLE'; l_new_table_name VARCHAR2(30) := 'MY_TABLE_PARTITIONED'; BEGIN DBMS_REDEFINITION.START_REDEF_TABLE( uname => USER, orig_table => l_table_name, int_table => l_new_table_name, options_flag => DBMS_REDEFINITION.CONS_USE_ROWID ); DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS( uname => USER, orig_table => l_table_name, int_table => l_new_table_name, num_errors => 0, copy_indexes => DBMS_REDEFINITION.CONS_ORIG_PARAMS, copy_triggers => TRUE, copy_constraints => TRUE, copy_privileges => TRUE, ignore_errors => FALSE ); DBMS_REDEFINITION.SYNC_INTERIM_TABLE( uname => USER, orig_table => l_table_name, int_table => l_new_table_name ); DBMS_REDEFINITION.FINISH_REDEF_TABLE( uname => USER, orig_table => l_table_name, int_table => l_new_table_name ); END; / -- 命名原,将新命名为原名称 RENAME my_table TO my_table_old; RENAME my_table_partitioned TO my_table; ``` 在上面的示例中,我们创建了一个基于范围的分区 `my_table_partitioned`,并创建了一个基于范围的分区索引 `my_table_partitioned_idx`。然后,我们使用 `DBMS_REDEFINITION` 包中的在线定义功能,将原 `my_table` 中的数据迁移到新的分区 `my_table_partitioned` 中。最后,我们命名了原,并将新命名为原的名称。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值