Oracle数据库同步复制要点.docx
- 文档编号:3850152
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:23
- 大小:22.99KB
Oracle数据库同步复制要点.docx
《Oracle数据库同步复制要点.docx》由会员分享,可在线阅读,更多相关《Oracle数据库同步复制要点.docx(23页珍藏版)》请在冰点文库上搜索。
Oracle数据库同步复制要点
在Oracle中实现数据库的复制
在Internet上运作数据库经常会有这样的需求:
把遍布全国各城市相似的数据库应用统一起来,一个节点的数据改变不仅体现在本地,还反映到远端。
复制技术给用户提供了一种快速访问共享数据的办法。
大致流程:
设置参数->创建复制管理员用户->给复制管理员授权->注册传播者->注册接收者->在主体站点定时清除->创建dblink->创建定时任务PUSH延迟事务->创建复制组->增加主体对象->增加主体站点->产生复制支持->状态检查->启动复制
1、实现数据库复制的前提条件
1.1数据库支持高级复制功能
您可以用system身份登录数据库,查看v$option视图,如果其中Advancedreplication为ture,则支持高级复制功能;否则不支持。
select*fromv$optionwhereparameter='Advancedreplication';
1.2数据库初始化参数要求
1.2.1设置global_names=true
altersystemsetglobal_names=true;
1.2.2设置job_queue_processes=10(可根据实际情况设置参数大小)
altersystemsetjob_queue_processes=10;
1.2.3指明数据库的域名,这里可以用您公司的域名。
如:
select*fromglobal_name;域名查询。
alterdatabaserenameglobal_nameto;修改域名。
1.2.4当global_name参数设置为true时,它要求数据库链接(databaselink)和被连接的数据库域名一致。
如:
2、实现数据库同步复制的步骤
假设在Internet上我们有三个数据库:
一个叫浙江(zhejiang)主数据库,一个叫宁波(ningbo)复制数据库,湖州(huzhou)复制数据库。
具体配置见下表:
数据库名zhejiang、ningbo、huzhou
数据库域名、、
数据库sid号zhejiang、ningbo、huzhou
Listener端口号1521、1521、1521
服务器ip地址168.160.0.46、168.160.0.47、168.160.0.48
2.1确认两台数据库之间可以互相访问,在tnsnames.ora里设置数据库连接字符串。
例如:
浙江这边的数据库连接字符串是以下的格式
zhejiang=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=168.160.0.46)(PORT=1521))
)
(CONNECT_DATA=
(SERVICE_NAME=orcl)
)
)
2.2用system身份登录zhejiang、ningbo、huzhou数据库,建立管理数据库复制的用户repadmin并赋权。
在zhejiang、ningbo、huzhou数据库分别执行Sql命令如:
createuserrepadminidentifiedbyrepadmindefaulttablespaceuserstemporarytablespacetemp;
executedbms_defer_sys.register_propagator('repadmin');
grantexecuteanyproceduretorepadmin;
executedbms_repcat_admin.grant_admin_any_repgroup('repadmin');
executedbms_repcat_admin.grant_admin_any_schema(username=>'REPADMIN');
grantcommentanytabletorepadmin;
grantlockanytabletorepadmin;
grantselectanydictionarytorepadmin;
2.1.1注册传播者(propagator)
传播者(propagator)负责把延迟事务传播到其他站点。
execDBMS_DEFER_SYS.REGISTER_PROPAGATOR(username=>'repadmin');
2.1.2注册接收者(receiver)
接收者负责接收其他站点传播者发送来的延迟事务.
BEGIN
DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP(
username=>'repadmin',privilege_type=>'receiver',list_of_gnames=>NULL);
END;
2.3建立数据库连接
2.3.1用system身份登录zhejiang、ningbo、huzhou数据库,改数据库全局名称、建公共的数据库连接
zhejiang数据库执行Sql命令如:
alterdatabaserenameglobal_nameto;改数据库全局名称。
createpublicdatabaselinkusing'ningbo';
createpublicdatabaselinkusing'huzhou';
ningbo数据库执行Sql命令如:
alterdatabaserenameglobal_nameto;
createpublicdatabaselinkusing'zhejiang';
createpublicdatabaselinkusing'huzhou';
huzhou数据库执行Sql命令如:
alterdatabaserenameglobal_nameto;
createpublicdatabaselinkusing'zhejiang';
createpublicdatabaselinkusing'ningbo;
参数说明:
后面的zhejiang、ningbo、huzhou为在TNS文件中配置的名字。
2.3.2用repadmin身份登录zhejiang、ningbo、huzhou数据库,创建私有的数据库连接
zhejiang数据库执行Sql命令如:
createdatabaselinkconnecttorepadminidentifiedbyrepadmin;
createdatabaselinkconnecttorepadminidentifiedbyrepadmin;
ningbo数据库执行Sql命令如:
createdatabaselinkconnecttorepadminidentifiedbyrepadmin;
createdatabaselinkconnecttorepadminidentifiedbyrepadmin;
huzhou数据库执行Sql命令如:
createdatabaselinkconnecttorepadminidentifiedbyrepadmin;
createdatabaselinkconnecttorepadminidentifiedbyrepadmin;
2.3.3测试数据库全局名称和公共的数据库链接
select*fromglobal_name@;
返回结果为就对了。
2.4创建复制数据库的时间表,我们假设用固定的时间表
2.4.1用repadmin身份登录zhejiang、ningbo、huzhou数据库,运行以下命令添加PURGE的任务SYSDATE+1/24间隔为一个小时
zhejiang数据库执行Sql命令如:
begin
dbms_defer_sys.schedule_purge(
next_date=>sysdate,
interval=>'sysdate+1/24',
delay_seconds=>0,
rollback_segment=>'');
end;
ningbo数据库执行Sql命令如:
begin
dbms_defer_sys.schedule_purge(
next_date=>sysdate,
interval=>'sysdate+1/24',
delay_seconds=>0,
rollback_segment=>'');
end;
huzhou数据库执行Sql命令如:
begin
dbms_defer_sys.schedule_purge(
next_date=>sysdate,
interval=>'sysdate+1/24',
delay_seconds=>0,
rollback_segment=>'');
end;
2.4.2用repadmin身份登录zhejiang、ningbo、huzhou数据库,运行以下命令建立jobs(定时执行PUSH任务)
zhejiang数据库执行Sql命令如:
begin
dbms_defer_sys.schedule_push(
destination=>'',
interval=>'sysdate+5/1440',
next_date=>sysdate,
parallelism=>1,
execution_seconds=>1500,
delay_seconds=>1200);
end;
begin
dbms_defer_sys.schedule_push(
destination=>'',
interval=>'sysdate+5/1440',
next_date=>sysdate,
parallelism=>1,
execution_seconds=>1500,
delay_seconds=>1200);
end;
ningbo数据库执行Sql命令如:
begin
dbms_defer_sys.schedule_push(
destination=>'',
interval=>'sysdate+5/1440',
next_date=>sysdate,
parallelism=>1,
execution_seconds=>1500,
delay_seconds=>1200);
end;
begin
dbms_defer_sys.schedule_push(
destination=>'',
interval=>'sysdate+5/1440',
next_date=>sysdate,
parallelism=>1,
execution_seconds=>1500,
delay_seconds=>1200);
end;
huzhou数据库执行Sql命令如:
begin
dbms_defer_sys.schedule_push(
destination=>'',
interval=>'sysdate+5/1440',
next_date=>sysdate,
parallelism=>1,
execution_seconds=>1500,
delay_seconds=>1200);
end;
begin
dbms_defer_sys.schedule_push(
destination=>'',
interval=>'sysdate+5/1440',
next_date=>sysdate,
parallelism=>1,
execution_seconds=>1500,
delay_seconds=>1200);
end;
2.5创建要复制的组DataSysnc_mg,加入数据库对象、产生对象的复制支持、并创建主复制节点
2.5.1用repadmin身份登录zhejiang主数据库,创建主复制组DataSysnc_mg
执行Sql命令如:
executedbms_repcat.create_master_repgroup('DataSysnc_mg');
2.5.2在复制组DataSysnc_mg里加入数据库对象
executedbms_repcat.create_master_repobject(sname=>'DataSysnc',oname=>'test1',type=>'table',use_existing_object=>true,gname=>'DataSysnc_mg');
executedbms_repcat.create_master_repobject(sname=>'DataSysnc',oname=>'test2',type=>'table',use_existing_object=>true,gname=>'DataSysnc_mg');
(说明:
有多少个需要参加复制的表就要写多少条以上的语句)
参数说明:
sname实现数据库复制的用户名称
oname实现数据库复制的数据库对象名称
(表名长度在27个字节内,程序包名长度在24个字节内)
type实现数据库复制的数据库对象类别
(支持的类别:
表,索引,同义词,触发器,视图,过程,函数,程序包,程序包体)
use_existing_objecttrue表示用主复制节点已经存在的数据库对象
gname主复制组名
2.5.3对数据库对象产生复制支持
executedbms_repcat.generate_replication_support('DataSysnc','test1','table',min_communication=>true);
executedbms_repcat.generate_replication_support('DataSysnc','test2','table',min_communication=>true);
(说明:
产生支持'DataSysnc'用户下'test1','test2'表复制的数据库触发器和程序包,
以上内容有多少参与复制的表就要写多少条。
)
2.5.4确认复制的组和对象已经加入数据库的数据字典
selectgname,master,statusfromdba_repgroup;
select*fromdba_repobject;
2.5.5用repadmin身份登录zhejiang主数据库,创建主复制节点
executedbms_repcat.add_master_database(gname=>'DataSysnc_mg',master=>'',use_existing_objects=>true,copy_rows=>false,propagation_mode=>'asynchronous');
executedbms_repcat.add_master_database(gname=>'DataSysnc_mg',master=>'',use_existing_objects=>true,copy_rows=>false,propagation_mode=>'asynchronous');
参数说明:
gname主复制组名
master加入主复制节点的另一个数据库
use_existing_objecttrue表示用主复制节点已经存在的数据库对象
copy_rowsfalse表示第一次开始复制时不用和主复制节点保持一致
propagation_mode异步地执行(同步synchronous)
2.5.6确认复制的任务队列已经加入数据库的数据字典
select*fromuser_jobs;
2.5.7使同步组的状态由停顿(quiesced)改为正常(normal)
selectgname,master,statusfromdba_repgroup;
确认同步组的状态为正常(normal),如果为quiesced则执行:
①executedbms_repcat.resume_master_activity('DataSysnc_mg',false);
如果这个①命令不能使同步组的状态为正常(normal),可能有一些停顿的复制,运行以下命令再试试(建议在紧急的时候才用):
executedbms_repcat.resume_master_activity('DataSysnc_mg',true);
2.6异常情况的处理
2.6.1检查复制工作正常否,可以在repadmin用户下查询user_jobs
selectjob,this_date,next_date,what,brokenfromuser_jobs;
正常的状态有两种:
任务闲--this_date为空,next_date为当前时间后的一个时间值
任务忙--this_date不为空,next_date为当前时间后的一个时间值
异常状态也有两种:
任务死锁--next_date为当前时间前的一个时间值
任务死锁--next_date为非常大的一个时间值,例如:
4001-01-01
这可能因为网络中断照成的死锁
解除死锁的办法:
$ps-ef|greporale
找到死锁的刷新快照的进程号ora_snp*,用kill-9命令删除此进程
然后进入repadmin用户操作符下,运行命令:
execdbms_job.run(job_number);
说明:
job_number为用selectjob,this_date,next_date,whatfromuser_jobs;命令查出的job编号。
2.6.2、增加或减少复制组的复制对象
①、停止主数据库节点的复制动作,使同步组的状态由正常(normal)改为停顿(quiesced)
用repadmin身份登录shenzhen数据库,运行以下命令
executedbms_repcat.suspend_master_activity(gname=>'DataSysnc_mg');
②、在复制组scott_mg里加入数据库对象,保证数据库对象必须有主关键字。
executedbms_repcat.create_master_repobject(sname=>'DataSysnc',oname=>'emp',type=>'table',use_existing_object=>true,gname=>'DataSysnc_mg');
对加入的数据库对象产生复制支持
executedbms_repcat.generate_replication_support('DataSysnc','emp','table');
③、在复制组scott_mg里删除数据库对象。
executedbms_repcat.drop_master_repobject('DataSysnc','test1','table');
④、重新使同步组的状态由停顿(quiesced)改为正常(normal)。
executedbms_repcat.resume_master_activity('scott_mg',false);
以下脚本用于解决由于网络问题造成jobs失败次数超过16次状态变为broken后JOBS失效的问题(每个站点都要运行)
createorreplaceprocedurechange_job_brokenis
begin
declare
cursormy_broken_jobsis------建立一个游标
selectjobfromuser_jobswherebroken='y';------检测user_jobs的broken状态是否有为"y"的
begin
forbroken_jobinmy_broken_jobsloop
begin
dbms_job.broken(broken_job.job,false);-------如果broken状态为"y"则通过此行将其改为"n"
exception
whenothersthen
null;
end;
endloop;
end;
end;
然后可以在制作一个JOBS让以上脚本每天运行一次
variablennumber;
begin
dbms_job.submit(:
n,'change_job_broken;',sysdate,'sysdate+1');
commit;
dbms_job.run(:
n);
commit;
end;
2.7相关删除操作
2.7.1主数据库(用repadmin身份登录数据库)
--停掉高级复制
EXECUTEDbms_Repcat.Suspend_Master_Activity(gname=>'DATASYSNC_MG');
--删除复制组对象(有多少删除多少)
EXECUTEDbms_Repcat.Drop_Master_Repobject('DATASYSNC','test1','TABLE');
--删除主站点上面的组
EXECUTEDbms_Repcat.Remove_Master_Databases('DATASYSNC_MG','');
EXECUTEDbms_Repcat.Remove_Master_Databases('DATASYSNC_MG','
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Oracle 数据库 同步 复制 要点
![提示](https://static.bingdoc.com/images/bang_tan.gif)