2013年2月5日星期二

Oracle Streamsの設定方法

Oracle StreamsはOracleのレプリケーションを建てるためにサーバの間に自動同期の技術である。今回はAWS EC2でOracle Streamsを配置した。この方法を記録する。

Streamsの設定準備

EC2で同じAMIから二つのデータベースのinstanceを起動する。この中に一つのサーバをmasterとして、他のサーバをslaveとする。
まずinit.oraファイルに、このパラメータを設定(masterとslave):
aq_tm_processes=2
global_names=true
job_queue_processes=10
parallel_max_servers=20
undo_retention=3600
nls_date_format='YYYY-MM-DD HH24:MI:SS'
streams_pool_size=25M
utl_file_dir='*'
open_links=4
#archive modeの設定:
log_archive_dest_1='LOCATION=/data/archivefile/' 
log_archive_format='%t_%s_%r.arc'

archive modeを有効にする(masterとslave):
sqlplus '/ as sysdba'
shutdown immediate;
startup mount;
alter database archivelog;
alter database open;

archive modeが有効されたかどうかこのように検証できる:
archive log list

streamsのuserを作る(masterとslave):
create tablespace tbs_stream datafile '/data/datafile/tbs_stream01.dbf' size 100m autoextend on maxsize unlimited segment space management auto;
execute dbms_logmnr_d.set_tablespace('tbs_stream');
create user strmadmin identified by strmadmin default tablespace tbs_stream temporary tablespace temp;
grant connect,resource,dba,aq_administrator_role to strmadmin;

次はmasterとslaveの間のDBLinkを作る。
masterのtnsnames.oraファイルにこれを添加:
 SLAVE =
    (DESCRIPTION =
     (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.***.***)(PORT = 1521))#slave server ip
      (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ****)#database name
     )
     )
slaveのtnsnames.oraファイルにこれを添加:
 MASTER =
    (DESCRIPTION =
     (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.***.***)(PORT = 1521))#master server ip
      (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ****)#database name
     )
     )

global_nameがDBlink名と違うとダメなので、global_nameを変える。masterに:
alter database rename global_name to MASTER
slaveに:
alter database rename global_name to SLAVE

DBLinkを作る。masterに:
create database link SLAVE connect to strmadmin identified by strmadmin using 'SLAVE';
slaveに:
create database link MASTER connect to strmadmin identified by strmadmin using 'MASTER';

Streamsを配置

Oracle 10gからStreamsを簡単に一つスクリプトで配置できる。masterに:
DECLARE
empty_tbs DBMS_STREAMS_TABLESPACE_ADM.TABLESPACE_SET;
BEGIN
DBMS_STREAMS_ADM.PRE_INSTANTIATION_SETUP(
maintain_mode => 'GLOBAL',
tablespace_names => empty_tbs,
source_database => 'MASTER',
destination_database => 'SLAVE',
perform_actions => true,
bi_directional => false,
include_ddl => true,
start_processes => true,
exclude_schemas => NULL,
exclude_flags => DBMS_STREAMS_ADM.EXCLUDE_FLAGS_UNSUPPORTED +
DBMS_STREAMS_ADM.EXCLUDE_FLAGS_DML +
DBMS_STREAMS_ADM.EXCLUDE_FLAGS_DDL);
END;
/

今回はmasterとslaveが同じAMIから起動されたので、データが同じ、同期の必要がない。もしそうじゃないと、ここでまずmasterのデータをslaveに同期する。そして、masterに:
DECLARE
until_scn NUMBER;
BEGIN
until_scn:= DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER;
DBMS_OUTPUT.PUT_LINE('Until SCN:' || until_scn);
END;
/
scnを記録して、masterに次のコマンドを実行する:
DECLARE
empty_tbs DBMS_STREAMS_TABLESPACE_ADM.TABLESPACE_SET;
BEGIN
DBMS_STREAMS_ADM.POST_INSTANTIATION_SETUP(
maintain_mode => 'GLOBAL',
tablespace_names => empty_tbs,
source_database => 'MASTER',
destination_database => 'SLAVE',
perform_actions => true,
bi_directional => false,
include_ddl => true,
start_processes => true,
instantiation_scn => ********, #前に記録したscn
exclude_schemas => NULL,
exclude_flags => DBMS_STREAMS_ADM.EXCLUDE_FLAGS_UNSUPPORTED +
DBMS_STREAMS_ADM.EXCLUDE_FLAGS_DML +
DBMS_STREAMS_ADM.EXCLUDE_FLAGS_DDL);
END;
/

これでStreamsが配置完了した。masterにデータが変更すると、slaveに反映される。

没有评论:

发表评论