数据库复制和一致性的检查
-
16-10-2019 - |
题
我有一个问题是关于两个数据库(Oracle10g),我有,我们就称他们为A和B。一个有一些信息,(在各种表格),并且我希望B得到一个部分的复制一些表一,并不断检查的变化和同步他们在B。
我想问问你关于一些方法、技术或可能的想法,知道我不能做任何的变化(仅选择,没有触发器).
我感谢你的帮助和耐心(对可编辑)。
额外信息:
谢谢你的答案,我不知道它是相关的,但是我发现的减算,虽然我不确定如果适用一个"子表格"(选择)。
解决方案
你的选择很有限,因为你的要求"不断检查...同步"和"不能让任何变化"。事情如实查看记录、dbms_alert、溪流,以及一个备用数据库有关的表。
如果发表在一个不断有他们的所有行更新,则(作为杰克*道格拉斯所说的)一体化图将是最简单到设置。在更有可能事件,大部分的记录没有改变,在每时每刻,你可能会想要建立一个包(或软件包)在B,选择合并,删除必要时在B。这只会可以作为以更新的频率运行,但鉴于你要求它可以最好你可以做。
具体地说,你的包裹应该做到以下几点:
- 删除B行不存在的A.
- 合并 A到B的更新相匹配时,插入当不匹配。
如果你想要避免的撞击中表多次你可以插入的完整的表格进入一个全球性的临时表格B,然后做你删除或合并。
关于减:
减 可以告诉你所有的行查询的,是不是在B。通过联盟-ing这个B减去查询的,你可以得到所有行的是不同的,但是这将很可能需要较长的处理时间甚至之前添加插入/更新的一部分。如果没有得到更新或删除,然后你可以插入结果的第一个减去,但一个 insert into B...where not exists A...
将仍然是更快、更简单。
其他提示
有没有办法知道这一中的表改变了,除了通过投票。你可以考虑具体化的意见,清爽周期性的,它可以工作dblink-但是只有一个完整的刷新是可能的,所以这可能只是实用的,如果表都小。
艰难的一个,鉴于你有没有访问超过一选择在db_A.因此,这里的一个想法,但它需要一些相当严格的假设可能(或不可能)应得到满足:
要求:
- 所有的表同步会:
- 时间戳(更多的决议的更美好)
- 一个独特的、顺序ID
- 所有表行,一旦同步,不要变化。
- 或者,如果一个改变并发生和更新时间戳记录上,你可能能够作出这种方式。
现在,在db_B:
CREATE TABLE table1...
CREATE TABLE table2...,
etc.
PROCEDURE SYNC_TABLE1 IS
MAX_ACTIVITY_DATE DATE;
MAX_SEQUENCE_NO NUMBER;
BEGIN
SELECT MAX(SEQUENCE_NO), MAX(ACTIVITY_DATE)
INTO MAX_SEQUENCE_NO, MAX_ACTIVITY_DATE
FROM table1;
EXCEPTION WHEN NO_DATA_FOUND THEN
MAX_SEQUENCE_NO := 0;
MAX_ACTIVITY_DATE = TO_DATE('01/01/1980', 'MM/DD/YYYY');
END;
-- Bring over recent entries from db_A.table1 to db_B.table1
INSERT INTO table1
SELECT *
FROM table1@db_A
WHERE
-- if using timestamps as your criteria:
activity_date > MAX_ACTIVITY_DATE
-- if using sequence nos as your criteria:
sequence_no > MAX_SEQUENCE_NO
;
-- consider adding limiters to decrease the bandwidth necessary
-- for large transactions. For example activity_date < MAX_ACTIVITY_DATE + 30
-- would load a month's worth of transactions at a time. sequence_no <
-- MAX_SEQUENCE_NO + 500 would load 500 transactions at a time.
COMMIT;
EXCEPTION WHEN OTHERS THEN
ROLLBACK;
-- Consider logging the error!
RAISE;
END;
(lather, rinse, repeat.)
再次,这只是工作,如果你有任何一个顺序的独特标识或活动的日期,始终是最新db_A(和该日期应有足够的决议来检测一事务插入一毫秒以前后一个,所以有时间戳是最好的。)
我的同步数据之间的Oracle实例(与非Oracle实例,例如Oracle mySql)是确保我有一个sync_date列在所有我的同步'able表。当一个请求是为了同步数据,即sync_date列的填充日期同步。因此实际同步过程很简单:
FOR r in ( SELECT * FROM table1
WHERE sync_date IS NULL ) LOOP
send_sync_data_somewhere;
UPDATE table1
SET sync_date = current_timestamp
WHERE rowid=r.rowid;
END LOOP;
通常一个限制进入的效果,但是你的想法。此外,如果数据变更记录上,sync_date柱是调零,在这一点的同步过程将选择它再度回升。
注:无论情况,将需要某种重复处理,如果你能够支助数据的变化,一旦一个行已经同步。你可以尝试一合并,或插入一个不存在的选择条款与更新...在那里的存在。
希望这有所帮助。