داشتم تست failover و حداکثر پایداری برای اپلیکیشن رو انجام میدادم به دو نکته برخورد کردم.

اولین نکته اینه که شما اگه میخواین تست failover انجام بدید اگه تو دیتابیس primary و standby مکانیزم flashback فعال باشه میتونید بدون راه اندازی کامل standby از اول این کار رو انجام بدید ولی اگه flashback فعال نباشه باید از اول به طور کامل standby جدید راه اندازی بشه. به این مکانیزم REINSTATE گفته میشه

نحوه انجام با broker

ابتدا فعال بودن flashback رو در primary و standby چک میکنیم:

SELECT FLASHBACK_ON FROM V$DATABASE;

برای چک کردن وضعیت بهتره یکباره از دستور show configuration استفاده بکنیم:

DGMGRL> show configuration
Configuration - g90
Protection Mode: MaxAvailability
Members:
tehrang - Primary database
tehran - Physical standby database (disabled)
ORA-16661: the standby database needs to be reinstated
Fast-Start Failover: Disabled
Configuration Status:
SUCCESS (status updated 91 seconds ago)

حالا باید دیتابیس fail شده رو که به مدار و حالت mount ببریم:

SQL> startup mount
ORACLE instance started.
Total System Global Area 4294964072 bytes
Fixed Size 9143144 bytes
Variable Size 2634022912 bytes
Database Buffers 1644167168 bytes
Redo Buffers 7630848 bytes
Database mounted.

سپس با broker به دیتابیس standby وصل بشید و دستور زیر رو بزنید (حتما با یوزر و پسورد sys وصل بشید)

dgmgrl sys/"asd123!"@tns_tehrang
DGMGRL> REINSTATE DATABASE tehran;
Reinstating database "tehran", please wait...
Reinstatement of database "tehran" succeeded

بعد از انجام این مرحله یکبار show configuration میگیریم.

DGMGRL> show configuration
Configuration - g90
Protection Mode: MaxAvailability
Members:
tehrang - Primary database
Warning: ORA-16629: database reports a different protection level from the protection mode
tehran - Physical standby database
Fast-Start Failover: Disabled
Configuration Status:
WARNING (status updated 39 seconds ago)

نکته: اگه با خطای ORA-16629 مواجه شدید و از دیتابیس 19.12 استفاده میکنید تمام مراحلی رفع این خطا در اینترنت رو skip کنید.

خطایی که ممکنه بعد از failover پیش بیاد تو این نسخه دیتابیس هنوز حل نشده دلیل این خطا اینه که PROTECTION_LEVEL بعد از failover روی حالت resynchronization میمونه و حتی با switchlog جندباره هم برطرف نمیشه!!

[oracle@tehrandbg ~]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Mon Nov 1 15:18:03 2021
Version 19.12.0.0.0
Copyright (c) 1982, 2021, Oracle. All rights reserved.

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.12.0.0.0

SQL> select protection_mode,protection_level from v$database;
PROTECTION_MODE PROTECTION_LEVEL
-------------------- --------------------
MAXIMUM AVAILABILITY RESYNCHRONIZATION

برای حل این خطا کافیه دیتابیس رو به حالت MaxPerformance ببریم

DGMGRL> EDIT CONFIGURATION SET PROTECTION MODE MaxPerformance;

و بعد یکبار switchover کنیم

DGMGRL> switchover to tehran
Performing switchover NOW, please wait...
Operation requires a connection to database "tehran"
Connecting ...
Connected to "TEHRAN"
Connected as SYSDBA.
New primary database "tehran" is opening...
Operation requires start up of instance "TEHRAN" on database "tehrang"
Starting instance "TEHRAN"...
Connected to an idle instance.
ORACLE instance started.
Connected to "TEHRANG"
Database mounted.
Database opened.
Connected to "TEHRANG"
Switchover succeeded, new primary is "tehran"

DGMGRL> EDIT CONFIGURATION SET PROTECTION MODE MaxAvailability;
Succeeded.

بعد از سوییچ دوباره میتونیم دیتابیس رو به حالت MaxAvailability ببریم.

DGMGRL> EDIT CONFIGURATION SET PROTECTION MODE MaxAvailability;
Succeeded.

و پارامتر LogXptMode رو دوباره تنظیم کنیم:

DGMGRL> edit database 'tehran' set property LogXptMode='SYNC';
Property "logxptmode" updated
DGMGRL> edit database 'tehrang' set property LogXptMode='SYNC';
Property "logxptmode" updated

حالا اگه کوئری بگیرید همه چیز درسته

SQL> select protection_mode,protection_level from v$database;
PROTECTION_MODE      PROTECTION_LEVEL
-------------------- --------------------
MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY

DGMGRL> show configuration

Configuration - g90
Protection Mode: MaxAvailability
Members:
tehran - Primary database
tehrang - Physical standby database
Fast-Start Failover: Disabled
Configuration Status:
SUCCESS (status updated 27 seconds ago)

نحوه انجام دستی

همین کاری که با broker انجام دادیم رو میتونیم به صورت دستی هم انجام بدیم:

اولین قدم این ه شماره SCN دیتابیس primary جدید (همون standby قدیمی که روش دستور failover زدیم) رو بعد از اینکه تبدیل به primary شد پیدا کنیم:

SELECT TO_CHAR(STANDBY_BECAME_PRIMARY_SCN) FROM V$DATABASE;

بعد باید بیایم تو سرور primary قدیمی که میخواین standby جدیدمون باشه و دستورات زیر رو میزنیم:

STARTUP MOUNT;
FLASHBACK DATABASE TO SCN <SCN-10>;
ALTER DATABASE CONVERT TO PHYSICAL STANDBY;
SHUT IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;

تمام

SELECT NAME,DB_UNIQUE_NAME,OPEN_MODE,DATABASE_ROLE FROM V$DATABASE;
SELECT CLIENT_PROCESS, PROCESS, THREAD#, SEQUENCE#, STATUS FROM V$MANAGED_STANDBY WHERE CLIENT_PROCESS='LGWR' OR PROCESS='MRP0';