问题描述
假设:
1) 插入物连续应用在表A上
要求:
需要与另一个表交换分区,但不想失去任何数据 (我对 “ORA-00054: 资源繁忙和获取与NOWAIT指定或超时过期” 异常很好,因为不会有相同的数据丢失)
Test Run:
放下表a;
放下表b;
drop序列sq_tst1;
drop序列sq_tst2;
创建表a
(
身份证号码,
dt日期,
瓦尔·瓦尔查尔2(10))
按范围划分 (dt) (
分区e1值小于 (最大值)
);
将表b创建为select *,其中1 = 2;
下面的PL SQL块需要在并行和中间的地方执行,我们可以执行exchange分区 (作为ALTER TABLE a EXCHANGE分区e1与表b;)
P1:
开始
我在1 ..1000000
循环
插入到值 (sq_tst1.NEXTVAL,SYSDATE-(1000000 i)/3600,'Test');
提交;
-- DBMS_LOCK.SLEEP(1);
结束循环;
结束;
/
P2:
开始
我在1 ..1000000
循环
插入到值 (sq_tst2.NEXTVAL,SYSDATE-(1000000 i)/3600,'Test');
提交;
-- DBMS_LOCK.SLEEP(1);
结束循环;
结束;
/
是否存在可能丢失数据的情况?exchange分区应该花费多少时间 (在最坏的情况下)?
1) 插入物连续应用在表A上
要求:
需要与另一个表交换分区,但不想失去任何数据 (我对 “ORA-00054: 资源繁忙和获取与NOWAIT指定或超时过期” 异常很好,因为不会有相同的数据丢失)
Test Run:
放下表a;
放下表b;
drop序列sq_tst1;
drop序列sq_tst2;
创建表a
(
身份证号码,
dt日期,
瓦尔·瓦尔查尔2(10))
按范围划分 (dt) (
分区e1值小于 (最大值)
);
将表b创建为select *,其中1 = 2;
下面的PL SQL块需要在并行和中间的地方执行,我们可以执行exchange分区 (作为ALTER TABLE a EXCHANGE分区e1与表b;)
P1:
开始
我在1 ..1000000
循环
插入到值 (sq_tst1.NEXTVAL,SYSDATE-(1000000 i)/3600,'Test');
提交;
-- DBMS_LOCK.SLEEP(1);
结束循环;
结束;
/
P2:
开始
我在1 ..1000000
循环
插入到值 (sq_tst2.NEXTVAL,SYSDATE-(1000000 i)/3600,'Test');
提交;
-- DBMS_LOCK.SLEEP(1);
结束循环;
结束;
/
是否存在可能丢失数据的情况?exchange分区应该花费多少时间 (在最坏的情况下)?
专家解答
您不会丢失数据,例如
所以我们仍然有100,000行。请注意,(一如既往) 我们从不保证您不会删除序列值
-- -- session 1 -- SQL> create sequence sq_tst1 cache 1000; Sequence created. SQL> SQL> CREATE TABLE a 2 ( 3 id NUMBER, 4 dt DATE, 5 val VARCHAR2(10)) 6 PARTITION BY RANGE(dt) ( 7 partition e1 values less than (MAXVALUE) 8 ); Table created. SQL> SQL> create table b as select * from a where 1=2; Table created. SQL> SQL> BEGIN 2 for i in 1 .. 100000 3 loop 4 INSERT INTO a VALUES (sq_tst1.NEXTVAL, SYSDATE - (1000000 + i)/3600, 'Test'); 5 COMMIT; 6 end loop; 7 end; 8 / -- -- whilst running, in session 2 -- SQL> alter session set ddl_lock_timeout = 5; Session altered. SQL> alter table a exchange partition e1 with table b; Table altered. -- -- Session 1 -- PL/SQL procedure successfully completed. SQL> select count(*) from a; COUNT(*) ---------- 66462 1 row selected. SQL> select count(*) from b; COUNT(*) ---------- 33538 1 row selected.复制
所以我们仍然有100,000行。请注意,(一如既往) 我们从不保证您不会删除序列值
SQL> select min(id), max(id) from b; MIN(ID) MAX(ID) ---------- ---------- 1 33538 SQL> select min(id), max(id) from a; MIN(ID) MAX(ID) ---------- ---------- 33540 100001复制
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
592次阅读
2025-04-15 17:24:06
【纯干货】Oracle 19C RU 19.27 发布,如何快速升级和安装?
Lucifer三思而后行
556次阅读
2025-04-18 14:18:38
XTTS跨版本迁移升级方案(11g to 19c RAC for Linux)
zwtian
479次阅读
2025-04-08 09:12:48
Oracle数据库一键巡检并生成HTML结果,免费脚本速来下载!
陈举超
470次阅读
2025-04-20 10:07:02
【ORACLE】记录一些ORACLE的merge into语句的BUG
DarkAthena
456次阅读
2025-04-22 00:20:37
【ORACLE】你以为的真的是你以为的么?--ORA-38104: Columns referenced in the ON Clause cannot be updated
DarkAthena
429次阅读
2025-04-22 00:13:51
Oracle 19c RAC更换IP实战,运维必看!
szrsu
428次阅读
2025-04-08 23:57:08
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
413次阅读
2025-04-17 17:02:24
火焰图--分析复杂SQL执行计划的利器
听见风的声音
357次阅读
2025-04-17 09:30:30
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
355次阅读
2025-04-15 14:48:05