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 MASTERslaveに:
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に反映される。
没有评论:
发表评论