DBLINKoracle数据交换资料.doc_第1页
DBLINKoracle数据交换资料.doc_第2页
DBLINKoracle数据交换资料.doc_第3页
DBLINKoracle数据交换资料.doc_第4页
DBLINKoracle数据交换资料.doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

我们通过DBlink创建Oracle存储过程和任务*/ /*1. -创建一个存储过程 2. createprocedureproc_sjtb 3. as4. begin5. 6. deletefromswdx_gzryxxwhereis_tb=1; 7. insertintoswdx_gzryxx(gzrybh,mc,jgdm,phone,is_tb)selectdistinct(t.zgswry_dm),t.zgswry_mc,t.nsr_swjg_dm,t.tel_zgy,1fromdxpt_sjtbmydblinkt; 8. 9. deletefromgdzc_jgwhereis_tb=1; 10. insertintogdzc_jg(jg_dm,jg_mc,is_tb)selectdistinct(t.nsr_swjg_dm),t.nsr_swjg_mc,1fromdxpt_sjtbmydblinkt; 11. 12. deletefromswdx_nsrxxwhereis_tb=1; 13. insertintoswdx_nsrxx(nsrsbh,nsrmc,jgdm,zgydm,is_tb)selectt.nsrsbh,t.nsrmc,t.nsr_swjg_dm,t.zgswry_dm,1fromdxpt_sjtbmydblinkt; 14. 15. insertintoswdx_nsrphone(nsrsbh,lbbh,tel)selectt.nsrsbh,001,t.TEL_NSR_CWfromdxpt_sjtbmydblinkt; 16. insertintoswdx_nsrphone(nsrsbh,lbbh,tel)selectt.nsrsbh,002,t.TEL_NSR_FRfromdxpt_sjtbmydblinkt; 17. insertintoswdx_nsrphone(nsrsbh,lbbh,tel)selectt.nsrsbh,003,t.TEL_NSR_QTfromdxpt_sjtbmydblinkt; 18. 19. deletefromxt_czywhereis_tb=1; 20. insertintoxt_czy(czy_id,czy_mc,jg_code,czy_lxdh,is_zgy,is_tb,is_jgczy,CZY_YXBZ)selectdistinct(t.zgswry_dm),t.zgswry_mc,t.nsr_swjg_dm,t.tel_zgy,1,1,0,Yfromdxpt_sjtbmydblinkt; 21. insertintoxt_czy(czy_id,czy_mc,jg_code,is_zgy,is_tb,is_jgczy,CZY_YXBZ)selectdistinct(t.nsr_swjg_dm),t.nsr_swjg_mc,t.nsr_swjg_dm,0,1,1,Yfromdxpt_sjtbmydblinkt; 22. 23. end; 24. 25. 26. 27. -创建任务(每分钟执行一次) 28. DECLAREXNUMBER; 29. BEGIN30. SYS.DBMS_JOB.SUBMIT 31. ( 32. job=X 33. ,what=proc_sjtb;34. ,next_date=to_date(09-12-200800:00:00,dd/mm/yyyyhh24:mi:ss) 35. ,interval=TRUNC(sysdate)+1+2/(24)36. ); 37. END; 38. 39. 40. -执行任务 41. -RUN(参数)是我们建立任务的时候自动生成的,指定任务号方可启动任务和删除任务 42. 43. begin44. SYS.DBMS_JOB.RUN(25); 45. end; 46. 47. -删除任务 48. begin49. sys.DBMS_JOB.REMOVE(23); 50. end;转oracle数据库同步技术 oracle数据库同步技术 高级复制什么是复制?简单地说复制就是在由两个或者多个数据库系统构成的一个分布式数据库环境中拷贝数据的过程。 高级复制,是在组成分布式数据库系统的多个数据库中复制和维护数据库对象的过程。 Oracle 高级复制允许应用程序更新数据库的任何副本,并将这些更改自动传递到其他数据库,同时确保全局事务处理的一致性和数据完整性。 同步复制,复制数据在任何时间在任何复制节点均保持一致。如果复制环境中的任何一个节点的复制数据发生了更新操作,这种变化会立刻反映到其他所有的复制节点。这种技术适用于那些对于实时性要求较高的商业应用中。 异步复制,所有复制节点的数据在一定时间内是不同步的。如果复制环境中的其中的一个节点的复制数据发生了更新操作,这种改变将在不同的事务中被传播和应用到其他所有复制节点。这些不同的事务间可以间隔几秒,几分种,几小时,也可以是几天之后。复制节点之间的数据临时是不同步的,但传播最终将保证所有复制节点间的数据一致。 一、实现数据库复制的前提条件1、数据库支持高级复制功能您可以用system身份登录数据库,查看v$option视图,如果其中Advanced replication为TRUE,则支持高级复制功能;否则不支持。2、数据库初始化参数要求、db_domain = 指明数据库的域名(默认的是WORLD),这里可以用您公司的域名。、global_names = true它要求数据库链接(database link)和被连接的数据库名称一致。现在全局数据库名:db_name+”.”+db_domain、有跟数据库job执行有关的参数job_queue_processes = 1job_queue_interval = 60distributed_transactions = 10open_links = 4第一行定义SNP进程的启动个数为n。系统缺省值为0,正常定义范围为036,根据任务的多少,可以配置不同的数值。第二行定义系统每隔N秒唤醒该进程一次。系统缺省值为60秒,正常范围为13600秒。事实上,该进程执行完当前任务后,就进入睡眠状态,睡眠一段时间后,由系统的总控负责将其唤醒。如果修改了以上这几个参数,需要重新启动数据库以使参数生效。二、实现数据库同步复制的步骤假设在Internet上我们有两个数据库:一个叫深圳(shenzhen),一个叫北京(beijing)。具体配置见下表:数据库名 shenzhen beijing数据库域名 数据库sid号 shenzhen beijingListener端口号 1521 1521服务器ip地址 00 001、确认两台数据库之间可以互相访问,在tnsnames.ora里设置数据库连接字符串。、例如:深圳这边的数据库连接字符串是以下的格式beijing =(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 00)(PORT = 1521)(CONNECT_DATA =(SERVICE_NAME = beijing)运行$tnsping beijing出现以下提示符:Attempting to contact (ADDRESS=(PROTOCOL=TCP)(HOST=00)(PORT=1521)OK(n毫秒)表明深圳数据库可以访问北京数据库。、在北京那边也同样配置,确认$tnsping shenzhen 是通的。2、改数据库全局名称,建公共的数据库链接。、用system身份登录shenzhen数据库SQLalter database rename global_name to ;用system身份登录beijing数据库:SQLalter database rename global_name to ;、用system身份登录shenzhen数据库SQLcreate public database link using beijing;测试数据库全局名称和公共的数据库链接SQLselect * from global_;返回结果为就对了。用system身份登录beijing数据库:SQLcreate public database link using shenzhen;测试数据库全局名称和公共的数据库链接SQLselect * from global_;返回结果为就对了。3、建立管理数据库复制的用户repadmin,并赋权。、用system身份登录shenzhen数据库SQLcreate user repadmin identified by repadmin default tablespace users temporary tablespace temp;SQLexecute dbms_defer_sys.register_propagator(repadmin);SQLgrant execute any procedure to repadmin;SQLexecute dbms_repcat_admin.grant_admin_any_repgroup(repadmin);SQLgrant comment any table to repadmin;SQLgrant lock any table to repadmin;、同样用system身份登录beijing数据库,运行以上的命令,管理数据库复制的用户repadmin,并赋权。说明:repadmin用户名和密码可以根据用户的需求自由命名。4、在数据库复制的用户repadmin下创建私有的数据库链接。、用repadmin身份登录shenzhen数据库SQLcreate database link connect to repadmin identified by repadmin;测试这个私有的数据库链接:SQLselect * from global_;返回结果为就对了。、用repadmin身份登录beijing数据库SQLcreate database link connect to repadmin identified by repadmin;测试这个私有的数据库链接SQLselect * from global_;返回结果为就对了。5、创建或选择实现数据库复制的用户和对象,给用户赋权,数据库对象必须有主关键字。假设我们用ORACLE里举例用的scott用户,dept表。、用internal身份登录shenzhen数据库,创建scott用户并赋权SQLcreate user scott identified by tiger default tablespace users temporary tablespace temp;SQLgrant connect, resource to scott;SQLgrant execute on sys.dbms_defer to scott;、用scott身份登录shenzhen数据库,创建表deptSQLcreate table dept(deptno number(2) primary key,dname varchar2(14),loc varchar2(13) );、如果数据库对象没有主关键字,可以运行以下SQL命令添加:SQLalter table dept add (constraint dept_deptno_pk primary key (deptno);、在shenzhen数据库scott用户下创建主关键字的序列号,范围避免和beijing的冲突。SQL create sequence dept_no increment by 1 start with 1 maxvalue 44 cycle nocache;(说明:maxvalue 44可以根据应用程序及表结构主关键字定义的位数需要而定)、在shenzhen数据库scott用户下插入初始化数据SQLinsert into dept values (dept_no.nextval,accounting,new york);SQLinsert into dept values (dept_no.nextval,research,dallas);SQLcommit;、在beijing数据库那边同样运行以上,、在beijing数据库scott用户下创建主关键字的序列号,范围避免和shenzhen的冲突。SQL create sequence dept_no increment by 1 start with 45 maxvalue 99 cycle nocache;、在beijing数据库scott用户下插入初始化数据SQLinsert into dept values (dept_no.nextval,sales,chicago);SQLinsert into dept values (dept_no.nextval,operations,boston);SQLcommit;6、创建要复制的组scott_mg,加入数据库对象,产生对象的复制支持、用repadmin身份登录shenzhen数据库,创建主复制组scott_mgSQL execute dbms_repcat.create_master_repgroup(scott_mg);说明:scott_mg组名可以根据用户的需求自由命名。、在复制组scott_mg里加入数据库对象SQLexecute dbms_repcat.create_master_repobject(sname=scott,oname=dept, type=table,use_existing_object=true,gname=scott_mg);参数说明:sname 实现数据库复制的用户名称oname 实现数据库复制的数据库对象名称(表名长度在27个字节内,程序包名长度在24个字节内)type 实现数据库复制的数据库对象类别(支持的类别:表,索引,同义词,触发器,视图,过程,函数,程序包,程序包体)use_existing_object true表示用主复制节点已经存在的数据库对象gname 主复制组名、对数据库对象产生复制支持SQLexecute dbms_repcat.generate_replication_support(scott,dept,table);(说明:产生支持scott用户下dept表复制的数据库触发器和程序包)、确认复制的组和对象已经加入数据库的数据字典SQLselect gname, master, status from dba_repgroup;SQLselect * from dba_repobject;7、创建主复制节点、用repadmin身份登录shenzhen数据库,创建主复制节点SQLexecute dbms_repcat.add_master_database(gname=scott_mg,master=,use_existing_objects=true, copy_rows=false, propagation_mode = asynchronous);参数说明:gname 主复制组名master 加入主复制节点的另一个数据库use_existing_object true表示用主复制节点已经存在的数据库对象copy_rows false表示第一次开始复制时不用和主复制节点保持一致propagation_mode 异步地执行、确认复制的任务队列已经加入数据库的数据字典SQLselect * from user_jobs;8、使同步组的状态由停顿(quiesced )改为正常(normal)、用repadmin身份登录shenzhen数据库,运行以下命令SQL execute dbms_repcat.resume_master_activity(scott_mg,false);、确认同步组的状态为正常(normal)SQL select gname, master, status from dba_repgroup;、如果这个命令不能使同步组的状态为正常(normal),可能有一些停顿的复制,运行以下命令再试试(建议在紧急的时候才用):SQL execute dbms_repcat.resume_master_activity(scott_mg,true);9、创建复制数据库的时间表,我们假设用固定的时间表:10分钟复制一次。、用repadmin身份登录shenzhen数据库,运行以下命令SQLbegindbms_defer_sys.schedule_push (destination = ,interval = sysdate + 10/1440,next_date = sysdate);end;/SQLbegindbms_defer_sys.schedule_purge (next_date = sysdate,interval = sysdate + 10/1440,delay_seconds = 0,rollback_segment = );end;/、用repadmin身份登录beijing数据库,运行以下命令SQLbegindbms_defer_sys.schedule_push (destination = ,interval = sysdate + 10 / 1440,next_date = sysdate);end;/SQLbegindbms_defer_sys.schedule_purge (next_date = sysdate,interval = sysdate + 10/1440,delay_seconds = 0,rollback_segment = );end;/10、添加或修改两边数据库的记录,跟踪复制过程如果你想立刻看到添加或修改后数据库的记录的变化,可以在两边repadmin用户下找到push的job_number,然后运行:SQLexec dbms_job.run(job_number);三、异常情况的处理1、检查复制工作正常否,可以在repadmin 用户下查询user_jobsSQLselect job,this_date,next_date,what, broken from user_jobs;正常的状态有两种:任务闲this_date为空,next_date为当前时间后的一个时间值任务忙this_date不为空,next_date为当前时间后的一个时间值异常状态也有两种:任务死锁next_date为当前时间前的一个时间值任务死锁next_date为非常大的一个时间值,例如:4001-01-01这可能因为网络中断照成的死锁解除死锁的办法:$ps ef|grep orale找到死锁的刷新快照的进程号ora_snp*,用kill 9 命令删除此进程然后进入repadmin 用户SQL操作符下,运行命令:SQLexec dbms_job.run(job_number);说明:job_number 为用select job,this_date,next_date,what from user_jobs;命令查出的job编号。2、增加或减少复制组的复制对象、停止主数据库节点的复制动作,使同步组的状态由正常(normal)改为停顿(quiesced )用repadmin身份登录shenzhen数据库,运行以下命令SQLexecute dbms_repcat.suspend_master_activity (gname = scott_mg);、在复制组scott_mg里加入数据库对象,保证数据库对象必须有主关键字。SQLexecute dbms_repcat.create_master_repobject(sname=scott,oname=emp, type=table,use_existing_object=true,gname=scott_mg);对加入的数据库对象产生复制支持SQLexecute dbms_repcat.generate_replication_support(scott,emp,table);、在复制组scott_mg里删除数据库对象。SQLexecute dbms_repcat.drop_master_repobject (scott,dept,table);、重新使同步组的状态由停顿(quiesced )改为正常(normal)。SQL execute dbms_repcat.resume_master_activity(scott_mg,false); 2009-08-07 13:17本实例已完全通过测试,单向,双向同步都可使用.-名词说明:源被同步的数据库 目的要同步到的数据库前6步必须执行,第6以后是一些辅助信息.-1、在目的数据库上,创建dblinkdrop public database link dblink_orc92_182;Create public DATABASE LINK dblink_orc92_182 CONNECT TO bst114 IDENTIFIED BY password USING orc92_11;-dblink_orc92_182 是dblink_name-bst114 是 username-password 是 password-orc92_11 是远程数据库名-2、在源和目的数据库上创建要同步的表(最好有主键约束,快照才可以快速刷新)drop table test_user;create table test_user(id number(10) primary key,name varchar2(12),age number(3);-3、在目的数据库上,测试dblinkselect * from test_userdblink_orc92_182; /查询的是源数据库的表select * from test_user;-4、在源数据库上,创建要同步表的快照日志Create snapshot log on test_user;(F5)-5、创建快照,在目的数据库上创建快照Create snapshot sn_test_user as select * from test_userdblink_orc92_182;-6、设置快照刷新时间(只能选择一种刷新方式,推荐使用快速刷新,这样才可以用触发器双向同步)快速刷新Alter snapshot sn_test_user refresh fast Start with sysdate next sysdate with primary key;-oracle马上自动快速刷新,以后不停的刷新,只能在测试时使用.真实项目要正确权衡刷新时间.完全刷新Alter snapshot sn_test_user refresh complete Start with sysdate+30/24*60*60 next sysdate+30/24*60*60;-oracle自动在30秒后进行第一次完全刷新,以后每隔30秒完全刷新一次-7、手动刷新快照,在没有自动刷新的情况下,可以手动刷新快照.手动刷新方式1begindbms_refresh.refresh(sn_test_user);end;手动刷新方式2EXEC DBMS_SNAPSHOT.REFRESH(sn_test_user,F); /第一个参数是快照名,第二个参数 F 是快速刷新 C 是完全刷新.-8.修改会话时间格式ALTER SESSION SET NLS_DATE_FORMAT = YYYY-MM-DD HH24:MI:SS;-9.查看快照最后一次刷新时间SELECT NAME,LAST_REFRESH FROM ALL_SNAPSHOT_REFRESH_TIMES;-10.查看快照下次执行时间select last_date,next_date,what from user_jobs order by next_date;-11.打印调试信息dbms_output.put_line(use |plsql);-12.如果你只想单向同步,那么在目的数据库创建以下触发器(当源数据库表改变时,目的数据库表跟着改变,但目的数据库表改变时,源数据库表不改变).create or replace trigger TRI_test_user_AFRafter insert or update or delete on sn_test_userfor each rowbeginif deleting then delete from test_user where id=:old.id;end if;if inserting then insert into test_user(id,name) values(:new.id,:);end if;if updating then update test_user set name=: where id=:old.id;end if;end TRI_test_user_AFR;-13.如果你想双向同步,请在源数据库中执行前6步,并在双方都创建以下触发器(当源数据库表改变时,目的数据库表跟着改变,目的数据库表改变时,源数据库表也改变)CREATE OR REPLACE TRIGGER BST114.TRI_TEST_USER_AFRAFTER DELETE OR INSERT OR UPDATEON BST114.SN_TEST_USER REFERENCING NEW AS NEW OLD AS OLDFOR EACH ROWdeclare tmp_id number(10):=-1;begindbms_output.put_line(begin);if inserting then -select id into tmp_id from test_user where id=:new.id; for p in(select id from test_user where id=:new.id) loop tmp_id:=p.id; end loop; dbms_output.put_line(tmp_id|=-); if (tmp_id=-1) then insert into test_user(id,name,age) values(:new.id,:,:new.age); end if;end if;if updating then dbms_output.put_line(updated); for p in(select name,age from test_user where id=:old.id) loop if (!=:) or (p.age!=:new.age) then update test_user set name=:,age=:new.age where id=:old.id; end if; end loop;end if;if deleting then dbms_output.put_line(deleted); delete from test_user where id=:old.id;end if;dbms_output.put_line(end);end TRI_test_user_AFR;-为防止双向同步触发器死循环,所以要在触发器中增加一些判断,阻止死循环.-以上同步原理1.首先创建一个dblink,可以访问远程数据库2.在本地创建一个快照,映射远程数据表,当远程数据表有变化时,会反应到快照中.3.由于快照类似于视图表,所以在本地为快照创建一个触发器,当快照有变化时,会触发相应事件.4.在触发器中写同步数据的代码.-附:快照刷新时间参数说明一天的秒数=24小时*60分钟*60钞所以要想在30秒后刷新,参数应该这样写 sysdate+30/(24*60*60)1分钟=sysdate+60/(24*60*60)一天的分钟数=24小时*60分钟一分钟也可以这样写 sysdate+1/(24*60)30分钟=sysdate+30/(24*60)60分钟=sysdate+60/(24*60)以此类推1小时=sysdate+1/24=sysdate+60/(24*60)1天=sysdate+1一个月=sysdate+30分享到搜狐微博关于创建oracle dblink 过程的几点心得吧 2009-08-07 13:06 俩台不同的数据库服务器,从一台数据库服务器的一个用户读取另一台数据库服务器下的某个用户的数据,这个时候可以使用dblink。 其实dblink和数据库中的view差不多,建dblink的时候需要知道待读取数据库的ip地址,ssid以及数据库用户名和密码。 创建可以采用两种方式: 1、已经配置本地服务 create public database link fwq12 connect to fzeptidentified by neu using fjept CREATE DATABASE LINK数据库链接名CONNECT TO 用户名 IDENTIFIED BY 密码 USING 本地配置的数据的实例名; 2、未配置本地服务 host数据库的ip地址,service_name数据库的ssid。 其实两种方法配置dblink是差不多的,我个人感觉还是第二种方法比较好,这样不受本地服务的影响。 数据库连接字符串可以用NET8 EASY CONFIG或者直接修改TNSNAMES.ORA里定义. 数据库参数global_name=true时要求数据库链接名称跟远端数据库名称一样 数据库全局名称可以用以下命令查出 SELECT * FROM GLOBAL_NAME; 查询远端数据库里的表 SELECT FROM 表名数据库链接名; 查询、删除和插入数据和操作本地的数据库是一样的,只不过表名需要写成“表名dblink服务器”而已。 附带说下同义词创建: CREATE SYNONYM同义词名FOR 表名; CREATE SYNONYM同义词名FOR 表名数据库链接名; 删除dblink:DROP PUBLIC DATABASE LINK linkfwq。 如果创建全局dblink,必须使用systm或sys用户,在database前加public。物理上存放于网络的多个ORACLE数据库,逻辑上可以看成一个单一的大型数据库,用户可以通过网络对异地数据库中的数据进行存取,而服务器之间的协同处理对于工作站用户及应用程序而言是完全透明的,开发人员无需关心网络的链接细节、数据在网络节点中的具体分布情况和服务器间的协调工作过程。 数据库之间的链接建立在DATABASE LINK上。要创建一个DATABASE LINK,必须首先在建立链接的数据库上设置链接字符串,即配置一个远程数据库的本地网络服务名。 链接字符串的配置参见客户端连接服务器一节。 数据库全局名称可以用以下命令查出:SELECT * FROM GLOBAL_NAME;修改可以用以下语句来修改参数值:ALTER SYSTEM SET GLOBAL_NAME=TRUE/FALSE;、当数据库参数global_name=false时,就不要求数据库链接名称跟远端数据库名称一样。oracle数据库之间进行连接通讯。创建数据库链接的语法如下: CREATE PUBLIC DATABASE LINK link CONNECT TO username IDENTIFIED BY password USING connectstring 其中:-demona为用net8 easy config创建的连接字符串目的方数据库的init.ora文件中的global_names设为false重新启动数据库设置才能生效或者用sys用户执行注意:创建数据库链接的帐号必须有CREATE DAT

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论