Oracle

為 Oracle Dataguard 設置偵聽器

  • November 16, 2017

我設置了 Oracle 12c Dataguard 配置。為了建構備用數據庫,我使用了 RMAN DUPLICATE 命令,該命令需要靜態偵聽器配置。

HOSTNAMEA 和 HOSTNAMEB 上的 tnsname.ora 相同:

BR =   (DESCRIPTION =
   (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = HOSTNAMEA)(PORT = 1521))
   )
   (CONNECT_DATA =
     (SID = BR)
   )   )

BR_STBY =   (DESCRIPTION =
   (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = HOSTNAMEB)(PORT = 1521))
   )
   (CONNECT_DATA =
     (SID = BR)
   )   )

listener.ora 主機名:

   SID_LIST_LISTENER =
       (SID_DESC =
         (GLOBAL_DBNAME = BR_DGMGRL)
         (ORACLE_HOME = /opt/oracle/product/12200/dbhome_1)
         (SID_NAME = BR)
       )

   LISTENER =
     (DESCRIPTION_LIST =
       (DESCRIPTION =
         (ADDRESS = (PROTOCOL = TCP)(HOST = HOSTNAMEA)(PORT = 1521))
         (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
       )
 )

listener.ora 主機名B:

SID_LIST_LISTENER =
   (SID_DESC =
     (GLOBAL_DBNAME = BR_STDBY_DGMGRL)
     (ORACLE_HOME = /opt/oracle/product/12200/dbhome_1)
     (SID_NAME = BR)
   )

LISTENER =
 (DESCRIPTION_LIST =
   (DESCRIPTION =
     (ADDRESS = (PROTOCOL = TCP)(HOST = HOSTNAMEB)(PORT = 1521))
     (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
   )
 )

此配置使用靜態偵聽器配置。例如,應用程序如何知道數據庫已從 HOSTNAMEA 切換到 HOSTNAMEB?我應該使用動態偵聽器註冊嗎?配置應該如何?

您應該在客戶端電腦中有一個 TNS 條目,類似於以下連接到數據保護環境。

BR =
 (DESCRIPTION =
   (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = HOSTA)(PORT = 1521))
     (ADDRESS = (PROTOCOL = TCP)(HOST = HOSTB)(PORT = 1521))
   )
   (CONNECT_DATA =
     (SERVICE_NAME = BR)
   )
 )

BR_STBY =
 (DESCRIPTION =
   (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = HOSTA)(PORT = 1521))
     (ADDRESS = (PROTOCOL = TCP)(HOST = HOSTB)(PORT = 1521))
   )
   (CONNECT_DATA =
     (SERVICE_NAME = BR_STBY)
   )
 )

您還應該根據他們的角色主要或備用配置數據庫服務,如下所示(如果您使用的是網格基礎架構)。

srvctl add service -d BR  -s BR -l PRIMARY -m BASIC -e SELECT -w 1 -z 180 
srvctl add service -d BR  -s BR_STBY -l PHYSICAL_STANDBY –m BASIC –e SELECT –w 1 –z 180
srvctl start service -s BR -s BR

如果您沒有使用網格基礎設施,那麼(主要的 AS SYSDBA)-

SQL>exec dbms_service.create_service(service_name => 'BR', network_name => 'BR', failover_method => 'BASIC', failover_type => 'SELECT', failover_retries => 10, failover_delay => 1);
SQL> exec dbms_service.create_service(service_name => 'BR_STBY', network_name => 'BR_STBY', failover_method => 'BASIC', failover_type => 'SELECT', failover_retries => 10, failover_delay => 1);
SQL> create or replace trigger MANAGE_SERVICES
 after startup on database
declare
 db_role varchar2(16);
 db_mode varchar2(20);
begin
 select database_role, open_mode into db_role, db_mode from v$database;
 if db_role = 'PRIMARY' then
   dbms_service.start_service('BR');
   dbms_service.stop_service('BR_STBY');
 elsif (db_role = 'PHYSICAL STANDBY') and (db_mode = 'READ ONLY') then
   dbms_service.start_service('BR_STBY');
   dbms_service.stop_service('BR');
 else
   dbms_service.stop_service('BR');
   dbms_service.stop_service('BR_STBY');
 end if;
end;
/
SQL>

根據您的需要修改上述範例中使用的屬性,詳細資訊請參閱 Oracle 文件。

引用自:https://dba.stackexchange.com/questions/191061