问题描述
嗨,汤姆,专家们,
我需要手动将所有对象从一个架构复制到另一个架构 (手动,因为我的架构,无论是源还是目标,都驻留在云中,我无法访问任何操作系统级别的实用程序,也无法访问sql * net数据库与客户端工具连接)。
目标是,我创建我的数据的定期备份,我刷新说每周,在灾难的情况下 (例如,甚至用户错误),我可以轻松地将我的应用程序下的数据库模式从源切换到目标模式。
我想问什么是让我的序列在源与目标之间保持同步的优雅解决方案。在实践中,我想使用高度自动化的解决方案,可以dbms_scheduler-scheduled,不需要任何人工干预,可以完全/初始和增量方式执行。
我可以将select从源授予目标架构,并使用insert作为select-到目前为止还不错。
我的问题是使填充主键的序列在源与目标之间保持同步,以便
1.在目标中,表中已填充的主键与源中相同,以保持FK完整性
2.当我尝试在目标中插入新记录时,相应的序列提供了一个在源中最后分配的数字之后的数字
我发现使用12c标识列功能的表甚至有点棘手,因为系统生成的序列在源和目标架构中甚至没有相同的名称 (如果我想手动维护它们的话!)
您能建议一种优雅的方法来使我的序列在这种手动 “复制” 期间保持同步吗?
我有几个想法 (进一步分享),但没有发现其中任何一个特别优雅。
这里是一个非常简单的测试用例 (带有标识列):
-在源架构中创建表并填充几条记录
-现在在其他模式中重新创建对象 (对于此测试,无论是相同还是不同的模式都没有关系,因为身份列系统生成的序列无论如何都将具有唯一的名称),并通过insert复制数据作为选择:
现在,假设我的源架构坏了,我想切换到目标架构。
如果我尝试在AI2中插入一行,它将出错,因为主键列上的数据默认序列没有与先前插入的数据同步:
ORA-00001: 违反唯一约束 (EKTEST.AI2_PK)
ORA-06512: 在 “SYS.DBMS_SQL”,第1721行
如何避免这种情况?
在身份列的情况下,我一直在想什么:
1.调整我的表创建ddl,以将 “开始方式” 指定为大于源表主键的最大值的值-在增量插入的情况下,这将无济于事
2.添加一个周期以将序列提升到相同的最大值-嗯,不是很好
3.添加一个周期以在目标表中插入虚拟记录,直到序列达到源表中的最大值,然后截断该表并插入选择真实记录-甚至在增量插入的情况下也不好
你的专家建议是什么?
非常感谢!
我需要手动将所有对象从一个架构复制到另一个架构 (手动,因为我的架构,无论是源还是目标,都驻留在云中,我无法访问任何操作系统级别的实用程序,也无法访问sql * net数据库与客户端工具连接)。
目标是,我创建我的数据的定期备份,我刷新说每周,在灾难的情况下 (例如,甚至用户错误),我可以轻松地将我的应用程序下的数据库模式从源切换到目标模式。
我想问什么是让我的序列在源与目标之间保持同步的优雅解决方案。在实践中,我想使用高度自动化的解决方案,可以dbms_scheduler-scheduled,不需要任何人工干预,可以完全/初始和增量方式执行。
我可以将select从源授予目标架构,并使用insert作为select-到目前为止还不错。
我的问题是使填充主键的序列在源与目标之间保持同步,以便
1.在目标中,表中已填充的主键与源中相同,以保持FK完整性
2.当我尝试在目标中插入新记录时,相应的序列提供了一个在源中最后分配的数字之后的数字
我发现使用12c标识列功能的表甚至有点棘手,因为系统生成的序列在源和目标架构中甚至没有相同的名称 (如果我想手动维护它们的话!)
您能建议一种优雅的方法来使我的序列在这种手动 “复制” 期间保持同步吗?
我有几个想法 (进一步分享),但没有发现其中任何一个特别优雅。
这里是一个非常简单的测试用例 (带有标识列):
-在源架构中创建表并填充几条记录
CREATE TABLE "AI1"
( "AI1ID" NUMBER GENERATED BY DEFAULT AS IDENTITY MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 2 NOORDER NOCYCLE NOKEEP NOT NULL ENABLE,
"NAME" VARCHAR2(10),
CONSTRAINT "AI1_PK" PRIMARY KEY ("AI1ID")
USING INDEX ENABLE
)
/
insert into ai1 (name) values ('test1');
/
insert into ai1 (name) values ('test2');
/
insert into ai1 (name) values ('test3');
/
-现在在其他模式中重新创建对象 (对于此测试,无论是相同还是不同的模式都没有关系,因为身份列系统生成的序列无论如何都将具有唯一的名称),并通过insert复制数据作为选择:
CREATE TABLE "AI2"
( "AI2ID" NUMBER GENERATED BY DEFAULT AS IDENTITY MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 2 NOORDER NOCYCLE NOKEEP NOT NULL ENABLE,
"NAME" VARCHAR2(5),
CONSTRAINT "AI2_PK" PRIMARY KEY ("AI2ID")
USING INDEX ENABLE
)
/
insert into ai2 select * from ai1;
/
现在,假设我的源架构坏了,我想切换到目标架构。
如果我尝试在AI2中插入一行,它将出错,因为主键列上的数据默认序列没有与先前插入的数据同步:
insert into ai2 (name) values ('test4'); ORA-00001: 违反唯一约束 (EKTEST.AI2_PK)
ORA-06512: 在 “SYS.DBMS_SQL”,第1721行
如何避免这种情况?
在身份列的情况下,我一直在想什么:
1.调整我的表创建ddl,以将 “开始方式” 指定为大于源表主键的最大值的值-在增量插入的情况下,这将无济于事
2.添加一个周期以将序列提升到相同的最大值-嗯,不是很好
3.添加一个周期以在目标表中插入虚拟记录,直到序列达到源表中的最大值,然后截断该表并插入选择真实记录-甚至在增量插入的情况下也不好
你的专家建议是什么?
非常感谢!
专家解答
这是一个比你想象的大得多的任务。存在锁定问题,确保引用完整性的数据排序以及使事情复杂化的许多其他事情。
您需要跟踪赠款、同义词、视图、plsql、所有其他DDL...
您想为此查看类似Goldengate的东西。
如果你真的必须手动做,并且不能使用数据泵,那么我建议你简单地做创建表即选择,因为跟踪增量变化是一项巨大的任务。
您需要跟踪赠款、同义词、视图、plsql、所有其他DDL...
您想为此查看类似Goldengate的东西。
如果你真的必须手动做,并且不能使用数据泵,那么我建议你简单地做创建表即选择,因为跟踪增量变化是一项巨大的任务。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




