基本原理
oracle表的在线重定义是间接通过prebuild物化视图实现的,在执行DBMS_REDEFINITION.START_REDEF_TABLE()后,我们可以通过查询,user_mviews与user_mview_logs,发现增
加了对应的物化视图和物化视图日志,而SYNC_INTERIM_TABLE(),其实也只是物化视图的增量刷新,最终执行FINISH_REDEF_TABLE()的时候,将锁定原表,防止表上的DML,物化视
图执行刷新,完成刷新后,将删除物化视图和对应的日志,将中间表rename成目标表。
主要功能
修改表的存储参数
在同一个schema下将表移动到不同的tablespace
增加并行查询支持
添加或则删除分区支持
重建表以减少碎片
将堆表变为索引组织表或相反
添加或删除列
好处:
重组表数据、压缩空间
在线把表从一个表空间迁移到另一个表空间
把表从普通表转换成分区表或者从分区表转换成普通表
在线删除字段
修改表的一些参数,一些需要重组才能起效的特性,比如INITRANS参数。
限制:
如果使用基于主键的方式,则原表后重定义的表必须有相同的主键
如果使用基于ROWID的方式,则不能是索引组织表
如果原表上有物化视图或者高级队列不能在线重定义
物化视图容器表或者高级队列表不能在线重定义
拥有bfile、long列的表不能在线重定义
cluster中的表不能在线重定义
sys和system下的表不能在线重定义
临时表不能在线重定义
不支持水平数据子集
在列映射时只能使用有确定结果的表达式,如子查询就不行
如果中间表有新增列,则不能有not null约束
原表和中间表之间不能有引用完整性
在线重定义无法使用nologging
在线重定义分区表的实施步骤
1 2 建个和源表表结构一样的分区表,作为中间表
2 在线重定义的表自行验证,看是否可以重定义
SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('username', 'table_name', 'table_name_tmp');
PL/SQL procedure successfully completed.
3 执行表的在线重定义
SQL>EXEC DBMS_REDEFINITION.START_REDEF_TABLE('username', 'table_name', 'table_name_tmp');
PL/SQL procedure successfully completed.
4 执行把中间表的内容和数据源表进行同步
SQL> execute dbms_redefinition.sync_interim_table('username', 'table_name', 'table_name_tmp');
PL/SQL procedure successfully completed.
5 执行结束在线定义过程
SQL> EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE('username', 'table_name', 'table_name_tmp');
PL/SQL procedure successfully completed.
6 如果执行在线重定义的过程中出错
可以在执行dbms_redefinition.start_redef_table之后到执行dbms_redefinition.finish_redef_table之前的时间里执行:DBMS_REDEFINITION.abort_redef_table('username',
'table_name', 'table_name_tmp')以放弃执行在线重定义。
- 浏览: 8054 次
- 性别:
- 来自: 青岛
相关推荐
ORACLE生产环在线重定义分区表,不停机,不影响业务
"在线表重定义——Oracle 10g系列专栏(二)" 在线表重定义是Oracle 10g系列专栏中的一项重要功能,允许用户在线更改表结构,而不需要锁定表。这种功能对于维持Oracle数据库的高可用性非常重要。 传统的表维护动作,...
自己的做的在线重定义 记录一次工作内容步骤,方便使用 基于rowid 的方式
总的来说,Oracle的在线重定义功能提供了一种高效且低影响的方式将普通表转换为分区表,尤其适用于大型表,它可以显著提升数据管理效率和查询性能。在进行这种转换时,应根据具体的业务需求和数据规模选择合适的方法...
在线重定义(Online Redefinition)是Oracle数据库提供的一种功能,允许用户在不影响应用程序正常运行的情况下,对数据库表进行重构。这一过程主要依赖于DBMS_REDEFINITION包,它包含了一系列的PL/SQL过程,使得...
已存在的非分区表无法直接转化为分区表,需要通过特定的在线重定义操作来完成。此外,分区会增加数据库的复杂性,可能需要更多的存储空间,并且对数据库设计和维护提出了更高要求。 Oracle表分区主要有以下几种类型...
- **现有表转换限制**:无法直接将已有的表转换为分区表,但可通过 Oracle 提供的在线重定义表功能实现转换。 #### 三、Oracle 分区方法 ##### 1. 范围分区(Range Partitioning) 范围分区基于某一列的值范围来...
2. **使用在线重定义**:对于大型表或者不允许停机的情况,可以考虑使用在线重定义功能。 ```sql CREATE TABLE new_table AS SELECT * FROM old_table; ALTER TABLE old_table RENAME TO old_table_backup; ...
- 已经存在的表不能直接转化为分区表,但Oracle提供了在线重定义功能。 #### 四、表分区的类型及操作方法 1. **范围分区**:最常用的分区类型之一,根据分区键的范围将数据映射到各个分区。通常使用日期作为分区键...
在线重定义表实验记录(普通表在线重定义为分区表)
- 无法直接将已存在的表转换为分区表,需使用在线重定义表功能。 - 分区管理可能增加数据库复杂性。 4. **表分区的几种类型及操作方法** - **范围分区(Range Partitioning)**:根据分区键的范围划分数据。...
Oracle提供在线重分区功能,可以在不中断服务的情况下改变分区结构。 - **合并分区**:当某些分区不再需要频繁访问时,可以考虑合并分区以减少存储需求。 - **删除分区**:对于过期的数据,可以定期删除分区,...
2. **判断是否可重定义**:使用`DBMS_REDEFINITION.CAN_REDEF_TABLE`函数检查目标表是否支持重定义。 3. **启动重定义过程**:调用`DBMS_REDEFINITION.START_REDEF_TABLE`函数启动重定义流程。 4. **同步数据**:...
oracle数据库在生产上运行时,需要对表进行分区操作,不能停生产但还需要进行表分区,使用在线重定义方式进行操作即可,严格按照文档操作即可完成。
然而,分区也有其缺点,如已存在的非分区表无法直接转换为分区表,需要使用Oracle提供的在线重定义功能。此外,分区会增加数据库的复杂性,可能需要更多的存储空间,并可能对某些类型的DML操作(如INSERT、UPDATE、...
1. 现有表转换:已有的非分区表不能直接转为分区表,需要使用Oracle提供的在线重定义功能。 三、Oracle分区方法 1. 范围分区:基于特定列的数值范围进行分区,如按序号或日期创建分区。 2. Hash分区:通过哈希函数...
实战例子中的脚本可能会包含如何插入数据、查询特定分区、动态添加新分区、重分区以及维护分区表的其他操作。例如,当年度更迭时,可能需要执行一个脚本来自动添加新的年度分区,以保持数据的有序性。 使用分区脚本...
- 已经存在的表不能直接转换为分区表,但Oracle提供在线重定义表的功能,可以在一定程度上解决这一问题。 #### 四、表分区的几种类型及操作方法 - **范围分区**:根据特定的范围将数据分配到各个分区。最常见的...
1. **转换限制**:现有的表无法直接转换为分区表,但Oracle提供了在线重定义表的功能来解决这一问题。 2. **管理复杂度增加**:虽然分区简化了一些管理任务,但也引入了额外的管理复杂度,特别是在分区策略设计上。 ...
使用联机重定义 只有C方案才能保证数据的完全一致性; -- 但是经过测试发现方案B和C都存在分区过程的不透明性,对EXCEPTION不好控制,另外C方案比较适合手工操作,不适合自动运行; -- B方案比较适合将非分区表中的数据放...