您当前的位置:首页 > 电脑百科 > 数据库 > Oracle

Oracle不同数据库之间同步处理方案

时间:2022-01-20 11:41:27  来源:  作者:你还想怎么样啊

背景:项目中遇到的问题,需要二区两台数据库之间同步一些表,以及导出sql文件同步至三区数据库。

1 SQL文件目录

新建SQL文件生成的目录D:mptmsudataDNLTBDIR。

二区数据库中执行下列语句:

create or replace directory DNL_TB_DIR
as 'D:mptmsudataDNLTBDIR';

2 数据库修改

1)新建二区数据库服务器到二区数据库服务器的数据库DATABASE LINK文件。

二区数据库中执行下列语句:

create public database link XQDNJL
connect to YPTMS
using '192.168.10.8/mptmsu';

2)二区数据库服务器新建表DNL_TBJL。

二区数据库中执行下列语句:

-- Create table
create table DNL_TBJL
(
id VARCHAR2(25) not null,
tables VARCHAR2(25) not null,
czlx VARCHAR2(25),
sql VARCHAR2(2000) not null,
time DATE not null,
bak VARCHAR2(128) not null
)
tablespace MPTMSU
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);
-- Add comments to the columns
comment on column DNL_TBJL.id
is 'ID';
comment on column DNL_TBJL.tables
is '同步表名';
comment on column DNL_TBJL.czlx
is '操作类型';
comment on column DNL_TBJL.sql
is 'SQL内容';
comment on column DNL_TBJL.time
is '操作时间';

3 触发器

在二区数据库服务器说新建相关表的触发器,触发器实现的功能是东区2区向西区直接通过DBLINK直接执行;东区2区向东区3区通过生成SQL文件到D:mptmsudataDNLTBDIR目录下;触发器的每次操作都记录到表格DNL_TBJL(id, tables,czlx, SQL, TIME, BAK)内。

下面以AEMTINFO表为例,具体的触发器代码如下:

create or replace trigger SYN_AEMTINFO
after insert or update or delete on AEMTINFO
for each row
/*------------------------------------------------------------------
功 能:东区2区向西区、东区3区传送数据库变化
功能说明:东区2区向西区直接通过DBLINK直接执行;东区2区向东区3区通过生成SQL文件到
D:mptmsudataDNLTBDIR目录下;触发器的每次操作都记录到表格DNL_TBJL
(id, tables,czlx, SQL, TIME, BAK)内。
-------------------------------------------------------------*/
declare
integrity_error exception;
errno integer;
errmsg char(200);
tmp varchar2(1000);
tmpval varchar2(1000);
val varchar2(4000);
id varchar2(20);
dnltb utl_file.file_type;
begin
if inserting then
insert into AEMTINFO@XQDNJL
(EMTID,
SID,
SNAME,
STIME,
ETIME,
INTERVAL,
EARGS,
ADDDATE,
REMARK,
FLAG)
values (:NEW.EMTID, :NEW.SID, :NEW.SNAME, :NEW.STIME, :NEW.ETIME, :NEW.INTERVAL, :NEW.EARGS, :NEW.ADDDATE, :NEW.REMARK, :NEW.FLAG);
select 'insert into AEMTINFO (EMTID,SID,SNAME,STIME,ETIME,INTERVAL,EARGS,ADDDATE,REMARK,FLAG)
values ('
||''''||:NEW.EMTID||''''||','
||''''||:NEW.SID||''''||','
||''''||:NEW.SNAME||''''||','
||'to_date('||''''||to_char(:NEW.STIME,'yyyy-mm-dd hh24:mi:ss')||''''||','||'''yyyy-mm-dd hh24:mi:ss'''||'),'
||'to_date('||''''||to_char(:NEW.ETIME,'yyyy-mm-dd hh24:mi:ss')||''''||','||'''yyyy-mm-dd hh24:mi:ss'''||'),'
||''''||:NEW.INTERVAL||''''||','
||''''||:NEW.EARGS||''''||','
||'to_date('||''''||to_char(:NEW.ADDDATE,'yyyy-mm-dd hh24:mi:ss')||''''||','||'''yyyy-mm-dd hh24:mi:ss'''||'),'
||''''||:NEW.REMARK||''''||','
||''''||:NEW.FLAG||''''||');'
into val
from dual;
select (select to_char(sysdate, 'yyyyMMddHH24miss') from dual) ||
lpad(DNL_TBXL.nextval, 3, '0')
into id
from dual;
insert into DNL_TBJL
(id, tables,czlx, SQL, TIME, BAK)
values
(id,'AEMTINFO', 'INSET', val, sysdate, id);
dnltb := utl_file.fopen('DNL_TB_DIR', 'INSET-'||'AEMTINFO-'||id || '.sql', 'w');
utl_file.put_line(dnltb, val);
utl_file.put_line(dnltb, 'commit;');
utl_file.put_line(dnltb, 'exit;');
utl_file.fclose(dnltb);
elsif updating then
update AEMTINFO@XQDNJL
set EMTID = :NEW.EMTID,
SID = :NEW.SID,
SNAME = :NEW.SNAME,
STIME = :NEW.STIME,
ETIME = :NEW.ETIME,
INTERVAL = :NEW.INTERVAL,
EARGS = :NEW.EARGS,
ADDDATE = :NEW.ADDDATE,
REMARK = :NEW.REMARK,
FLAG = :NEW.FLAG
where emtid = :OLD.emtid;
select 'update AEMTINFO set '
||'EMTID = '||''''||:NEW.EMTID||''''||','
||'SID = '||''''||:NEW.SID||''''||','
||'SNAME = '||''''||:NEW.SNAME||''''||','
||'STIME = '||'to_date('||''''||to_char(:NEW.STIME,'yyyy-mm-dd hh24:mi:ss')||''''||','||'''yyyy-mm-dd hh24:mi:ss'''||'),'
||'ETIME = '||'to_date('||''''||to_char(:NEW.ETIME,'yyyy-mm-dd hh24:mi:ss')||''''||','||'''yyyy-mm-dd hh24:mi:ss'''||'),'
||'INTERVAL = '||''''||:NEW.INTERVAL||''''||','
||'EARGS = '||''''||:NEW.EARGS||''''||','
||'ADDDATE = '||'to_date('||''''||to_char(:NEW.ADDDATE,'yyyy-mm-dd hh24:mi:ss')||''''||','||'''yyyy-mm-dd hh24:mi:ss'''||'),'
||'REMARK = '||''''||:NEW.REMARK||''''||','
||'FLAG = '||''''||:NEW.FLAG||''''|| 'where emtid = '||:OLD.emtid||';'
into val
from DUAL;
select (select to_char(sysdate, 'yyyyMMddHH24miss') from dual) ||
lpad(DNL_TBXL.nextval, 3, '0')
into id
from dual;
insert into DNL_TBJL
(id, tables,czlx, SQL, TIME, BAK)
values
(id,'AEMTINFO', 'UPDATE', val, sysdate, id);
dnltb := utl_file.fopen('DNL_TB_DIR', 'UPDATE-'||'AEMTINFO-'||id || '.sql', 'w');
utl_file.put_line(dnltb, val);
utl_file.put_line(dnltb, 'commit;');
utl_file.put_line(dnltb, 'exit;');
utl_file.fclose(dnltb);
elsif deleting then
delete from AEMTINFO@XQDNJL where emtid = :OLD.emtid;
tmp := :OLD.emtid;
tmpval := 'delete from AEMTINFO where emtid=';
val := concat(tmpval, tmp || ';');
select (select to_char(sysdate, 'yyyyMMddHH24miss') from dual) ||
lpad(DNL_TBXL.nextval, 3, '0')
into id
from dual;
insert into DNL_TBJL
(id, tables,czlx, SQL, TIME, BAK)
values
(id,'AEMTINFO', 'DELETE', val, sysdate, id);
dnltb := utl_file.fopen('DNL_TB_DIR', 'DELETE-'||'AEMTINFO-'||id || '.sql', 'w');
utl_file.put_line(dnltb, val);
utl_file.put_line(dnltb, 'commit;');
utl_file.put_line(dnltb, 'exit;');
utl_file.fclose(dnltb);
end if;
exception
when integrity_error then
raise_Application_error(errno, errmsg);

end;

4 sql文件入库批处理

通过windows系统自带的计划任务执行下面批处理实现数据入库

1)三区区数据库服务器新建表DNL_SQLJL。

三区数据库中执行下列语句:

-- Create table
create table DNL_SQLJL
(
id VARCHAR2(25),
tables VARCHAR2(25),
czlx VARCHAR2(25),
sqlml VARCHAR2(2000),
sql VARCHAR2(2000),
time DATE,
bak VARCHAR2(128)
)
tablespace MPTMSU
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);
-- Add comments to the columns
comment on column DNL_SQLJL.id
is 'ID';
comment on column DNL_SQLJL.tables
is '同步表名';
comment on column DNL_SQLJL.czlx
is '操作类型';
comment on column DNL_SQLJL.sqlml
is 'SQL文件目录';
comment on column DNL_SQLJL.sql
is 'SQL内容';
comment on column DNL_SQLJL.time
is '操作时间';

2)三区区数据库服务器新建计划任务定期执行DQ3QRK-ZXWJ.bat批处理。

3)DQ3QRK-ZXWJ.bat批处理调用DQ3QRK-ZXSQL.bat来执行入库操作。

DQ3QRK-ZXWJ.bat语句如下:

@echo off
REM
set Log=logDQ3QRKSQL-%date:~0,4%.%date:~5,2%.%date:~8,2%.log
REM
rem 第一步
dir D:mptmsudataDNLTBDIR* /b /a|findstr ".sql>" >D:mptmsudataDNLTBDIRDQ3QRKWJ.TXT
rem
cd /d %~dp0 && for /f "tokens=1-3 delims=-. " %%i in (D:mptmsudataDNLTBDIRDQ3QRKWJ.TXT) do %~dp0DQ3QRK-ZXSQL.bat %%i %%j %%k >>%Log% 2>&1
pause
exit

DQ3QRK-ZXSQL.bat语句如下:

@echo off
REM
REM set Log=logDQ3QRKSQL-%date:~0,4%.%date:~5,2%.%date:~8,2%.log
set RQ=%date:~0,4%%date:~5,2%
set SQLWJ=D:mptmsudataDNLTBDIR%1-%2-%3.sql
set SQLJL=D:mptmsudataDNLTBDIRsqljl.sql
REM
sqlplus -s yptms/yptms@mptmsu @%SQLWJ%
for /f "tokens=1 delims=;" %%i in (%SQLWJ%) do (set tmpsql=%%i
goto aa)
:aa
echo insert into DNL_SQLJL (ID,TABLES,CZLX,SQLML,SQL,TIME) values('%3','%2','%1','D:mptmsudataDNLTBDIR%RQ%%1-%2-%3.sql','%tmpsql%',SYSDATE); >%SQLJL%
echo commit; >>%SQLJL%
echo exit; >>%SQLJL%
sqlplus -s yptms/yptms@mptmsu @D:mptmsudataDNLTBDIRsqljl.sql
del /f /q D:mptmsudataDNLTBDIRsqljl.sql
IF NOT EXIST D:mptmsudataDNLTBDIR%RQ% md D:mptmsudataDNLTBDIR%RQ%
move /Y %SQLWJ% D:mptmsudataDNLTBDIR%RQ%


Tags:Oracle   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
背景:项目中遇到的问题,需要二区两台数据库之间同步一些表,以及导出sql文件同步至三区数据库。1 SQL文件目录新建SQL文件生成的目录D:\mptmsu\data\DNLTBDIR。二区数据库中执行...【详细内容】
2022-01-20  Tags: Oracle  点击:(13)  评论:(0)  加入收藏
本环境CentOS7.4使用的主要软件包: 11.2.0.1版本linux.x64_11gR2_database_1of2.ziplinux.x64_11gR2_database_2of2.ziplinux.x64_11gR2_grid.zip需要额外一个磁盘做完ASM...【详细内容】
2022-01-05  Tags: Oracle  点击:(20)  评论:(0)  加入收藏
mysql自动备份脚本::mysqldump -u root -p密码 test_zc >d:\bak.sql::pause@@echo offset errorlevel=0set path_home_mysql=D:\mysql-8.0.27-winx64\::MySQL安装的BIN目录...【详细内容】
2021-12-30  Tags: Oracle  点击:(21)  评论:(0)  加入收藏
安装环境Linux服务器:Centos 6 64位Oracle服务器:Oracle11gR2 64位 系统要求说明:内存必须高于1G的物理内存;交换空间,一般为内存的2倍(1G的内存可以设置swap 分区为3G大小);硬...【详细内容】
2021-12-27  Tags: Oracle  点击:(35)  评论:(0)  加入收藏
1、 登陆CentOS 2、 查看备份脚本,脚本放在\usr\local目录下 3、 编写数据库备份脚本,内容如下 前提是需要在Oracle创建directory文件,如果没有,可以create创建并授权给相应的用...【详细内容】
2021-12-10  Tags: Oracle  点击:(44)  评论:(0)  加入收藏
之前写了个Oracle12c在Redhat6.8下的静默安装,操作系统版本太老了而且没配插图,今天重新写个centos 7 下静默安装。 准备环境:centos 7 虚拟机一台,Oracle12c安装包。1、检查防...【详细内容】
2021-10-12  Tags: Oracle  点击:(39)  评论:(0)  加入收藏
JDK 17 正式发布+免费牛逼啊,JDK 16 刚发布半年(2021/03/16),JDK 17 又如期而至(2021/09/14),这个时间点牛逼啊,蹭苹果发布会的热度?记得当年 JDK 15 的发布也是同天,巧了。。虽然 iPho...【详细内容】
2021-09-16  Tags: Oracle  点击:(99)  评论:(0)  加入收藏
2021年免费vps服务器申请,oracle永久免费使用。Oracle 云免费套餐只需注册 Oracle 云帐户即可获取,不仅包含丰富的 Always Free 云服务,还提供 300 美元的免费试用储值,让您可以...【详细内容】
2021-09-08  Tags: Oracle  点击:(121)  评论:(0)  加入收藏
Oracle日志文件是Oracle数据库存储信息的重要文件,主要用来存储数据库变化的操作信息。Oracle日志文件可以分为两种:重做日志文件(redo log file)、归档日志文件,其中重做日志文...【详细内容】
2021-08-19  Tags: Oracle  点击:(112)  评论:(0)  加入收藏
本例子在真实环境应用过,获得了很好的体验,特将其分享出来供各位朋友使用。后续我会持续把相关的知识一点一点的更新,请各位多多关注,多多支持。测试速度:导出速度大概800M/s,如...【详细内容】
2021-08-17  Tags: Oracle  点击:(102)  评论:(0)  加入收藏
▌简易百科推荐
背景:项目中遇到的问题,需要二区两台数据库之间同步一些表,以及导出sql文件同步至三区数据库。1 SQL文件目录新建SQL文件生成的目录D:\mptmsu\data\DNLTBDIR。二区数据库中执行...【详细内容】
2022-01-20  你还想怎么样啊    Tags:Oracle   点击:(13)  评论:(0)  加入收藏
本环境CentOS7.4使用的主要软件包: 11.2.0.1版本linux.x64_11gR2_database_1of2.ziplinux.x64_11gR2_database_2of2.ziplinux.x64_11gR2_grid.zip需要额外一个磁盘做完ASM...【详细内容】
2022-01-05  乐维IT君    Tags:Oracle   点击:(20)  评论:(0)  加入收藏
安装环境Linux服务器:Centos 6 64位Oracle服务器:Oracle11gR2 64位 系统要求说明:内存必须高于1G的物理内存;交换空间,一般为内存的2倍(1G的内存可以设置swap 分区为3G大小);硬...【详细内容】
2021-12-27  守护梦想2022    Tags:Oracle   点击:(35)  评论:(0)  加入收藏
1、 登陆CentOS 2、 查看备份脚本,脚本放在\usr\local目录下 3、 编写数据库备份脚本,内容如下 前提是需要在Oracle创建directory文件,如果没有,可以create创建并授权给相应的用...【详细内容】
2021-12-10  JasonTang    Tags:Oracle   点击:(44)  评论:(0)  加入收藏
之前写了个Oracle12c在Redhat6.8下的静默安装,操作系统版本太老了而且没配插图,今天重新写个centos 7 下静默安装。 准备环境:centos 7 虚拟机一台,Oracle12c安装包。1、检查防...【详细内容】
2021-10-12  it运维小土豆  今日头条  Tags:Oracle   点击:(39)  评论:(0)  加入收藏
JDK 17 正式发布+免费牛逼啊,JDK 16 刚发布半年(2021/03/16),JDK 17 又如期而至(2021/09/14),这个时间点牛逼啊,蹭苹果发布会的热度?记得当年 JDK 15 的发布也是同天,巧了。。虽然 iPho...【详细内容】
2021-09-16  Java技术栈  掘金  Tags:Oracle   点击:(99)  评论:(0)  加入收藏
Oracle日志文件是Oracle数据库存储信息的重要文件,主要用来存储数据库变化的操作信息。Oracle日志文件可以分为两种:重做日志文件(redo log file)、归档日志文件,其中重做日志文...【详细内容】
2021-08-19  free教程    Tags:Oracle日志   点击:(112)  评论:(0)  加入收藏
本例子在真实环境应用过,获得了很好的体验,特将其分享出来供各位朋友使用。后续我会持续把相关的知识一点一点的更新,请各位多多关注,多多支持。测试速度:导出速度大概800M/s,如...【详细内容】
2021-08-17  大树唛包    Tags:oracle   点击:(102)  评论:(0)  加入收藏
天冒险重启下Oracle rac,分三个步骤,停实例---停集群---重启服务器。 1、关闭实例检查状态su - gridcrsctl status res -t 注意:只在一个节点执行就行,或者为了保险期间,使用shut...【详细内容】
2021-07-16  死磕IT    Tags:Oracle rac   点击:(136)  评论:(0)  加入收藏
两个字符串相似度的比较:SYS.UTL_MATCH.edit_distance_similarity用法:select SYS.UTL_MATCH.edit_distance_similarity('河北沧州东塑股份有限公司','河北沧州东...【详细内容】
2021-07-07  Onceagain75783189    Tags:比较函数   点击:(126)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条