تو سناریوی اوراکل دیتاگارد ما یک مدار دیتابیسی تشکیل میدیم که هر وقت سرور اصلی در سایت A از دسترس خارج شد اپلیکیشن با وقفه کوتاهی بتونه به سرور دوم در سایت B متصل بشه (تو سناریو حداکثر پایداری بهتره اپلیکیشن های ریپورت به دیتاگارد متصل نشن و برای سناریو اکتیو دیتاگارد یک دیتاگارد مجزا و مختص به ریپورت به صورت آبشاری راه اندازی بشه که بار روی سرور اصلی هم نباشه)
جهت انجام خودکار این سناریو به طوری که اپلیکیشن به یک سرویس جدا وصل بشه و وابسته به سرویس و IP در هر Instance در مواقع Failover و Switchover نباشه میتونید به شیوه زیر عمل کنید:
ابتدا به Container متصل میشویم
ALTER SESSION SET CONTAINER=CDBMAIN;
با استفاده از Package DBMS_SERVICE سرویس PDBHA را میسازیم
EXEC DBMS_SERVICE.CREATE_SERVICE(SERVICE_NAME => 'PDBHA',NETWORK_NAME => 'PDBHA');
سرویس PDBHA را اجرا میکنیم
EXEC DBMS_SERVICE.START_SERVICE('PDBHA');
جهت اجرا شدن خودکار سرویس PDBHA داخل Container (PDB)، یک Trigger داخل کاربر SYS میسازیم
CREATE OR REPLACE TRIGGER SYS.PDBHA_SERVICE_MAINTENANCE AFTER STARTUP ON DATABASE
BEGIN
IF SYS_CONTEXT('USERENV','DATABASE_ROLE') = 'PHYSICAL STANDBY' THEN
DBMS_SERVICE.STOP_SERVICE('PDBHA');
ELSIF SYS_CONTEXT('USERENV','DATABASE_ROLE') = 'PRIMARY' THEN
DBMS_SERVICE.START_SERVICE('PDBHA');
END IF;
EXCEPTION WHEN OTHERS THEN
NULL;
END;
/
به Container CDB$ROOT متصل میشویم
ALTER SESSION SET CONTAINER=CDB$ROOT;
جهت Open شدن صحیح Container (PDB) در حالت عادی و همچنین هنگام انجام عملیات Switchover و Failover (بر روی پایگاه داده Primary به صورت Read Write و بر روی پایگاه داده Standby به صورت Read Only) دو عدد Trigger داخل کاربر SYS میسازیم
CREATE OR REPLACE TRIGGER SYS.PDB_MODE_STARTUP AFTER STARTUP ON DATABASE
DECLARE
V_OPEN_MODE VARCHAR2(100);
V_OPEN_MODE_PDB VARCHAR2(100);
BEGIN
SELECT OPEN_MODE INTO V_OPEN_MODE FROM V_$DATABASE;
SELECT OPEN_MODE INTO V_OPEN_MODE_PDB FROM V_$PDBS WHERE NAME='PDB';
IF SYS_CONTEXT('USERENV','DATABASE_ROLE') = 'PHYSICAL STANDBY' AND V_OPEN_MODE LIKE 'READ ONLY%' AND V_OPEN_MODE_PDB ='MOUNTED' THEN MODE
EXECUTE IMMEDIATE 'ALTER PLUGGABLE DATABASE PDB OPEN READ ONLY';
ELSIF SYS_CONTEXT('USERENV','DATABASE_ROLE') = 'PRIMARY' AND V_OPEN_MODE = 'READ WRITE' AND V_OPEN_MODE_PDB = 'MOUNTED' THEN
EXECUTE IMMEDIATE 'ALTER PLUGGABLE DATABASE PDB OPEN READ WRITE';
END IF;
EXCEPTION WHEN OTHERS THEN
NULL;
END;
/
CREATE OR REPLACE TRIGGER SYS.PDB_MODE_ROLLCHANGE AFTER DB_ROLE_CHANGE ON DATABASE
DECLARE
V_OPEN_MODE VARCHAR2(100);
V_OPEN_MODE_PDB VARCHAR2(100);
BEGIN
SELECT OPEN_MODE INTO V_OPEN_MODE FROM V_$DATABASE;
SELECT OPEN_MODE INTO V_OPEN_MODE_PDB FROM V_$PDBS WHERE NAME='PDB';
IF SYS_CONTEXT('USERENV','DATABASE_ROLE') = 'PHYSICAL STANDBY' AND V_OPEN_MODE LIKE 'READ ONLY%' AND V_OPEN_MODE_PDB ='MOUNTED'
THEN
EXECUTE IMMEDIATE 'ALTER PLUGGABLE DATABASE PDB OPEN READ ONLY';
ELSIF SYS_CONTEXT('USERENV','DATABASE_ROLE') = 'PRIMARY' AND V_OPEN_MODE = 'READ WRITE' AND V_OPEN_MODE_PDB = 'MOUNTED'
THEN
EXECUTE IMMEDIATE 'ALTER PLUGGABLE DATABASE PDB OPEN READ WRITE';
END IF;
EXCEPTION WHEN OTHERS THEN
NULL;
END;
/
بعد از انجام این مراحل لازم ه برای اپلیکیشن یه connection string مخصوص درست کنیم که بتونیم بدون تغییر در پیکربندی اپلیکیشن به طور خودکار به سرورهای primary بعد از انجام switchover کامل متصل بشیم.
PDBHA =
(DESCRIPTION =
(ADDRESS_LIST =
(FAILOVER = on)
(LOAD_BALANCE = off)
(SOURCE_ROUTE = off)
(ADDRESS =
(PROTOCOL = TCP)
(HOST = 172.16.65.182)
(PORT = 1521)
)
(ADDRESS =
(PROTOCOL = TCP)
(HOST = 172.16.65.183)
(PORT = 1521)
)
)
(CONNECT_DATA =
(FAILOVER_MODE =
(TYPE = session)
(METHOD = basic)
(RETRIES = 10)
(DELAY = 4)
)
(SERVER = dedicated)
(SERVICE_NAME = PDBHA)
)
)
جهت حذف و یا stop سرویس از دستورات زیر می توان استفاده کرد:
EXEC DBMS_SERVICE.DELETE_SERVICE(SERVICE_NAME => 'PDBHA');
EXEC DBMS_SERVICE.STOP_SERVICE(SERVICE_NAME => 'PDBHA');
منابع
https://docs.oracle.com/cd/E11882_01/network.112/e10835/glossary.htm#BGBDGEAD