问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何实现oracle两个数据库之间的同步

发布网友 发布时间:2022-04-25 16:22

我来回答

2个回答

懂视网 时间:2022-05-01 03:15

 自己写了个数据同步的方法,两个数据库之间的数据同步,自己可以通过调用存储过程,添加作业实现定时同步数据。

CREATE OR REPLACE PROCEDURE Data_sync_Common(tableName in varchar2) is
 v_sql  VARCHAR2(20000); --????SQL
 pk_col_name VARCHAR2(800); --主键SQL
 insert_col_name_A VARCHAR2(20000); --A表字段
 insert_col_name_B VARCHAR2(20000); --B表字段
 update_col_name VARCHAR2(20000); --更新字段
 dsql  VARCHAR2(20000);
 local_col_in VARCHAR2(20000);
 TYPE cur_type IS REF CURSOR;
 cur_not_contain_col cur_type;
 CURSOR CR1 IS

 -- select ‘alter table ‘||table_name||‘ disable constraint ‘||constraint_name as dsql
 SELECT table_name, constraint_name
 FROM user_constraints
 WHERE constraint_type = ‘R‘
 AND table_name = upper(tableName);
BEGIN
 SELECT to_char(WMSYS.WM_CONCAT(‘‘‘‘ || column_name || ‘‘‘‘))
 INTO local_col_in
 FROM user_tab_cols
 WHERE table_name = upper(tableName);

 dsql := ‘SELECT * FROM user_tab_cols@testjob_dblink1 WHERE table_name=‘‘‘ ||
  upper(tableName) || ‘‘‘ AND column_name not IN(‘ || local_col_in || ‘)‘;
 dbms_output.put_line(dsql);
 OPEN cur_not_contain_col FOR dsql;

 SELECT REPLACE(to_char(WMSYS.WM_CONCAT(‘ AND a.‘ || cu.COLUMN_NAME ||
      ‘=b.‘ || cu.COLUMN_NAME)),
   ‘,‘,
   ‘‘)
 INTO pk_col_name
 FROM user_cons_columns cu, user_constraints au
 WHERE cu.constraint_name = au.constraint_name
 AND au.constraint_type = ‘P‘
 AND au.table_name = upper(tableName);

 IF (pk_col_name IS NULL) OR (LENGTH(pk_col_name) < 6) THEN
 SELECT REPLACE(to_char(WMSYS.WM_CONCAT(‘ and a.‘ || cu.COLUMN_NAME ||
      ‘=b.‘ || cu.COLUMN_NAME)),
   ‘,‘,
   ‘‘)
 INTO pk_col_name
 FROM user_cons_columns cu, user_constraints au
 WHERE cu.constraint_name = au.constraint_name
 AND au.constraint_type = ‘U‘
 AND au.table_name = upper(tableName);
 END IF;

 SELECT to_char(WMSYS.WM_CONCAT(‘b.‘ || column_name))
 INTO insert_col_name_B
 FROM user_tab_cols
 WHERE table_name = upper(tableName);

 SELECT to_char(WMSYS.WM_CONCAT(‘a.‘ || column_name))
 INTO insert_col_name_A
 FROM user_tab_cols
 WHERE table_name = upper(tableName);

 SELECT to_char(WMSYS.WM_CONCAT(‘a.‘ || column_name || ‘=b.‘ ||
     column_name))
 INTO update_col_name
 FROM user_tab_cols
 WHERE table_name = upper(tableName)
 AND column_name NOT IN
  (SELECT cu.COLUMN_NAME
  FROM user_cons_columns cu, user_constraints au
  WHERE cu.constraint_name = au.constraint_name
  AND au.constraint_type = ‘P‘
  AND au.table_name = upper(tableName));

 v_sql := ‘MERGE INTO ‘ || upper(tableName) || ‘@testjob_dblink1 a USING ‘ || upper(tableName) ||
  ‘ b‘ || ‘
  ON (‘ || substr(pk_col_name, 6, length(pk_col_name)) || ‘)‘;
 dbms_output.put_line(update_col_name);
 IF (update_col_name IS NOT NULL) AND (LENGTH(update_col_name) > 0) THEN
 v_sql := v_sql || ‘ when matched then
 update set ‘ || update_col_name;
 END IF;
 v_sql := v_sql || ‘
  when not matched then
  insert (‘ || insert_col_name_A || ‘) values( ‘ ||
  insert_col_name_B || ‘)‘;


 dbms_output.put_line(v_sql);
 EXECUTE immediate(v_sql);
 EXCEPTION
 WHEN OTHERS THEN
 dbms_output.put_line(sqlerrm);

END Data_sync_Common;
-----------------------------调用上述存储过程
CREATE OR REPLACE PROCEDURE DATA_sync is
BEGIN
data_sync_common(‘TEST_SYNC‘);
COMMIT;
EXCEPTION 
 WHEN OTHERS THEN 
 ROLLBACK ;
END DATA_sync;

 

oracle数据表数据同步公用方法

标签:

热心网友 时间:2022-05-01 00:23

为方便完成指定数据表的同步操作,可以采用dblink与merge结合的方法完成。
操作环境:
此数据库服务器ip为192.168.196.76,有center与branch两个库,一般需要将center的表数据同步到branch,center为源库,branch为目标库,具体步骤如下:
1.在源库创建到目标库的dblink
create
database
link
branch
--输入所要创建dblink的名称,自定义
connect
to
dbuser
identified
by
“password”
--设置连接远程数据库的用户名和密码
using
'192.168.196.76/branch';
--指定目标数据库的连接方式,可用tns名称
在创建dblink时,要注意,有时候可能会报用户名和密码错误,但实际上我们所输入的账户信息是正确的,此时就注意将密码的大小写按服务器上所设置的输入,并在账号密码前号加上双引号(服务器版本不同造成的)。
2.成功后验证dblink
select
*
from
tb_bd_action@branch;
--查询创建好的brach库
正常情况下,如果创建dblink成功,可采用该方式访问到远程数据库的表.
3.通过merge语句完成表数据同步
此例中需要将center库中的tb_sys_sqlscripe表同步到branch,简单的语法如下:
merge
into
tb_sys_sqlscripe@branch
b
using
tb_sys_sqlscripe
c
on
(b.pk=c.pk)
--从center将表merge到branch,同步的依据是两个表的pk
when
matched
then
update
set
b.sqlscripe=c.sqlscripe,b.author=c.author
--如果pk值是相同则将指定表的值更新到目标表
when
not
matched
then
--如果pk值不一至,则将源表中的数据整条插入到目标表中
insert
values
(c.pk,
c.fk,
c.createtime,
c.lastmodifytime,c.author,c.mole,c.deleteflag,
c.scripttype);
commit;
--记得merge后必须commit,否则更改未能提交
4.为方便每次需要同步时自动完成同步工作,可将该语句做成存储过程或脚本来定时执行或按要求手动执行,简单说一下创建脚本的方法:
a.创建merge文件夹
b.先将merge语句写完整后,存到merge.sql文件中
c.新建merge.bat文件,编辑后写入以下内容
sqlplus
user/password@serverip/database
@"%cd%\merge.sql"
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
和面的和是什么读音? win10 应用打不开。全都打不开。 进入win10打不开软件 win10电脑软件都打不开是什么原因win10突然软件都打不开软件是怎么回事... 软件打不开怎么办win10电脑点不开软件最简单办法 请问下,离厦门市岛内的台湾路的国联大厦最近的建设银行和农业银行... 从巴黎都市到建设银行怎么坐公交车,最快需要多久 东莞万江官桥窖离建设银行哪路车最近? 建行七支分行有那些公交车经过 佛山哪里有飞越丛林拓展 Oracle里有没有分布式数据库的概念 PLS-00201:identifier &#39;DBA_REPSITES&#39; must be declared。 &#39;DBA_REPSITES&#39; 本来就是oracle内置对象 2个oracle服务器是怎样进行实时数据同步? ORACLE的物化视图,有什么特点,好处 请问安装Oracle时,选择桌面类和服务器类的 有什么区别。 谈谈oracle版本有哪些 哪位能介绍下oracle的RAC、集群、双机热备、Dataguard这些东西?_百 ... 如何加速Oracle大批量数据处理? 两个oracle数据库之间的数据同步 oracle数据库迁移问题---要详细--会追加50分 oracle 数据库的迁移 从AIX迁移到windows2008 R2 下 oracle高级复制实现数据同步,请问这时两个数据库的名字可以相同吗?必 ... Oracle高级复制和流哪个效率更好 做珍珠奶茶的方法一百字? 简单好喝的珍珠奶茶有哪些做法? 发出去朋友圈里的照片可以换吗 LED照明灯有哪几种? LED照明的基本原理是什么? LED照明行业的前景如何? 国内十大LED照明灯具品牌有哪些? oracle 并行怎么写 我有两个oracle数据库需要双向同步 我是中专毕业,怎么才能拿到拿到国家承认的本科文凭? 什么叫一年制中专 微信图文页阅读人数统计包括自己点进去看的吗? vivox27屏幕上跳出腾讯广告怎么关闭? Vivo手机如何关掉腾讯 vivo s5手机怎样单独关闭腾讯视频网络? 步步高手机一拔号码会出现腾讯 步步高x3手机关联了qq号在哪里解除 步步高手机腾讯微博怎么退出,恩左键退出后,再打开还是那个账号 步步高手机在播放腾讯视频的时候会出现短时间绿屏 步步高手机能不能删掉文档里的腾讯 vivo s7 怎么关闭QQ,主菜单在哪? vivo怎样关闭后台运行的 qq? 步步高手机腾讯地图怎么卸载 新旧重疾险怎么选 华为笔记本13用的是第几代芯片? 新旧重疾险定义对比 新规重疾险与老规重疾险哪个好?