设为首页 收藏本站
查看: 793|回复: 0

[经验分享] Oracle 高级数据复制(Advanced Replication)

[复制链接]

尚未签到

发表于 2016-7-28 09:34:08 | 显示全部楼层 |阅读模式
oracle 高级复制 配置步骤
  测试环境 linux as 4 + oracle 10.2.0.3
  master : sfgame
replication_server: rep
   
检查安装好的数据库是否支持高级复制:

SQL> select value from v$option where parameter='Advanced replication';

VALUE

----------------------------------------------------------------

TRUE

  确保返回的结果是TRUE,如果是FALSE 则表示需要重新安装oracle 的高级复制部件。
  
1,首先设置初始化参数
SQL> show parameter 。。查询下面参数的傎

SQL> alter system set 。。修改参数的值
--at sfgame
db_domain=sfgame.com
global_names=true
job_queue_processes=10 #
缺省值
open_links=4 # 缺省值
--at rep
db_domain=rep.com
global_names=true
job_queue_processes=10 #
缺省值
open_links=4 # 缺省值
2,配置tns使其能够相互访问
3,用system登录数据库
--at sfgame
alter database rename global_name to sfgame.com
--at rep
alter database rename global_name to to rep.com

  --at sfgame
create public database link rep.com 

connect   to   system  identified   by   admini  

USING '(DESCRIPTION = (ADDRESS_LIST =

(ADDRESS= (PROTOCOL = TCP)(Host = 118.102.16.143 )(Port = 1521)))(CONNECT_DATA =(SID = zhuzhu)(SERVER = DEDICATED)))';
--
创建一个公用的数据库链接
select * from global_name@rep.com; --验证是否正确

  --at rep
create public database link sfgame.com using 'sfgame';
select * from global_name@sfgame.com;
  4,用system登录,创建管理复制的用户repadmin
--both site
create user repadmin identified by repadmin default tablespace users temporary

tablespace temp;

execute dbms_defer_sys.register_propagator('repadmin');

grant execute any procedure to repadmin;

execute dbms_repcat_admin.grant_admin_any_repgroup('repadmin');

execute dbms_repcat_admin.grant_admin_any_schema(username => '"REPADMIN"');

grant comment any table to repadmin;

grant lock any table to repadmin;

  grant select any dictionary to repadmin;
  
5,用repadmin登录,在两个站点创建数据库的私有链接
--at sfgame
conn repadmin/repadmin123
create database link rep.com connect to repadmin identified by repadmin123;
select * from global_name@rep.com; -- 验证数据库连接
  --at rep
conn repadmin/repadmin123
create database link sfgame.com connect to repadmin identified by repadmin123;
select * from global_name@sfgame.com; -- 验证数据库连接
  6,目前我们的数据库中有相应的用户和表,所以就不用建立测试用户了,目前我们的数据库中的用户叫sfuser
  --at sfgame
grant connect, resource to sfuser;
grant execute on sys.dbms_defer to sfuser;
create table tablename .... ----在两边的数据库都建立相同的表
--at rep
grant connect, resource to sfuser; ****注意必须有相同的表
grant execute on sys.dbms_defer to sfuser;
create table tablename ... ----在两边的数据库都建立相同的表
  
--注意如果数据库中有序列存在则要把序列分开存放
  
7,建立要复制的组,加入数据库对象,并产生数据库对象支持
  --at sfgame
conn repadmin/repadmin123 --以repadmin身份登录
-----创建复制组 sfuser_mg (最好规范一下:username_mg,这个意思就是这个复制组都是sfuser用户的对象)
execute dbms_repcat.create_master_repgroup('sfuser_mg');
  -----在复制组sfuser_mg中加入复制对象
execute dbms_repcat.create_master_repobject(sname=>'sfuser',oname=>'city', type=>'table',use_existing_object=>true,gname=>'sfuser_mg');
*******sname: 要复制的用户名称, oname:要复制的对象名称 , type:要复制的对象类型, use_existing_object 复制已经存在的数据库对象,gname:表示要加入到哪个复
  制组中去
  --对复制对象产生复制支持
execute dbms_repcat.generate_replication_support('sfuser','city','table');
  
--确认组和对象已经加入到数据库中
  select gname, master, status from dba_repgroup;
  select * from dba_repobject;
  8,创建主复制节点
  execute dbms_repcat.add_master_database (gname=>'sfuser_mg',master=>'rep.com',use_existing_objects=>true, copy_rows=>false, propagation_mode =>
  'asynchronous');
  ***gname: 主复制组的名字
***master:加入主复制节点的另一个数据库
***use_existing_object true: 表示用主复制节点已经存在的数据库对象;
***copy_rows false:表示第一次开始复制时不用和主复制节点保持一致;
***propagation_mode 异步地执行;
--确认已经加入到复制队列中
select * from user_jobs;
  9,使同步组的状态由停顿(quiesced )改为正常(normal)
execute dbms_repcat.resume_master_activity('sfuser_mg',true);
  10,创建数据库的时间表 1分钟一次
  ----at sfgame
conn repadmin/repadmin123 -以repadmin的身份登录数据库
  ------推的时间
begin
   dbms_defer_sys.schedule_push (destination=>'rep.com', interval=>'sysdate + 1/1440', next_date=>sysdate);
   end;
   /   
-----清除队列中的顺序的时间
begin
   dbms_defer_sys.schedule_purge (next_date => sysdate, interval => 'sysdate + 1/1440',delay_seconds => 0, rollback_segment => '');
   end;
  
--at rep ******************如果复制是双向的那么就进行如下步骤
  
conn repadmin/repadmin123 -以repadmin的身份登录数据库
  ------推的时间
begin
   dbms_defer_sys.schedule_push (destination=>'sfgame.com', interval=>'sysdate + 1/1440', next_date=>sysdate);
   end;
   /   
-----清除队列中的顺序的时间
begin
   dbms_defer_sys.schedule_purge (next_date => sysdate, interval => 'sysdate + 1/1440',delay_seconds => 0, rollback_segment => '');
   end;
  
11,如果你想立刻看到添加或修改后数据库的记录的变化,可以在两边 repadmin 用户下找到 push 的 job_number,然后运行:
exec dbms_job.run(job_number);
  
##################异常处理##################################################################################
  1. 检查复制工作正常否,可以在 repadmin 用户下查询user_jobs
select 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 用户运行命令:
exec dbms_job.run(job_number);
  说明:job_number 为用 select job,this_date,next_date,what from user_jobs; 命令查出的job编号。
  2,增加或是减少复制组的对象
  1,停止主数据库节点的复制操作,使同步组的状态由正常(normal)改为停顿(quiesced )
conn repadmin/repadmin123 以repadmin身份登录数据库
  execute dbms_repcat.suspend_master_activity (gname => 'sfuser_mg');
  
2,在复制组中加入数据库对象
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPOBJECT(
gname => '"SFUSER_MG"',
type => 'TABLE',
oname => '"CITY2"',
sname => '"SFUSER"',
copy_rows => TRUE,
use_existing_object => TRUE);
END;
/
  
3,产生复制支持
execute dbms_repcat.generate_replication_support('sfuser','city2','table');
  4, 执行ddl语句时需要注意不要直接在sqlplus中执行,要通过如下语句进行
  BEGIN
DBMS_REPCAT.ALTER_MASTER_REPOBJECT(
sname => '"SFUSER"',
oname => '"CITY"',
type => 'TABLE',
ddl_text => 'ALTER TABLE SFUSER.CITY
MODIFY(ID NUMBER(10))');
END;
/
  
5,重新使同步组的状态由停顿(quiesced )改为正常(normal)。
execute dbms_repcat.resume_master_activity('scott_mg',false); --这一步可能会报错让你重新生成复制支持,你只要重新生成复制支持就ok了

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-250484-1-1.html 上篇帖子: ORACLE数据库命名编码规范 下篇帖子: oracle sql语句命中率考究
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表