我们经常希望把各地数据入库后进行统应用现在可以用复制技术来解决这个问题但实现数据库复制也是要有些条件
首先数据库要具备高级复制功能(用system身份登录数据库查看v$option视图如果其中Advanced replication为TRUE则支持高级复制功能;否则不支持)
如果具备高级复制功能数据库要进行些参数化
db_do = test.com.cn 指明数据库域名(默认是WORLD)这里可以用您公司域名;global_names = true 它要求数据库链接(database link)和被连接数据库名称致现在全局数据库名:db_name+”.”+db_do ;
跟数据库job执行有关参数:
job_queue_processes = 1;
job_queue_erval = 60;
distributed_transactions = 10;
open_links = 4
第行定义SNP进程启动个数为n系统缺省值为0正常定义范围为0~36根据任务多少可以配置区别数值第 2行定义系统每隔N秒唤醒该进程次系统缺省值为60秒正常范围为1~3600秒事实上该进程执行完当前任务后就进入睡眠状态睡眠段时间后由系统总控负责将其唤醒如果修改了以上这几个参数需要重新启动数据库以使参数生效
做完了初步准备我们来实现数据库同步复制
假设在Internet上有两个数据库:个叫中国(China)个叫日本(Japan)
具体配置如下:
数据库名:China、Japan
数据库域名 test.com.cn
数据库sid号 China、Japan
Listener端口号 1521
服务器ip地址 10.1.0.100 10.1.0.200
确认两个数据库的间可以互相访问在tnsnames.ora里设置数据库连接串
中国这边数据库连接串是以下格式:
Japan =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.1.200)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = Japan)
)
)
运行$tnsping Japan出现以下提示符:
Attempting to contact (ADDRESS=(PROTOCOL=TCP)(HOST=10.1.1.200)(PORT=1521))
OK(n毫秒)
表明中国数据库可以访问日本数据库在日本那边也同样配置确认$tnsping China 是通
改数据库全局名称建公共数据库链接
用system身份登录China数据库
SQL>alter database rename global_name to China.test.com.cn;
用system身份登录Japan数据库:
SQL>alter database rename global_name to Japan.test.com.cn;
用system身份登录China数据库
SQL>create public database link Japan.test.com.cn using \'Japan\';
测试数据库全局名称和公共数据库链接
SQL>select * from [email protected];
返回结果为Japan.test.com.cn就对了
用system身份登录Japan数据库:
SQL>create public database link China.test.com.cn using \'China\';
测试数据库全局名称和公共数据库链接
SQL>select * from [email protected];
返回结果为China.test.com.cn就对了
建立管理数据库复制用户repadmin并赋权
用system身份登录China数据库:
SQL>create user repadmin identied by repadmin default tablespace users temporary tablespace temp;
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>grant comment any table to repadmin;
SQL>grant lock any table to repadmin;
同样用system身份登录Japan数据库运行以上命令管理数据库复制用户repadmin并赋权
在数据库复制用户repadmin下创建私有数据库链接
用repadmin身份登录China数据库
SQL>create database link Japan.test.com.cn connect to repadmin identied 试这个私有数据库链接:
SQL>select * from [email protected];
返回结果为Japan.test.com.cn就对了
用repadmin身份登录Japan数据库
SQL>create database link China.test.com.cn connect to repadmin identied by repadmin;
测试这个私有数据库链接:
SQL>select * from [email protected];
返回结果为China.test.com.cn就对了
创建或选择实现数据库复制用户和对象给用户赋权数据库对象必须有主关键字
用ernal身份登录China数据库创建scott用户并赋权:
SQL>create user scott identied by tiger default tablespace users temporary tablespace temp;
SQL>grant connect, resource to scott;
SQL>grant execute _disibledevent=>
在Japan数据库那边同样运行以上①②③
在Japan数据库scott用户下创建主关键字序列号范围避免和China冲突
SQL> create sequence dept_no increment by 1 start with 45 maxvalue 99 cycle nocache;
在Japan数据库scott用户下插入化数据
SQL>insert o dept values (dept_no.nextval,\'sales\',\'chicago\');
SQL>insert o dept values (dept_no.nextval,\'operations\',\'boston\');
SQL>commit;
在Japan数据库那边同样运行以上①②③
在Japan数据库scott用户下创建主关键字序列号范围避免和China冲突
SQL> create sequence dept_no increment by 1 start with 45 maxvalue 99 cycle nocache;
在Japan数据库scott用户下插入化数据
SQL>insert o dept values (dept_no.nextval,\'sales\',\'chicago\');
SQL>insert o dept values (dept_no.nextval,\'operations\',\'boston\');
SQL>commit;
创建要复制组scott_mg加入数据库对象产生对象复制支持
用repadmin身份登录China数据库创建主复制组scott_mg:
SQL> execute dbms_repcat.create_master_repgroup(\'scott_mg\');
在复制组scott_mg里加入数据库对象:
SQL>execute dbms_repcat.create_master_repobject(sname=>\'scott\',oname=>\'dept\', type=>\'table\',use_existing_object=>true,gname=>\'scott_mg\');
参数介绍说明:
sname 实现数据库复制用户名称;
oname 实现数据库复制数据库对象名称;
type 实现数据库复制数据库对象类别;
use_existing_object true表示用主复制节点已经存在数据库对象;
gname 主复制组名;
对数据库对象产生复制支持:
SQL>execute dbms_repcat.generate_replication_support(\'scott\',\'dept\',\'table\');
确认复制组和对象已经加入数据库数据字典:
SQL>select gname, master, status from dba_repgroup;
SQL>select * from dba_repobject;
创建主复制节点:
用repadmin身份登录China数据库创建主复制节点:
SQL>execute dbms_repcat.add_master_database
(gname=>\'scott_mg\',master=>\'Japan.test.com.cn\',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_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);
创建复制数据库时间表10分钟复制次
用repadmin身份登录China数据库运行以下命令:
SQL>begin
dbms_defer_sys.schedule_push (
destination => \'Japan.test.com.cn\',
erval => \'sysdate + 10/1440\',
next_date => sysdate);
end;
/
SQL>begin
dbms_defer_sys.schedule_purge (
next_date => sysdate,
erval => \'sysdate + 10/1440\',
delay_seconds => 0,
rollback_segment => \');
end;
/
用repadmin身份登录Japan数据库运行以下命令:
SQL>begin
dbms_defer_sys.schedule_push (
destination => \' China.test.com.cn \',
erval => \'sysdate + 10 / 1440\',
next_date => sysdate);
end;
/
SQL>begin
dbms_defer_sys.schedule_purge (
next_date => sysdate,
erval => \'sysdate + 10/1440\',
delay_seconds => 0,
rollback_segment => \');
end;
/
添加或修改两边数据库记录跟踪复制过程如果你想立刻看到添加或修改后数据库记录变化可以在两边repadmin用户下找到pushjob_number然后运行:
SQL>exec dbms_job.run(job_number);
异常情况处理:
检查复制工作正常否可以在repadmin 用户下查询user_jobs
SQL>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 用户SQL>操作符下运行命令:
SQL>exec dbms_job.run(job_number);
介绍说明:job_number 为用select job,this_date,next_date,what from user_jobs;命令查出job编号
增加或减少复制组复制对象:
停止主数据库节点复制动作使同步组状态由正常(normal)改为停顿(quiesced )用repadmin身份登录China数据库运行以下命令:
SQL>execute dbms_repcat.suspend_master_activity (gname => \'scott_mg\');
在复制组scott_mg里加入数据库对象保证数据库对象必须有主关键字
SQL>execute dbms_repcat.create_master_repobject(sname=>\'scott\',oname=>\'emp\', type=>\'table\',use_existing_object=>true,gname=>\'scott_mg\');
对加入数据库对象产生复制支持:
SQL>execute dbms_repcat.generate_replication_support(\'scott\',\'emp\',\'table\');
在复制组scott_mg里删除数据库对象:
SQL>execute dbms_repcat.drop_master_repobject (\'scott\',\'dept\',\'table\');
重新使同步组状态由停顿(quiesced )改为正常(normal)
SQL> execute dbms_repcat.resume_master_activity(\'scott_mg\',false);
最新评论