sql >> データベース >  >> RDS >> Oracle

OracleStreamsのステップバイステップのレプリケーションの例

    Oracleリアルタイムバックアップシステムとは何ですか?

    Oracle Streamsレプリケーションは、Oracleデータベーススキーマを別のOracleデータベースにレプリケートできるようにするプロセスです。別のOracleデータベースは、任意の場所に配置できます。プライマリデータベースのDMLまたはDDLでトランザクションが発生するたびに、ターゲットデータベースに対してすぐに実行され、ライブバックアップコピーが維持されます。以下では、OracleStreamsのスクリプトを段階的に説明および提供しています。

    OracleStreamsレプリケーションのセットアップ

    この投稿では、スタンバイデータベースまたはレポートや分析の目的またはその他の目的に使用できるデータベース用に、OracleStreams機能を介してOracleデータベースレプリケーションを作成する手順について説明します。このOracleStreams機能は、Oracle 11gEnterpriseEditionおよび10gR2および9iR2。 OracleStreamsは12cではサポートされなくなりました。現在、Oracleはこの機能にOracle Golden Gateを使用しています。以下では、別のOracleデータベースへのレプリケーションを作成するための簡単な手順について説明しました。すべての手順について、手順1、手順2などとしてコピーして保存できるSQLスクリプトを提供しています。 、次にスクリプトを1つずつ実行してレプリケーションを設定します。ただし、スクリプトを実行する前に、値を角括弧[]内の値に変更し、慎重に置き換えます。角括弧内のすべての値はフルネームを意味するため、変更します。によると。

    重要!相互接続のソースデータベースとターゲットデータベースの両方について、tnsname.oraにエントリを作成します。

    ステップ1ターゲットまたはセカンダリデータベースの構成

    CONNECT [TARGET_SYS_CONNECTION] AS SYSDBA; ALTER SYSTEM SET AQ_TM_PROCESSES =3 SCOPE =BOTH; alter system set global_names =TRUE scope =BOTH; alter system set job_queue_processes =6 scope =BOTH; alter system set Streams_pool_size =100M scope =BOTH; alter system set undo_retention =3600 scope =BOTH; shutdownimmediate; startup mount; alter database open;

    ステップ2ソースまたはプライマリデータベースの設定

    CONNECT [SOURCE_SYS_CONNECTION1] AS SYSDBA; ALTER SYSTEM SET AQ_TM_PROCESSES =3 SCOPE =BOTH; alter system set global_names =TRUE scope =BOTH; alter system set job_queue_processes =6 scope =BOTH; alter system set Streams_pool_size =48M scope =BOTH; ALTER SYSTEM SET SMTP_OUT_SERVER ='[MAIL_SERVER] [MAIL_PORT]' SCOPE =BOTH; --- UNDO_RETENTION =86400alter system set undo_retention =3600 scope =BOTH; --- UNDO_MANAGEMENT =AUTOAlter System Set LOG_ARCHIVE_DEST_1 ='[ARCHIVELOG_DESTINATION]' Scope =Spfile; Set LOG_ARCHIVE_DEST_STATE_1 =enable Scope =Spfile; shutdown initial; startup mount; alter database archivelog; alter database open; Alter Database Add Supplemental Log Data(Primary Key、Unique、Foreign Key)Columns; Alter Database Force Logging; Alter System Archive Log Current;

    ステップ-3ソースデータベースのテーブルスペースを作成する

    connect [source_sys_connection1] as sysdba; createtablespace [logminer_ts_name] datafile'[logminer_datafile]' size 100mreuse autoextend on maxsize UNlimited; execute dbms_logmnr_d.set_tablespace('[logminer_ts_name]'); createtablespace [stream_ts_name] datafile'[stream_datafile] maxsize無制限で自動拡張。

    ステップ-4ソースデータベース用のOracleStreams管理ユーザーを作成する

    [source_sys_connection1]をsysdbaとして接続します;

    [source_stream_psw]デフォルトテーブルスペース[stream_ts_name]一時テーブルスペースtempで識別されるユーザー[source_stream_admin]を作成します。 --[source_stream_admin]の9つの役割は、[source_stream_admin]にリソースを付与します。 datapump_imp_full_databaseを[source_stream_admin]に付与します。 imp_full_databaseを[source_stream_admin]に付与します。 datapump_exp_full_databaseを[source_stream_admin]に付与します。 exp_full_databaseを[source_stream_admin]に付与します。 [source_stream_admin]にdbaを付与します。 [source_stream_admin]への接続を許可します。 [source_stream_admin]にaq_administrator_roleを付与します。 select_catalog_roleを[source_stream_admin]に付与します。ユーザーの変更[source_stream_admin]デフォルトの役割リソース、imp_full_database、exp_full_database、dba、connect、aq_administrator_role、select_catalog_role; --[source_stream_admin]の15のシステム権限beginsys.dbms_rule_adm.grant_system_privilege(特権=> sys.dbms_rule_adm.alter_any_rule_set、被付与者=>'[source_stream_admin]'、grant_option => true); end; / beginsys.dbms>'dequeue_any'、grantee =>'[source_stream_admin]'、admin_option => true); end; / beginsys.dbms_rule_adm.grant_system_privilege(privilege => sys.dbms_rule_adm.alter_any_rule、grantee>' true); end; / beginsys.dbms_rule_adm.grant_system_privilege(privilege => sys.dbms_rule_adm.create_rule_obj、grantee =>'[source_stream_admin]'、grant_option => true);end;/無制限のテーブルスペースを[source_stream_admin]に付与します。制限されたセッションを[source_stream_admin]に付与します。 beginsys.dbms_rule_adm.grant_system_privilege(privilege => sys.dbms_rule_adm.execute_any_rule_set、grantee =>'[source_stream_admin]'、grant_option => true); end; / beginsys.dbms_rule_adm.grant_system_pri>'[source_stream_admin]'、grant_option => true); end;/[source_stream_admin]にセッションの作成を許可します。 beginsys.dbms_aqadm.grant_system_privilege(特権=>'enqueue_any'、被付与者=>'[source_stream_admin]'、admin_option => true); end; / beginsys.dbms_rule_adm.grant_system_rule> any _ [source_stream_admin]'、grant_option => true); end; / beginsys.dbms_rule_adm.grant_system_privilege(privilege => sys.dbms_rule_adm.create_any_rule、grantee =>' [source_stream_admin]'、grant_option => true); end; / .grant_system_privilege(privilege => sys.dbms_rule_adm.create_evaluation_context_obj、grantee =>'[source_stream_admin]'、grant_option => true); end; / beginsys.dbms_aqadm.grant_system_privilege( '、admin_option => true); end; / beginsys.dbms_rule_adm.grant_system_privilege(privilege => sys.dbms_rule_adm.create_rule_set_obj、grantee =>' [source_stream_admin]'、grant_option => true); end;
    /

    ステップ-5ターゲットデータベースのStreamsAdminを作成する

    [target_sys_connection]をsysdbaとして接続します;

    ---[target_stream_psw]で識別されるtargetcreateユーザー[target_stream_admin]でsysユーザーとして実行します。 --strmadminの9つの役割は、[target_stream_admin]にリソースを付与します。 datapump_imp_full_databaseを[target_stream_admin]に付与します。 imp_full_databaseを[target_stream_admin]に付与します。 datapump_exp_full_databaseを[target_stream_admin]に付与します。 exp_full_databaseを[target_stream_admin]に付与します。 [target_stream_admin]にdbaを付与します。 [target_stream_admin]への接続を許可します。 aq_administrator_roleを[target_stream_admin]に付与します。 select_catalog_roleを[target_stream_admin]に付与します。ユーザーの変更[target_stream_admin]デフォルトの役割リソース、imp_full_database、exp_full_database、dba、connect、aq_administrator_role、select_catalog_role; --[target_stream_admin]の15のシステム権限beginsys.dbms_rule_adm.grant_system_privilege(特権=> sys.dbms_rule_adm.alter_any_rule_set、被付与者=>'[target_stream_admin]'、grant_option => true); end; / beginsys.dbms>'dequeue_any'、grantee =>'[target_stream_admin]'、admin_option => true); end; / beginsys.dbms_rule_adm.grant_system_privilege(privilege => sys.dbms_rule_adm.alter_any_rule、grantee>'_ true); end; / beginsys.dbms_rule_adm.grant_system_privilege(privilege => sys.dbms_rule_adm.create_rule_obj、grantee =>'[target_stream_admin]'、grant_option => true); end;/[target_stream_admin]に無制限のテーブルスペースを付与します。制限されたセッションを[target_stream_admin]に付与します。 beginsys.dbms_rule_adm.grant_system_privilege(privilege => sys.dbms_rule_adm.execute_any_rule_set、grantee =>'[target_stream_admin]'、grant_option => true); end; / beginsys.dbms_rule_adm.grant_system_pri>'[target_stream_admin]'、grant_option => true); end;/[target_stream_admin]にセッションの作成を許可します。 beginsys.dbms_aqadm.grant_system_privilege(特権=>'enqueue_any'、被付与者=>'[target_stream_admin]'、admin_option => true); end; / beginsys.dbms_rule_adm.grant_system_rule> any _ [target_stream_admin]'、grant_option => true); end; / beginsys.dbms_rule_adm.grant_system_privilege(privilege => sys.dbms_rule_adm.create_any_rule、grantee =>' [target_stream_admin]'、grant_option => true); end; / .grant_system_privilege(privilege => sys.dbms_rule_adm.create_evaluation_context_obj、grantee =>'[target_stream_admin]'、grant_option => true); end; / beginsys.dbms_aqadm.grant_system_privilege ='、admin_option => true); end; / beginsys.dbms_rule_adm.grant_system_privilege(privilege => sys.dbms_rule_adm.create_rule_set_obj、grantee =>' [target_stream_admin]'、grant_option => true); end; /

    ステップ-6ソースデータベースのデータベースリンクの作成

    接続[source_stream_connection]

    ---ターゲットデータベースのリンク...データベースリンクを作成[source_dblink]'[target_connect_string]'を使用して[target_stream_psw]で識別される[target_stream_admin]に接続します。

    ステップ7ターゲットデータベースのデータベースリンクの作成

    接続[target_stream_connection]

    '[source_connect_string]'を使用して[source_stream_psw]で識別される[source_stream_admin]に接続するデータベースリンク[target_dblink]を作成します。

    ステップ8ターゲットデータベースにDatapumbディレクトリを作成する

    接続[target_stream_connection]

    ディレクトリ[target_datapump_dir]を「[target_dir_location]」として作成または置換します。

    ステップ-9ソースデータベースでのキャプチャプロセスの作成

    エコーをオフに設定します。 ---受け入れstrm_pwd_srcプロンプト'ソースでストリーム管理者"strmadmin"のパスワードを入力します:'非表示---受け入れstrm_pwd_destプロンプト'宛先でストリーム管理者"strmadmin"のパスワードを入力します:'hideconnect[source_stream_connection];カーソルvinがselectruleset_nameであることを宣言しますfrom dba_rulesets where owner ='[source_stream_admin]'; begin for i in vin loop begin dbms_rule_adm.drop_rule_set(rule_set_name=>'[source_stream_admin]。'||i.ruleset_name、delete_rules => true);例外他の人がnullになった場合。終わり; end loop; end; / begin dbms_streams_adm.set_up_queue(queue_table =>'"streams_capture_qt"'、queue_name =>'"streams_capture_q"'、queue_user =>'"[source_stream_admin]"'); end; / begin _ dbms =>'"[source_schema]"'、streams_name =>'"streams_propagation1"'、source_queue_name =>'"strmadmin"。"streams_capture_q"'、destination_queue_name =>'"link => true、include_ddl => true、source_database =>'[source_database]'、include_rule => true); end; / commit; begin dbms_streams_adm.add_schema_rules( '、streams_name =>' "streams_capture"'、queue_name =>'"[source_stream_admin]"。"streams_capture_q"'、include_dml> true、include_ddl、 n_rule => true);end;/-各schemacommitに対して上記の2つの手順を繰り返します;カーソルvinが選択されていることを宣言します。>'[source_database]'); end loop; commit; end; /

    ステップ-10ターゲットデータベースでの適用プロセスの作成

    接続[target_stream_connection]

    begin dbms_streams_adm.set_up_queue(queue_table =>'"streams_apply_qt"'、queue_name =>'"streams_apply_q"'、queue_user =>'"[target_stream_admin]"'); end; / begin dbms_streams_adm =] "'、streams_type =>' apply'、streams_name =>'"streams_apply "'、queue_name =>'"[target_stream_admin]"。"streams_apply_q"'、include_q"'、include_dml =true include_rule => true); end; / commit; begin dbms_apply_adm.set_parameter(apply_name =>'streams_apply'、parameter =>'disable_on_error'、value =>'n'); end; / begin dbms_apply_adm Streams_apply'、parameter =>' allow_duplicate_rows'、value =>' y'); end; /

    ステップ-11ターゲットデータベースのインスタンス化

    接続[target_stream_connection]

    serveroutをオンに設定;dbms_output.enable(50000);を実行します。handle1番号を宣言します。 ind番号;パーセント完了数; job_state varchar2(30); le ku $ _logentry; js ku $ _jobstatus; jd ku $ _jobdesc; sts ku $ _status; begin beginexecuteimmediate'ドロップユーザー'||'[source_schema]'|| 'カスケード';例外他の人がnullの場合。終わり; handle1:=dbms_datapump.open('import'、'schema'、'[target_dblink]'); dbms_datapump.add_file(handle1、'streamimport_1349243553109.log'、'[target_datapump_dir]'、''、dbms_datapump.ku $ _file_type_log_file); dbms_datapump.metadata_filter(handle1、'schema_expr'、'in(''[source_schema]'')'); -複数のdbms_datapump.set_parameter(handle1、'include_metadata'、1);の場合は'in(''cdsl11''、''kra'')' dbms_datapump.start_job(handle1);パーセント完了:=0; job_state:='未定義'; while(job_state!='completed')and(job_state!='stopped')loop dbms_datapump.get_status(handle1、dbms_datapump.ku $ _status_job_error + dbms_datapump.ku $ _status_job_status + dbms_datapump.ku $ _status_wip、-1、job_state、sts); js:=sts.job_status; if js.percent_done!=percent_done then dbms_output.put_line('*** jobpercent done ='|| to_char(js.percent_done));パーセント完了:=js.percent_done;次の場合に終了します。 if(bitand(sts.mask、dbms_datapump.ku $ _status_wip)!=0)then le:=sts.wip; else if(bitand(sts.mask、dbms_datapump.ku $ _status_job_error)!=0)then le:=sts.error; else le:=null;次の場合に終了します。次の場合に終了します。 leがnullでない場合、ind:=le.first; indがnullループではない場合dbms_output.put_line(le(ind).logtext); ind:=le.next(ind);ループの終了;次の場合に終了します。ループの終了; dbms_output.put_line('ジョブが完了しました'); dbms_output.put_line('最終的なジョブの状態='|| job_state); dbms_datapump.detach(handle1);end;/connect [source_stream_connection]create or replace trigger ddltrigger   after create on databasedeclare   n   number;begin   if ora_dict_obj_type ='table' and ora_dict_obj_owner ='[source_schema]'   then      begin         select 1           into n           from dba_streams_unsupported          where owner='[source_schema]'およびtable_name=ora_dict_obj_name; if n =1         then            dbms_streams_adm.add_table_rules                                          (table_name           => '[source_schema].'                                                                   || ora_dict_obj_name,                                           streams_type         => 'capture',                                           streams_name         => 'streams_capture',                                           queue_name           => '[source_stream_admin].streams_capture_q',                                           include_dml          => true,                                           include_ddl          => false,                                           inclusion_rule       => false,                                           source_database      => '[source_database]'                                          );次の場合に終了します。例外他の人がnullの場合。終わり; end if; end; /

    ステップ-12argetデータベースでの適用プロセスの開始

    接続[target_stream_connection]

    serveroutをオンに設定します;-インスタンス化番号を取得しますiscn番号を宣言します; beginiscn:=dbms_flashback.get_system_change_number(); dbms_apply_adm.set_schema_instantiation_scn(source_schema_name =>'"[source_schema]"'、source_database_name =>'[source_database]'、instantiation_scn => iscn、recursive; beginselect decode(status、'enabled'、1、0)into v_started from dba_apply where apply_name ='streams_apply'; if(v_started =0)then dbms_apply_adm.start_apply(apply_name =>'"streams_apply"'); end if; end; /

    ステップ-13ソースキャプチャプロセスの開始

    接続[source_stream_connection]

    serveroutをon;declarev_started number; beginselect decode(status、'enabled'、1、0)into v_started from dba_capture where Capture_name ='streams_capture'; if(v_started =0)then dbms_capture_adm.start_capture(capture_name =>'"streams_capture"'); end if; end; /begindbms_output.put_line('***進行状況メッセージ===>ソースデータベースestockでキャプチャプロセスstreams_captureを開始し、宛先データベースでプロセスstreams_applyを正常に適用しました。***'); end; / Yourこれでセットアップが完了しました。steamのセットアップが正しく機能していることを確認するか、ソースデータベース用に作成したストリーム管理者の資格情報を使用してログインして次のコマンドを使用しないでください。

    * V$STREAMS_CAPTUREから*を選択します;

    Select * From DBA_CAPTURE; Select * From DBA_PROPAGATION; Select * From DBA_CAPTURE_PREPARED_TABLES;そして、ターゲットデータベースの場合は、ターゲットデータベースのストリームユーザークレデンシャルでログインして、次のクエリを使用します。

    [DBA_APPLYから*]を選択します;

    Select * From DBA_APPLY_CONFLICT_COLUMNS; Select * From DBA_APPLY_EXECUTE; Select * From DBA_APPLY_ERROR; Select * From DBA_APPLY_PROGRESS; Select * From DBA_APPLY_INSTANTIATED_OBJECTS; Select * From V $ STREAMS_TRANSACTION; Select * From V $ PROPAGATION_RECIVE次のスクリプト:

    接続[target_stream_connection]

    serveroutをon;declarev_started number; beginselect decode(status、'enabled'、1、0)into v_started from dba_apply where apply_name ='streams_apply'; if(v_started =1)then dbms_apply_adm.stop_apply(apply_name =>'"streams_apply"'); end if; end; /ソースデータベースのキャプチャプロセスを停止する場合は、次のプロセスを使用します。

    接続[source_stream_connection]

    serveroutをon;declarev_started number; beginselect decode(status、'enabled'、1、0)into v_started from dba_capture where Capture_name ='streams_capture'; if(v_started =0)then dbms_capture_adm.start_capture(capture_name =>'"streams_capture"'); end if; end; /begindbms_output.put_line('***進行状況メッセージ===>ソースデータベースestockでキャプチャプロセスstreams_captureを開始し、宛先データベースでプロセスstreams_applyを正常に適用しました。***'); end; /

    これらのスクリプトを変更できない場合は、vb.netに基づいてこのユーティリティを購入できます。このリンクを確認してください。OracleReplicationSoftware。

    1. クエリという名前のJPAのIN句で動的パラメータを使用するにはどうすればよいですか?

    2. XMLをCLOB列からXMLType列に変換するときにエラーが発生しました

    3. Oracle10gExpressのホームページが表示されない

    4. MariaDB JSON_QUERY()の説明