システム・トリガーを使用したOracle Databaseサービスの構成

特定のステップを実行すると、トリガーを使用してプライマリOracleデータベースでprimaryroleおよびstandbyroleデータベース・サービスを作成できます。作成後、これらはスタンバイOracleデータベースにレプリケートされます。

  1. プライマリOracleデータベースでprimaryroleおよびstandbyroleデータベース・サービスを作成します。
    exec DBMS_SERVICE.CREATE_SERVICE( 
     service_name => 'primaryrole', 
     network_name => 'primaryrole',
     aq_ha_notifications => true, failover_method => 'BASIC', 
     failover_type => 'SELECT', failover_retries => 180, failover_delay => 1 );
    
    exec DBMS_SERVICE.CREATE_SERVICE( 
     service_name => 'standbyrole', 
     network_name => 'standbyrole',
     aq_ha_notifications => true, failover_method => 'BASIC', 
     failover_type => 'SELECT', failover_retries => 180, failover_delay => 1 );
  2. プライマリOracleデータベースで、データベース起動時のためのprimaryroleおよびstandbyroleトリガーを作成します。
    CREATE OR REPLACE TRIGGER manage_OCIService
    after startup on database
    DECLARE
      role VARCHAR(30);
    BEGIN
      SELECT DATABASE_ROLE INTO role FROM V$DATABASE;
      IF role = 'PRIMARY' THEN
        BEGIN
          DBMS_SERVICE.START_SERVICE('primaryrole');
        EXCEPTION
          WHEN OTHERS THEN
            NULL;
        END;
        BEGIN
          DBMS_SERVICE.STOP_SERVICE('standbyrole');
        EXCEPTION
          WHEN OTHERS THEN
            NULL;
        END;
      ELSE
        BEGIN
          DBMS_SERVICE.STOP_SERVICE('primaryrole');
        EXCEPTION
          WHEN OTHERS THEN
            NULL;
        END;
        BEGIN
          DBMS_SERVICE.START_SERVICE('standbyrole');
        EXCEPTION
          WHEN OTHERS THEN
            NULL;
        END;
      END IF;
    END;
  3. プライマリOracleデータベースで、データベースのロールが変更されたときに実行する次のトリガーを作成します。
    CREATE OR REPLACE TRIGGER manage_OCIService2
    AFTER DB_ROLE_CHANGE ON DATABASE
    DECLARE
      role VARCHAR(30);
    BEGIN
      SELECT DATABASE_ROLE INTO role FROM V$DATABASE;
      IF role = 'PRIMARY' THEN
        BEGIN
          DBMS_SERVICE.START_SERVICE('primaryrole');
        EXCEPTION
          WHEN OTHERS THEN
            NULL;
        END;
        BEGIN
          DBMS_SERVICE.STOP_SERVICE('standbyrole');
        EXCEPTION
          WHEN OTHERS THEN
            NULL;
        END;
      ELSE
        BEGIN
          DBMS_SERVICE.STOP_SERVICE('primaryrole');
        EXCEPTION
          WHEN OTHERS THEN
            NULL;
        END;
        BEGIN
          DBMS_SERVICE.START_SERVICE('standbyrole');
        EXCEPTION
          WHEN OTHERS THEN
            NULL;
        END;
      END IF;
    END;
  4. 適切なtnsnames.oraファイルで接続の別名を追加して、プライマリとスタンバイのOracleデータベースを識別し、それぞれのデータベース・サービス名を指定します。
    primaryinstance=
      (DESCRIPTION_LIST=
        (LOAD_BALANCE=off)
        (FAILOVER=on)
        (DESCRIPTION=(ADDRESS_LIST=(LOAD_BALANCE=on)
               (ADDRESS=(PROTOCOL=TCP)(HOST=myhost1)(PORT=1521)))
                   (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=primaryrole)))
     
        (DESCRIPTION=(ADDRESS_LIST=(LOAD_BALANCE=on)
               (ADDRESS=(PROTOCOL=TCP)(HOST=myhost2)(PORT=1521)))
                   (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=primaryrole))))
     
    standbyinstance=
       (DESCRIPTION_LIST= 
         (LOAD_BALANCE=off)
         (FAILOVER=on)
         (DESCRIPTION=(ADDRESS_LIST=(LOAD_BALANCE=on)
                (ADDRESS=(PROTOCOL=TCP)(HOST=myhost1)(PORT=1521)))
                    (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=standbyrole)))
     
         (DESCRIPTION=(ADDRESS_LIST=(LOAD_BALANCE=on)
                (ADDRESS=(PROTOCOL=TCP)(HOST=myhost2)(PORT=1521)))
                   (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=standbyrole))))
  5. 両方のOracleデータベースを再起動して、トリガーが適切なデータベース・サービスを開始および停止できるようにします。あるいは、Oracleデータベースをどちらも再起動しない場合は、次のようにして各Oracleデータベースで適切なデータベース・サービスを開始および停止できます。

    プライマリOracleデータベースの場合:

    exec DBMS_SERVICE.START_SERVICE('primaryrole');
    exec DBMS_SERVICE.STOP_SERVICE('standbyrole');

    スタンバイOracleデータベースの場合:

    exec DBMS_SERVICE.STOP_SERVICE('primaryrole');
    exec DBMS_SERVICE.START_SERVICE('standbyrole');