我们经常希望把各地的数据入库后进行统一的应用现在可以用复制技术来解决这个问题但实现数据库复制也是要有一些条件的
首先数据库要具备高级复制功能(用system身份登录数据库查看v$option视图如果其中Advanced replication为TRUE则支持高级复制功能否则不支持)
如果具备高级复制功能数据库要进行一些参数初始化
db_domain = 指明数据库的域名(默认的是WORLD)这里可以用您公司的域名global_names = true 它要求数据库链接(database link)和被连接的数据库名称一致现在全局数据库名db_name++db_domain
跟数据库job执行有关的参数
job_queue_processes =
job_queue_interval =
distributed_transactions =
open_links =
第一行定义SNP进程的启动个数为n系统缺省值为正常定义范围为~根据任务的多少可以配置不同的数值第二行定义系统每隔N秒唤醒该进程一次系统缺省值为秒正常范围为~秒事实上该进程执行完当前任务后就进入睡眠状态睡眠一段时间后由系统的总控负责将其唤醒如果修改了以上这几个参数需要重新启动数据库以使参数生效
做完了初步的准备我们来实现数据库同步复制
假设在Internet上有两个数据库一个叫中国(China)一个叫日本(Japan)
具体配置如下
数据库名ChinaJapan
数据库域名
数据库sid号 ChinaJapan
Listener端口号
服务器ip地址
确认两个数据库之间可以互相访问在tnsnamesora里设置数据库连接字符串
中国这边的数据库连接字符串是以下的格式
Japan =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = )(PORT = ))
)
(CONNECT_DATA =
(SERVICE_NAME = Japan)
)
)
运行$tnsping Japan出现以下提示符
Attempting to contact (ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=))
OK(n毫秒)
表明中国数据库可以访问日本数据库在日本那边也同样配置确认$tnsping China 是通的
改数据库全局名称建公共的数据库链接
用system身份登录China数据库
SQL>alter database rename global_name to ;
用system身份登录Japan数据库
SQL>alter database rename global_name to ;
用system身份登录China数据库
SQL>create public database link using Japan;
测试数据库全局名称和公共的数据库链接
SQL>select * from globalcn;
返回结果为就对了
用system身份登录Japan数据库
SQL>create public database link using China;
测试数据库全局名称和公共的数据库链接
SQL>select * from globalcn;
返回结果为就对了
建立管理数据库复制的用户repadmin并赋权
用system身份登录China数据库
SQL>create user repadmin identified by repadmin default tablespace users temporary tablespace temp;
SQL>execute dbms_defer_sysregister_propagator(repadmin);
SQL>grant execute any procedure to repadmin;
SQL>execute dbms_repcat_admingrant_admin_any_repgroup(repadmin);
SQL>grant comment any table to repadmin;
SQL>grant lock any table to repadmin;
同样用system身份登录Japan数据库运行以上的命令管理数据库复制的用户repadmin并赋权
在数据库复制的用户repadmin下创建私有的数据库链接
用repadmin身份登录China数据库
SQL>create database link connect to repadmin identified 试这个私有的数据库链接
SQL>select * from globalcn;
返回结果为就对了
用repadmin身份登录Japan数据库
SQL>create database link connect to repadmin identified by repadmin;
测试这个私有的数据库链接
SQL>select * from globalcn;
返回结果为就对了
创建或选择实现数据库复制的用户和对象给用户赋权数据库对象必须有主关键字
用internal身份登录China数据库创建scott用户并赋权
SQL>create user scott identified by tiger default tablespace users temporary tablespace temp;
SQL>grant connect resource to scott;
SQL>grant execute on sysdbms_defer to scott;
用scott身份登录China数据库创建表dept
SQL>create table dept
(deptno number() primary key
dname varchar()
loc varchar() );
如果数据库对象没有主关键字可以运行以下SQL命令添加
SQL>alter table dept add (constraint dept_deptno_pk primary key (deptno));
在China数据库scott用户下创建主关键字的序列号范围避免和Japan的沖突
SQL> create sequence dept_no increment by start with maxvalue cycle nocache;
在China数据库scott用户下插入初始化数据
SQL>insert into dept values (dept_nonextvalaccountingnew york);
SQL>insert into dept values (dept_nonextvalresearchdallas);
SQL>commit;
在Japan数据库那边同样运行以上①②③
在Japan数据库scott用户下创建主关键字的序列号范围避免和China的沖突
SQL> create sequence dept_no increment by start with maxvalue cycle nocache;
在Japan数据库scott用户下插入初始化数据
SQL>insert into dept values (dept_nonextvalsaleschicago);
SQL>insert into dept values (dept_nonextvaloperationsboston);
SQL>commit;
在Japan数据库那边同样运行以上①②③
在Japan数据库scott用户下创建主关键字的序列号范围避免和China的沖突
SQL> create sequence dept_no increment by start with maxvalue cycle nocache;
在Japan数据库scott用户下插入初始化数据
SQL>insert into dept values (dept_nonextvalsaleschicago);
SQL>insert into dept values (dept_nonextvaloperationsboston);
SQL>commit;
创建要复制的组scott_mg加入数据库对象产生对象的复制支持
用repadmin身份登录China数据库创建主复制组scott_mg
SQL> execute dbms_repcatcreate_master_repgroup(scott_mg);
在复制组scott_mg里加入数据库对象
SQL>execute dbms_repcatcreate_master_repobject(sname=>scottoname=>dept type=>tableuse_existing_object=>truegname=>scott_mg);
参数说明
sname 实现数据库复制的用户名称
oname 实现数据库复制的数据库对象名称
type 实现数据库复制的数据库对象类别
use_existing_object true表示用主复制节点已经存在的数据库对象
gname 主复制组名
对数据库对象产生复制支持
SQL>execute dbms_repcatgenerate_replication_support(scottdepttable);
确认复制的组和对象已经加入数据库的数据字典
SQL>select gname master status from dba_repgroup;
SQL>select * from dba_repobject;
创建主复制节点
用repadmin身份登录China数据库创建主复制节点
SQL>execute dbms_repcatadd_master_database
(gname=>scott_mgmaster=>use_existing_objects=>true copy_rows=>false propagation_mode => asynchronous);
参数说明
gname 主复制组名
master 加入主复制节点的另一个数据库
use_existing_object true表示用主复制节点已经存在的数据库对象
copy_rows false表示第一次开始复制时不用和主复制节点保持一致
propagation_mode 异步地执行
确认复制的任务队列已经加入数据库的数据字典
SQL>select * from user_jobs;
使同步组的状态由停顿(quiesced )改为正常(normal)
用repaa数据库运行以下命令
SQL> execute dbms_repcatresume_master_activity(scott_mgfa