先说一下高级复制背景
1、两台服务器上均有oracle 9i 92010版本。服务器均有固定IP地址,服务器系统均为windows server2003。
2、两台服务器的golbal_name为zzti.edu.cn和zzti1.edu.cn。 zzti的IP地址为
10.0.0.1 zzti1的ip地址为
10.0.0.2。
准备工作:
1、先检查两个oracle是否支持高级复制功能。
操作为以sys用户登录sqlplus
SQL>select value from v$option where parameter='Advanced replication';
如果返回为true,则表明oracle支持高级复制功能。若返回为false 则表明oracle不支持高级复制功能,需要安装oracle高级复制组建。
2、初始化global_names参数为true
操作为以sys用户登录sqlplus
SQL>alter system set global_names = true;
或着修改init.ora中的global_names=true;
(注:在有些教程中说不需要修改这个值,但是大部分还是说要修改 所以在我实施的过程中我修改了这个值)
3、修改openlinks值
查看openlinks值的方法为
以sys用户登录sqlplus
SQL>show parameter open_links;
默认oracle中openlinks为4 在此环境中修要为8(因为一个process需要4个link)
(注:在此过程中我并没有修改这个值,原因是自己不知道如何去修改。有些教程上说是在init.ora中修改,但是在我的这个文件中我并没有找到这个参数)
4、修改job_queue_processes值
修改方法为
以sys用户登录sqlplus
SQL>alter system set job_queue_processes=10;
5、检查双方的global_name是否相同,只有两边的global_name相同,才能建立正确的dblink。
查看global_name 方法为
以sysdba的权限登录sqlplus
SQL>select * from global_name;
如 在此环境中查询结果为zzti.edu.cn 则表明global_name值为edu.cn
另一个oracle查询结果为zzti1.edu.cn表明golbal_name值为edu.cn
双方的global_name值相同,所以可以建立连接。
如果双方的不同,可以用以下方法修改:
以sysdba的权限登录sqlplus
SQL>alter database rename global_name to
global_name值;
至此 我们的准备工作已经完成。下面我们正式开始oracle高级复制功能的配置。
1、创建用户以及数据(在两个oralcle数据库中均要进行的操作):
以sysdba的权限登录sqlplus
SQL> create user
victor identified by
qwertyu1234567 default tablespace users; 其中victor是用户名,密码是qwertyu1234567
(删除用户的命令为)
SQL>grant connect,resource to
victor
;
为新建victor用户赋予权限
SQL>conn
victor/
qwertyu1234567
连接到victor用户
SQL>
create table test(id number,name varchar2(20),constraint test_id_pk primary key(id)); 主键一定是要的,其中test为表的名称。如果提示有缺少括号错误,那应该是你把其中的单词拼写错误了,所以 应该细心一些。
SQL>insert into test values(1,'abc'); 插入数据
SQL>insert into test values(2,'def'); 插入数据
2、建立管理数据库复制的用户repadmin,并赋予权限。(在两个oralcle数据库中均要进行的操作):
SQL>create user repadmin identified by qwertyu1234567 default tablespace users temporary tablespace temp; 用户名为repadmin 密码 为qwertyu1234567
SQL>execute dbms_defer_sys.register_propagator('repadmin');
SQL>grant execute any procedure to repadmin;
SQL>execute dbms_repcat_admin.grant_admin_any_repgroup('repadmin');
SQL>execute dbms_repcat_admin.grant_admin_any_schema(username=>'repadmin');
SQL>grant comment any table to repadmin;
SQL>grant lock any table to repadmin;
SQL>grant select any dictionary to repadmin;
3、现在只在zzti上配置
用repadmin用户登录数据zzti,并且建立私有数据库连接
SQL>create database link "
zzti1.edu.cn" connect to
repadmin identified by
qwertyu1234567 ;
zzti1.edu.cn
为对方的global_name值,用户 名repadmin,密码 qwertyu1234567
在tnsnames.ora用户中添加如下内容(tnsnames.ora文件路径:oracle\ora92\network\admin)
ORA92 = 这个名字随便起
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST =
10.0.0.2)(PORT = 1521)) zzti1的IP地址
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME =
zzti1.edu.cn
)
zzti1的全局数据库名称
) )
创建数据库连接
SQL>create database link "
zzti1.edu.cn@perday"
connect to
repadmin identified by
qwertyu1234567
using'
ora92';
检查连接是否建立成功(一定要用repadmin用户登录,否则会提示找不到连接)
SQL> select * from global_name@
zzti1.edu.cn@perday;
如果返回zzti1的global_name 则表明连接建立成功,若有问题 ,则表明没有建立成功。
4、添加复制组,添加复制站点,将zzti称为主体站点,创建每天复制一次的组。(
用
r
epadmin用户登录在zzti 只在zzti上配置而且登录用户都为repadmin)
添加:
SQL> execute dbms_repcat.create_master_repgroup
(gname=>'rep_gp_day',group_comment=>'replcation perday',qualifier=>'@perday');
删除:
SQL>execute dbms_repcat.drop_master_repgroup
(gname=>'rep_gp_day',all_sites => true); 配置错了可以用这条语句删除
检查执行结果:
SQL>select * from dba_repsites;
用spool生成批量执行的SQL语句
SQL> set feedback off;
SQL> set pagesize 0;
SQL> set heading off;
SQL> set verify off;
SQL> set linesize 1000;
SQL> set trimspool on;
SQL>
spool finename.sql;
SQL>
select 'execute dbms_repcat.create_zzti_repobject
(sname=>"victor",oname=>"test",type=>"table",use_existing_object=>true,gname=>"rep_gp_day",copy_rows=>true)'
CREATE_SQL from tabs;
SQL>
select 'dbms_repcat.generate_replication_support("victor","test","table")'
GEN_SQL from tabs;
SQL> spool off;
SQL> set feedback on;
SQL> set pagesize 9999;
SQL> set heading on;
SQL> set verify on;
检查复制组的状态
SQL>select gname,master,status from dba_repgroup;
如果改组的状态已经为normal 则在添加复制对象之前应该先停顿复制组即将normal状态改为quiesced状态
SQL>execute dbms_repcat.suspend_master_activity(gname=>'
rep_gp_day');
然后执行以下语句
SQL>execute dbms_repcat.create_master_repobject
(sname=>'
victor',oname=>'
test',type=>'table',use_existing_object=>true,gname=>'rep_gp_day',copy_rows=>false);
SQL>execute dbms_repcat.generate_replication_support('
victor','
test','table');
如果添加后发现有错误 可以用一下语句删除
SQL>execute dbms_repcat.drop_master_repobject(sname=>'
victor',oname=>'
test',type=>'table'); 不过经过自己的尝试,并不能彻底删除掉, 所以害的自己不得不把oracle彻底卸载掉 然后又重新配置。
5、添加主体库,在这必须保证自己的dblink连接正常。(
用
r
epadmin用户登录在zzti 只在zzti上配置而且登录用户都为repadmin)
SQL>execute dbms_repcat.add_master_database
(gname=>'
rep_gp_day',master=>'
zzti1.edu.cn@perday',use_existing_objects=>true,
copy_rows=>false,propagation_mode=>'
asynchronous');
SQL>select * from user_jobs;
SQL>execute dbms_repcat.resume_master_activity('rep_gp_day',false);
检查状态:
SQL>select gname,master,status from dba_repgroup;
如果状态
不为normal 则执行以下语句将其改为normal
SQL>execute dbms_repcat.resume_master_activity('rep_gp_day',true);
如果提示修改不成功,则先用以下语句把改组抑制,再用上面的语句激活
SQL>execute dbms_repcat.suspend_master_activity('rep_gp_day');
添加push任务:
begin
dbms_defer_sys.schedule_push(
destination=>'
zzti1.edu.cn@perday',
interval=>'sysdate+1/1440',
一天每1分钟运行一次
next_date=>sysdate,
下一次运行时间为当前时间
parallelism=>1,
delay_seconds=>50);
延迟秒数50
end;
/
dbms_defer_sys.schedule_purge(
next_date=>sysdate,
interval=>'sysdate+1/1440',
delay_seconds=>0,
rollback_segment=>'');
end;
/
至此 zzti数据库上的配置已经完成。
6、在zzti1上配置。(用repadmin用户登录。)
用repadmin用户登录数据zzti1,并且建立私有数据库连接
SQL>create database link "
zzti.edu.cn" connect to
repadmin identified by
qwertyu1234567
;
zzti.edu.cn
为对方的global_name值,用户 名repadmin,密码 qwertyu1234567
在tnsnames.ora用户中添加如下内容(tnsnames.ora文件路径:oracle\ora92\network\admin)
ORA92 = 这个名字随便起
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST =
10.0.0.1)(PORT = 1521)) zzti的IP地址
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME =
zzti.edu.cn
)
zzti1的全局数据库名称
) )
创建数据库连接
SQL>create database link "
zzti.edu.cn@perday"
connect to
repadmin identified by
qwertyu1234567
using'
ora92';
检查连接是否建立成功(一定要用repadmin用户登录,否则会提示找不到连接)
SQL> select * from global_name@
zzti.edu.cn@perday;
如果返回zzti的global_name 则表明连接建立成功,若有问题 ,则表明没有建立成功。
添加PUSH任务
begin
dbms_defer_sys.schedule_push(
destination=>'
zzti.edu.cn@perday',
interval=>'sysdate+1/1440',
一天每1分钟运行一次
next_date=>sysdate,
下一次运行时间为当前时间
parallelism=>1,
delay_seconds=>50);
延迟秒数50
end;
/
dbms_defer_sys.schedule_purge(
next_date=>sysdate,
interval=>'sysdate+1/1440',
delay_seconds=>0,
rollback_segment=>'');
end;
/
这样 zzti1上的也就建立好了,可以利用数据库同步啦。
在该过程中,自己整整用了一周的时间才配置好,所以在以后的日子中我会把我配置中的错误拿出来给大家分享。