2008-4-29 14:25
jonnyzhang110
RAC下實施高級復制經驗交流
大家有沒在RAC環境中實施過高級復制.
比如:
Master A ----- Master B
A站點為RAC環境 兩節點
B站點為RAC環境 兩節點
A,B為異地可讀寫復制.
如何實施高級復制.
和單機環境實施的異同。
打算在RAC環境實施復制。
已經在單機環境測試過。
大家可以參考.就是RAC不知道是否一樣,高手指點一下.
例子:
[color=Red]基礎資料:[/color]
TESTA-TESTB做Master-Master復制
復制管理員 傳遞者 接收者 Global_name
TESTA站點 TESTB站點
repadmin
test repadmin repadmin TESTA.COM TESTB.COM
------------
[color=Red]安裝主站點[/color]
------------
1.使用管理員帳戶連接到TESTA DB
Sqlplus /nolog
Conn sys@testa
Pwd
2.創建復制管理員用戶在TESTA DB
CREATE USER repadmin IDENTIFIED BY test;
3.賦予復制管理員相應權限
BEGIN
DBMS_REPCAT_ADMIN.GRANT_ADMIN_ANY_SCHEMA (
username => 'repadmin');
END;
/
GRANT COMMENT ANY TABLE TO repadmin;
GRANT LOCK ANY TABLE TO repadmin;
GRANT SELECT ANY DICTIONARY TO repadmin;
4.注冊傳遞者在TESTA DB
BEGIN
DBMS_DEFER_SYS.REGISTER_PROPAGATOR (
username => 'repadmin');
END;
/
5.注冊接收者在TESTA DB(接收其他站點傳遞來的資料)
/*list_of_gnames => NULL
上述設置所有復制組的receiver都為repadmin
list_of_gnames => gname1,gname2,...
如果需要設置部分復制組的receiver可以使用上述配置
*/
BEGIN
DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP (
username => 'repadmin',
privilege_type => 'receiver',
list_of_gnames => NULL);
END;
/
6.設置定期的Purge在TESTA DB(10分鐘一次)
BEGIN
DBMS_DEFER_SYS.SCHEDULE_PURGE (
next_date => SYSDATE,
interval => 'SYSDATE + 1/144',
delay_seconds => 0);
END;
/
7.在TESTB DB上重復1-6步驟(添加其他站點)
8.創建主站點之間的Scheduled Link
a.創建主站點之間的DB Link
(注意DBLink的名字要與連接到的DB的gobal_name相同,using後跟TNS中配置的連接其他DB用的字串)
CONNECT sys@testa
CREATE PUBLIC DATABASE LINK testb.com USING 'testb';
CONNECT repadmin@testa
CREATE DATABASE LINK testb.com CONNECT TO repadmin IDENTIFIED BY test;
CONNECT sys@testb
CREATE PUBLIC DATABASE LINK testa.com USING 'testa';
CONNECT repadmin@testb
CREATE DATABASE LINK testa.com CONNECT TO repadmin IDENTIFIED BY test
b.設置各站點之間定時Push機制(以下採用定期Push機制,而非連續Push)
CONNECT repadmin@testa
BEGIN
DBMS_DEFER_SYS.SCHEDULE_PUSH (
destination => 'testb.com',
interval => 'SYSDATE + (1/1440)',
next_date => SYSDATE,
delay_seconds =>0);
END;
/
CONNECT repadmin@testb
BEGIN
DBMS_DEFER_SYS.SCHEDULE_PUSH (
destination => 'testa.com',
interval => 'SYSDATE + (1/1440)',
next_date => SYSDATE,
delay_seconds =>0);
END;
/
---------------------------------
[color=Red]Creating a Master Group[/color]
---------------------------------
1.創建主復制組
CONNECT repadmin@testa
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPGROUP (
gname => 'test_repg');
END;
/
(備用)
刪除主復制組
BEGIN
DBMS_REPCAT.DROP_MASTER_REPGROUP(
gname =>'test_repg',
all_sites =>true);
END;
/
2.添加對象到主復制組
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPOBJECT (
gname => 'test_repg',
type => 'TABLE',
oname => 'TEST_TB',
sname => 'test',
use_existing_object => TRUE,
copy_rows => TRUE);
END;
/
(備用)
從主復制組中刪除對象
BEGIN
DBMS_REPCAT.DROP_MASTER_REPOBJECT (
sname =>'test',
oname =>'TEST_TB',
type => 'TABLE');
END;
/
3.添加其他主站點
BEGIN
DBMS_REPCAT.ADD_MASTER_DATABASE (
gname => 'test_repg',
master => 'testb.com',
use_existing_objects => TRUE,
copy_rows => TRUE,
propagation_mode => 'ASYNCHRONOUS');
END;
/
檢查結果
SELECT DBLINK FROM DBA_REPSITES WHERE GNAME = 'TEST_REPG';
如果查詢結果可以看到有添加的主站點則繼續.否則等待.
(備用)
Remove站點
BEGIN
DBMS_REPCAT.REMOVE_MASTER_DATABASES (
gname => 'test_repg',
master_list => 'testb.com');
END;
/
4.生成復制支持
BEGIN
DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT (
sname => 'TEST',
oname => 'TEST_TB',
type => 'TABLE',
min_communication => TRUE);
END;
/
使用以下語句檢查對復制組的管理操作是否已經都完成,完成之後才可以開始復制
SELECT COUNT(*) FROM DBA_REPCATLOG WHERE GNAME = 'TEST_REPG';
5.開始復制
BEGIN
DBMS_REPCAT.RESUME_MASTER_ACTIVITY (
gname => 'test_repg');
END;
/
大家交流一下經驗,看怎麼做RAC下的復制。
高手留步。
[[i] 本帖最后由 jonnyzhang110 于 2008-4-29 14:27 编辑 [/i]]
2008-4-29 16:28
jonnyzhang110
高手留步,自己頂一下。
2008-4-29 17:06
cow977
頂一下
2008-4-30 12:57
dwilson
学习学习
2008-5-7 15:59
jonnyzhang110
看來用的人不多呀。
那位高人有經驗,分享一下。
2008-5-7 22:16
yuxuan
本人也很关注,正准备在RAC环境中实施高级复制
不过我的A站是RAC,B站是单机
2008-5-9 11:22
jonnyzhang110
找了很多資料都沒有提到RAC怎麼去做。
不過前天問了一個公司的Oracle顧問,他本人認為沒有什麼區別。
我也覺得應該沒什麼區別。
反正配置過程中並無提到特別針對RAC的設置。
準備直接在生產上配置了。
應該問題不大。
2008-6-2 19:51
jonnyzhang110
今天在生產上嘗試做復制
發現一個大問題:
生產庫的表要寫,但是一個組在啟用之前加入其中的表都是隻讀的.
大家有沒什麼好辦法提高咝兴俣妊剑砗芏嘤写蟾1500個左右。
2008-6-30 23:10
jonnyzhang110
结贴报告
在生产上配置了Master-Master复制,问题多多,最后又撤下来了,还费了不少周章,具体情况如下:
配置了1000个表的复制,分五个复制组,生产环境是三个节点的RAC,每个节点每天归档得量是6G左右。
在rac上配置高级复制和单个节点上没什么区别,只用在一个节点上配置高级复制即可。
问题主要有两个:
1.配置完高级复制之后启动复制,发现有些表变成只读,oracle 报表结构有变化,但是压根没变过。网上查了一下有人说是bug.这样应用就没办法使用,使用set_disable包使复制不再传递,但是因为生产更新量比较大,因此造成系统表空间暴涨,直接长到30g.
2.最后想停调复制也无法短时间停止,给oracle开sr后,使用trunc系统表方法才停止复制组,等一些列操作。
3.最后咨询oracle 顾问,顾问并不建议配置大量这样表的复制。依据顾问经验复制表不应该超过50个。
2008-7-1 05:22
netbanker
1.配置完高级复制之后启动复制,发现有些表变成只读,oracle 报表结构有变化,但是压根没变过。网上查了一下有人说是bug.这样应用就没办法使用,使用set_disable包使复制不再传递,但是因为生产更新量比较大,因此造成系统表空间暴涨,直接长到30g.
not sure about read-only but I believe you should set seperate tablespace for stream data
2.最后想停调复制也无法短时间停止,给oracle开sr后,使用trunc系统表方法才停止复制组,等一些列操作。
what is the detailed steps you are taking?
3.最后咨询oracle 顾问,顾问并不建议配置大量这样表的复制。依据顾问经验复制表不应该超过50个。
we have larger amount of tables as well, I donot which process causes slow performance, if apply, you should have more apply processes configured.
2008-7-1 18:28
jonnyzhang110
疑问解答
一.忘记说环境了我们生产环境是oracle 9205RAC三个节点。没有使用stream来做复制。关于延迟事务存储的表空间,之前在网上查过一些资料,默认的存在系统表空间,如果要修改就需要在建库时候修改脚本或者重新建库才可以。关于表只读的错误类似这样的,就是在复制中不使用oracle复制提供的包直接修改表结构的错误一样,但是真的没有修改过表结构,然后表结构变化oracle要你重新生成复制支持才可以继续操作那表。这样情况下生产没办法用了,因为一些表都成只读了,找顾问得到临时解决办法是:
使用DBMS_DEFER_SYS.SET_DISABLED来先停止复制。然后表就变成可以写了。然后顾问建议我们先将高级复制撤下来。
二.真正停止复制的步骤是没错了都是文档上写的步骤,
a.停复制组
b.删除复制对象
c.删除复制组
主要问题是累计了太多的延迟事务没有传递(100w以上延迟事务),在这种情况下又想撤下高级复制的做法。
停止复制组将会把未传递的事务先传递完毕,那么就只有将累及的延迟事务直接删除掉了,想法是这样,其实也很简单了,就是我们不知道是那些相关的内部表。下边是向oracle开sr之后得到的回复。还算比较及时,要不然我就挂了,生产系统表空间已经没得加了。
SOLUTION / ACTION PLAN
=======================
To implement the solution, please execute the following steps:
For each of the 5 groups,just do the actions one by one.
1. if posible,please stop the application for a while. But do not stop the resouce oracle using(including network,listener,etc)
2. Stop all the replication push and purge job. Stop current running push&purge job first.
note: 1)in 2 sites,run the whole step 2
2)no special comments, all user please use 'repadmin'
2.1 Check if the push job is currently running
select /*+ ORDERED */ j.job, j.sid, d.dblink,
SUBSTR(TO_CHAR(J.THIS_DATE,'MM/DD/RRRR HH24:MI:SS'),1,20) START_DATE
from defschedule d, dba_jobs_running j
where j.job in (select job from dba_jobs
where upper(what) like '%DBMS_DEFER_SYS.PUSH%')
and j.job = d.job;
JOB SID DBLINK START_DATE
---------- ---------- ------------------------------ -------------------
44 9 DB2.WORLD 05/16/2002 12:14:47
- if exist,then note the sid
- Kill the Job Queue Process from the Operating System. To do this use
the sid to identify the process in v$session, v$process
and v$bgprocess. The process will generally be named SNPx or Jxxx.
- After killing the process, wait approximately 1 minute, to ensure the
job is removed from dba_jobs_running.
You can kill the corresponding session after finding its serial# from
v$session:
select serial# from v$session where sid=9;
SERIAL#
----------
24909
alter system kill session '8,24909';
2.2 stop all push&purge job in 2 sites.
select job, what,broken from dba_jobs where upper(what) like '%DBMS_DEFER_SYS%';
JOB WHAT BROKEN
-------- ----------------------------------------------------------------------------------------
43 declare rc binary_integer; begin rc := sys.dbms_defer_sys.purge( N
delay_seconds=>0); end;
44 declare rc binary_integer; begin rc := sys.dbms_defer_sys.push(d N
estination=>'DB2.WORLD', stop_on_error=>FALSE, delay_seconds=>0,
parallelism=>2); end;
- Break the job with :
execute dbms_job.broken(<jobno>, true);--<jobno>need be changed from the previous query resu
lt.
commit;
Query again to confirm the push & purge job has all been stopped
3. remove the deferred queue
select constraint_name, table_name
from sys.dba_constraints where table_name = 'DEF$_CALLDEST';
CONSTRAINT_NAME TABLE_NAME
------------------------------ ------------------
DEF$_CALLDEST_PRIMARY DEF$_CALLDEST
DEF$_CALL_DESTINATION DEF$_CALLDEST
Note: As of Oracle8, system.DEF$_CALLDEST_CALL in not being used and
system.DEF$_CALL has been changed to system.DEF$_AQCALL (this
is due to the advanced queueing features in Oracle8)
truncate table system.DEF$_AQCALL;
truncate table system.DEF$_CALLDEST;
truncate table system.DEF$_ERROR;
truncate table system.DEF$_AQERROR;
truncate table system.DEF$_LOB; -- if there are LOBs replicated.
select * from DEFCALL;
no rows
select * from DEFTRAN;
no rows
select * from DEFERROR;
no rows
4. When All the steps are implemented on 2 sites,we can try to suspend the master group from the master definition site.
It wont take a lot of time. Then,you can remove the replcation object and the w
hole replication enviroment.
三.还是对高级复制了解太少,所以才会这样。只是高级复制的资料真的很少。版主能不能提供一些来研究,谢谢。
关键是对高级复制能够承载的数据量不清楚,和可以调节的参数不了解。
页:
[1]

Powered by ITPUB论坛