【Oracle】利用在线重定义的方式改变普通表为分区表
Oracle 利用 方式 定义 在线 改变 普通 分区表
2023-09-14 08:57:29 时间
将表A 命名为A_OLD 将A_NEW 该名为A;
2 利用在先重定义的方式!也是接下来要介绍的方法!
第一种方式需要停止应用对A的写访问;使用在线重定义的方式可以对应用透明!
测试例子如下:
1 创建测试表
创建普通表:
@bigtab.sql --tom 的大表创建脚本!
创建中间分区PART_TAB,使用PART_TAB来替换bigtab
YANG@yangdb CREATE TABLE PART_TAB
2 ( ID NUMBER,
3 OWNER VARCHAR2(30) NOT NULL ENABLE,
4 OBJECT_NAME VARCHAR2(30) NOT NULL ENABLE,
5 SUBOBJECT_NAME VARCHAR2(30),
6 OBJECT_ID NUMBER NOT NULL ENABLE,
7 DATA_OBJECT_ID NUMBER,
8 OBJECT_TYPE VARCHAR2(19),
9 CREATED DATE NOT NULL ENABLE,
10 LAST_DDL_TIME DATE NOT NULL ENABLE,
11 TIMESTAMP VARCHAR2(19),
12 STATUS VARCHAR2(7),
13 TEMPORARY VARCHAR2(1),
14 GENERATED VARCHAR2(1),
15 SECONDARY VARCHAR2(1),
16 NAMESPACE NUMBER NOT NULL ENABLE,
17 EDITION_NAME VARCHAR2(30)
18 ) PARTITION BY RANGE (id)
19 (PARTITION P1 VALUES LESS THAN (100000),
20 PARTITION P2 VALUES LESS THAN (200000),
21 PARTITION P3 VALUES LESS THAN (300000),
22 PARTITION P4 VALUES LESS THAN (400000),
23 PARTITION P5 VALUES LESS THAN (MAXVALUE)
24 );
Table created.
2 验证是否可以进行在线重定义:
YANG@yangdb EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE(user, BIGTAB, DBMS_REDEFINITION.CONS_USE_PK);
PL/SQL procedure successfully completed.
3 执行表的在线重定义:
YANG@yangdb EXEC DBMS_REDEFINITION.START_REDEF_TABLE(USER, BIGTAB, PART_TAB);
PL/SQL procedure successfully completed.
第一步完成的时候 可以在session 2中查看:
YANG@yangdb SELECT COUNT(*) FROM BIGTAB;
COUNT(*)
----------
500000
YANG@yangdb SELECT COUNT(*) FROM PART_TAB PARTITION (P2);
COUNT(*)
----------
100000
YANG@yangdb SELECT COUNT(*) FROM PART_TAB PARTITION (P3);
COUNT(*)
----------
100000
YANG@yangdb
4 执行把中间表的内容和数据源表进行同步。
在session 2 中对原表进行dml 操作并提交:
YANG@yangdb update bigtab set id=id-1 where rownum 10000;
9999 rows updated.
YANG@yangdb commit;
Commit complete.
在session 1 对表进行同步变化的数据!根据数据量的大小要等待相应的时间!
YANG@yangdb execute dbms_redefinition.sync_interim_table(user,BIGTAB,PART_TAB);
PL/SQL procedure successfully completed.
同步完成之后再次在session 中查询中间表并没有和原表一样:
YANG@yangdb SELECT ID FROM BIGTAB WHERE ROWNUM
ID
----------
1
2
3
4
5
6
7
8
9
9 rows selected.
YANG@yangdb
YANG@yangdb SELECT ID FROM PART_TAB WHERE ROWNUM
ID
----------
1
2
3
4
5
6
7
8
9
9 rows selected.
等到结束之后才可以再次查看的时候 两边一致!
5 执行结束在线定义过程
YANG@yangdb EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE(user, BIGTAB, PART_TAB);
PL/SQL procedure successfully completed.
6 查看数据字典,可以看到改表已经成为了分区表。
YANG@yangdb select table_name,partition_name,high_value from user_tab_partitions;
TABLE_NAME PARTITION_NAME HIGH_VALUE
--------------- --------------- ---------------
BIGTAB P1 100000
BIGTAB P2 200000
BIGTAB P3 300000
BIGTAB P4 400000
BIGTAB P5 MAXVALUE
YANG@yangdb SELECT COUNT(*) FROM BIGTAB;
COUNT(*)
----------
6264
YANG@yangdb SELECT COUNT(*) FROM PART_TAB PARTITION (P2);
COUNT(*)
----------
6246
至此普通表转为分区操作完成
如果执行在线重定义的过程中出错,可以在执行dbms_redefinition.start_redef_table之后到执行dbms_redefinition.finish_redef_table之前的时间里执行:DBMS_REDEFINITION.abort_redef_table(user, t, PART_TAB)以放弃执行在线重定义。
Oracle MySQL相关工具replace操作实现方式区别 本文列举MySQL、Oracle、常用数据导入工具碰到主键冲突、唯一约束、以及其他对重复数据、已有数据的处理区别,并介绍MySQL、Oracle replace相关语句实现区别。 由此可见在实际使用不同数据库过程中,还是有许多差别,需要大家细心留意。
Oracle优化之表连接方式 Oracle优化之表连接方式在Oracle数据库中,两个表之间的表连接方法有排序合并连接、嵌套循环连接、哈希连接和笛卡尔连接四种 1.排序合并连接(sort merge join) 排序合并连接是一种两表在做表连接时用排序(SORT)操作和合并(MERGE)操作来得到连接结果集的表连接方法
2 利用在先重定义的方式!也是接下来要介绍的方法!
第一种方式需要停止应用对A的写访问;使用在线重定义的方式可以对应用透明!
测试例子如下:
1 创建测试表
创建普通表:
@bigtab.sql --tom 的大表创建脚本!
创建中间分区PART_TAB,使用PART_TAB来替换bigtab
YANG@yangdb CREATE TABLE PART_TAB
2 ( ID NUMBER,
3 OWNER VARCHAR2(30) NOT NULL ENABLE,
4 OBJECT_NAME VARCHAR2(30) NOT NULL ENABLE,
5 SUBOBJECT_NAME VARCHAR2(30),
6 OBJECT_ID NUMBER NOT NULL ENABLE,
7 DATA_OBJECT_ID NUMBER,
8 OBJECT_TYPE VARCHAR2(19),
9 CREATED DATE NOT NULL ENABLE,
10 LAST_DDL_TIME DATE NOT NULL ENABLE,
11 TIMESTAMP VARCHAR2(19),
12 STATUS VARCHAR2(7),
13 TEMPORARY VARCHAR2(1),
14 GENERATED VARCHAR2(1),
15 SECONDARY VARCHAR2(1),
16 NAMESPACE NUMBER NOT NULL ENABLE,
17 EDITION_NAME VARCHAR2(30)
18 ) PARTITION BY RANGE (id)
19 (PARTITION P1 VALUES LESS THAN (100000),
20 PARTITION P2 VALUES LESS THAN (200000),
21 PARTITION P3 VALUES LESS THAN (300000),
22 PARTITION P4 VALUES LESS THAN (400000),
23 PARTITION P5 VALUES LESS THAN (MAXVALUE)
24 );
Table created.
2 验证是否可以进行在线重定义:
YANG@yangdb EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE(user, BIGTAB, DBMS_REDEFINITION.CONS_USE_PK);
PL/SQL procedure successfully completed.
3 执行表的在线重定义:
YANG@yangdb EXEC DBMS_REDEFINITION.START_REDEF_TABLE(USER, BIGTAB, PART_TAB);
PL/SQL procedure successfully completed.
第一步完成的时候 可以在session 2中查看:
YANG@yangdb SELECT COUNT(*) FROM BIGTAB;
COUNT(*)
----------
500000
YANG@yangdb SELECT COUNT(*) FROM PART_TAB PARTITION (P2);
COUNT(*)
----------
100000
YANG@yangdb SELECT COUNT(*) FROM PART_TAB PARTITION (P3);
COUNT(*)
----------
100000
YANG@yangdb
4 执行把中间表的内容和数据源表进行同步。
在session 2 中对原表进行dml 操作并提交:
YANG@yangdb update bigtab set id=id-1 where rownum 10000;
9999 rows updated.
YANG@yangdb commit;
Commit complete.
在session 1 对表进行同步变化的数据!根据数据量的大小要等待相应的时间!
YANG@yangdb execute dbms_redefinition.sync_interim_table(user,BIGTAB,PART_TAB);
PL/SQL procedure successfully completed.
同步完成之后再次在session 中查询中间表并没有和原表一样:
YANG@yangdb SELECT ID FROM BIGTAB WHERE ROWNUM
ID
----------
1
2
3
4
5
6
7
8
9
9 rows selected.
YANG@yangdb
YANG@yangdb SELECT ID FROM PART_TAB WHERE ROWNUM
ID
----------
1
2
3
4
5
6
7
8
9
9 rows selected.
等到结束之后才可以再次查看的时候 两边一致!
5 执行结束在线定义过程
YANG@yangdb EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE(user, BIGTAB, PART_TAB);
PL/SQL procedure successfully completed.
6 查看数据字典,可以看到改表已经成为了分区表。
YANG@yangdb select table_name,partition_name,high_value from user_tab_partitions;
TABLE_NAME PARTITION_NAME HIGH_VALUE
--------------- --------------- ---------------
BIGTAB P1 100000
BIGTAB P2 200000
BIGTAB P3 300000
BIGTAB P4 400000
BIGTAB P5 MAXVALUE
YANG@yangdb SELECT COUNT(*) FROM BIGTAB;
COUNT(*)
----------
6264
YANG@yangdb SELECT COUNT(*) FROM PART_TAB PARTITION (P2);
COUNT(*)
----------
6246
至此普通表转为分区操作完成
如果执行在线重定义的过程中出错,可以在执行dbms_redefinition.start_redef_table之后到执行dbms_redefinition.finish_redef_table之前的时间里执行:DBMS_REDEFINITION.abort_redef_table(user, t, PART_TAB)以放弃执行在线重定义。
Oracle MySQL相关工具replace操作实现方式区别 本文列举MySQL、Oracle、常用数据导入工具碰到主键冲突、唯一约束、以及其他对重复数据、已有数据的处理区别,并介绍MySQL、Oracle replace相关语句实现区别。 由此可见在实际使用不同数据库过程中,还是有许多差别,需要大家细心留意。
Oracle优化之表连接方式 Oracle优化之表连接方式在Oracle数据库中,两个表之间的表连接方法有排序合并连接、嵌套循环连接、哈希连接和笛卡尔连接四种 1.排序合并连接(sort merge join) 排序合并连接是一种两表在做表连接时用排序(SORT)操作和合并(MERGE)操作来得到连接结果集的表连接方法
相关文章
- 化解决Oracle小数格式化问题(oracle小数格式)
- 构建更稳健的数据库:借助阿里云运维Oracle(阿里云oracle)
- Oracle 数据库登陆方式介绍(oracle登陆方式)
- 实现Oracle数据从纵向转横向(oracle纵转横)
- 创建Oracle用户:快速入门指南(oracle如何建立用户)
- 利用Oracle中触发器实现自动化功能(oracle触发器类型)
- 抛弃与重塑:Oracle 回收站的清空重置(oracle清空回收站)
- Oracle给予所有权限的华丽改变(oracle授所有权限)
- Oracle实现的天数相减求差(oracle 天数相减)
- Oracle 的内部表示方式揭示(oracle内部表示)
- Oracle如何让时间快速流逝(oracle 减1分钟)
- 库备份最佳实践:利用Oracle EXP数据库备份策略(oracle exp数据)
- Oracle介于查询不断擦亮闪耀的技术光辉(oracle 介于查询)
- Oracle中使用空格的正确方式(oracle中空格)
- 利用Oracle快捷键轻松操作(oracle使用快捷键)
- 策略利用Oracle主键延迟策略提高数据库性能(oracle 主键延迟)
- 用利用Oracle函数开发高效应用(oracle中的函数有啥)
- Oracle中数值除以0的错误处理(oracle中数值除以0)
- 查找Oracle数据库中的指定值(oracle中包含某个值)
- Oracle中的事务控制与锁定机制(oracle中事务和锁)
- 的使用利用Oracle中的AS表提升数据访问速度(oracle 中as 表)