سلسله آموزش راه‌اندازی Oracle Data Guard 19c از صفر تا Fast Failover قسمت ششم راه اندازی گارد و broker

این راهنما مطابق یک سناریوی واقعی طراحی شده و تمام بخش‌های مهمی که معمولاً در آموزش‌ها جا می‌مانند—از جمله Flashback، static registration، register دیتابیس‌ها با srvctl، تنظیم pwfile، و RedoRoutes—در اینجا به‌صورت کامل پوشش داده شده‌اند.

در این مقاله فقط Data Guard + Broker را پیاده‌سازی می‌کنیم.
موضوعات Fast-Start Failover و Observer در مقاله بعدی توضیح داده می‌شوند.

توپولوژی و اطلاعات محیط

همانطور که در پنج قسمت قبل دیدید، محیط ما به اینصورت راه اندازی شده است و قرار  هست دیتابیس گارد به اینصورت باشد:


Primary Database : vahiddb  
Primary Host     : dc1          (192.168.56.21)
Standby Database : vahiddbdc2  
Standby Host     : dc2          (192.168.56.22)
DB_NAME          : vahiddb
ORACLE_HOME      : /u01/app/oracle/product/19c/dbhome

  • روی dc1 با dbca دیتابیس vahiddb از قبل ساخته شده
  • روی dc2 هنوز دیتابیس نداریم و قرار است Standby بسازیم

پیش‌نیازهای سمت Primary (dc1)

به‌عنوان کاربر oracle:

پارامترهای زیر را در فایل 

/home/oracle/.bash_profile

وارد می کنیم:

 

export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/19c/dbhome
export LD_LIBRARY_PATH=/u01/app/oracle/product/19c/dbhome/lib
export ORACLE_SID=vahiddb
export PATH=$PATH:$ORACLE_HOME/bin

 

پس از ذخیره دستور زیر را برای اعمال آنها می زنیم یا می توانیم session جدیدی باز کنیم.

 

source ~/.bash_profile

سپس با دستور زیر به دیتابیس متصل می شویم.

sqlplus / as sysdba

۲.۱ فعال‌سازی ARCHIVELOG + FORCE LOGGING

SQL> SELECT log_mode FROM v$database;

-- اگر NOARCHIVELOG بود:
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;

-- توصیه اکید:


ALTER DATABASE FORCE LOGGING;

۳. تنظیم پارامترهای Data Guard روی Primary

ALTER SYSTEM SET standby_file_management='AUTO' SCOPE=BOTH;

نکته مهم:
اسم یکتای Primary همان vahiddb می‌ماند.


۴. ساخت Standby Redo Log

تعداد Online Redo Log‌ها هر چند تا بود، یک عدد بیشتر باید standby logfile ساخت و حجم برابر:

اول جستجوی زیر را اجرا می کنیم تا ببینیم وضعیت فعلی ما به چه صورت است:

 select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME     CON_ID
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ --------- ----------
         1          1         13  209715200        512          2 YES INACTIVE               2291719 19-NOV-25      2354140 19-NOV-25          0
         2          1         14  209715200        512          2 YES INACTIVE               2354140 19-NOV-25      2398199 19-NOV-25          0
         3          1         15  209715200        512          2 NO  CURRENT                2398199 19-NOV-25   9.2954E+18                    0

با توجه به اینکه 3 تا داریم، چهار تا می سازیم:

ALTER DATABASE ADD STANDBY LOGFILE GROUP 10 SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 11 SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 12 SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 13 SIZE 200M;

 

 

۵. فعال‌سازی Flashback Database (برای REINSTATE)

این مرحله قبل از هر Failover ضروری است. دقت کنید تنها در صورتی که بخواهید بعد از failover دیتابیس گارد قدیمی به مدار بیاید ، این مرحله را انجام دهید. در مراحل قبل db_recovery_file_dest و db_recovery_file_dest_size  را تنظیم کرده بودیم. اگر این موارد را تنظیم نکرده اید، تنظیم کنید.

SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE FLASHBACK ON;
ALTER DATABASE OPEN;

با دستور زیر عملیات خود را چک می کنیم:

 select FLASHBACK_ON from v$database;

FLASHBACK_ON
------------------
YES

چه حجمی برای Flashback لازم است؟

به‌صورت تجربی:

  • حجم Flashback باید بین ۲× تا ۳× حجم daily redo generation باشد
  • محیط‌های Production معمولاً بین ۳۰GB تا ۲۰۰GB بسته به workload نیاز دارند
  • برای Lab و سناریوی تست: ۵۰GB کاملاً کافی است
اگر Flashback فعال نباشد دستور REINSTATE DATABASE ممکن نمی‌شود و باید Standby از صفر rebuild شود.

 

۶. آماده‌سازی Standby (dc2)

ساخت PFILE از SPFILE اصلی (روی dc1)

روی dc1:

sqlplus / as sysdba
SQL> create pfile='/home/oracle/pfile_for_standby.ora' from spfile;

این فایل شامل تمام پارامترهای دیتابیس primary است و سپس آن را برای standby اصلاح می‌کنیم.


۶.۲ انتقال PFILE به سرور گارد (dc2)

روی dc1:

scp /home/oracle/pfile_for_standby.ora oracle@dc2:/home/oracle/

۶.۳ انتقال Password File دیتابیس اصلی

۱) ابتدا مکان pwfile را روی primary پیدا می‌کنیم

روی dc1:

srvctl config database -db vahiddb

در خروجی:

Password file:

اگر وجود داشت که همان را منتقل می کنیم. در مورد من وجود ندارد.

یعنی هیچ pwfile ثبت نشده است.

پس آن را باید به صورت دستی در ORACLE_HOME/dbs پیدا کنیم:

ls $ORACLE_HOME/dbs/orapw*

اگر وجود داشت، همان را منتقل می‌کنیم.

۲) اگر پیدا نشد، باید ایجاد کنیم:

orapwd file=$ORACLE_HOME/dbs/orapwvahiddb password=MyPass123 entries=10

۳) انتقال به standby:

scp $ORACLE_HOME/dbs/orapwvahiddb oracle@dc2:$ORACLE_HOME/dbs/orapwvahiddbdc2

۶.۴ تنظیم Environment سمت Standby

روی dc2 وارد .bash_profile کاربر oracle شوید:

export ORACLE_SID=vahiddbdc2
export ORACLE_HOME=/u01/app/oracle/product/19c/dbhome
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib

سپس:

source ~/.bash_profile

۶.۵ ویرایش PFILE و تنظیم پارامترهای مخصوص Standby

فایل /home/oracle/pfile_for_standby.ora را باز کنید و موارد زیر را تغییر دهید:

فایل قبل از تغییر:

vahiddb.__data_transfer_cache_size=0                                           --حذف شود
vahiddb.__db_cache_size=2214592512                                             --حذف شود
vahiddb.__inmemory_ext_roarea=0                                                --حذف شود
vahiddb.__inmemory_ext_rwarea=0                                                --حذف شود
vahiddb.__java_pool_size=0                                                     --حذف شود
vahiddb.__large_pool_size=16777216                                             --حذف شود
vahiddb.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment       --حذف شود
vahiddb.__pga_aggregate_target=1006632960                                      --حذف شود
vahiddb.__sga_target=2986344448                                                --حذف شود
vahiddb.__shared_io_pool_size=134217728                                        --حذف شود
vahiddb.__shared_pool_size=603979776                                           --حذف شود
vahiddb.__streams_pool_size=0                                                  --حذف شود
vahiddb.__unified_pga_pool_size=0                                              --حذف شود
*.audit_file_dest='/u01/app/oracle/admin/vahiddb/adump'                        --پوشه /u01/app/oracle/admin/vahiddbdc2/adump در سیستم عامل با کاربر اوراکل ساخته شود
*.audit_trail='db'
*.compatible='19.0.0'
*.control_files='+DATA/VAHIDDB/CONTROLFILE/current.262.1217588201','+DATA/VAHIDDB/CONTROLFILE/current.261.1217588201'     --با پوشه با نام مختص گارد جایگزین شود
*.db_block_size=8192                                                              
*.db_create_file_dest='+DATA'
*.db_name='vahiddb'
*.db_recovery_file_dest='+DATA'
*.db_recovery_file_dest_size=12732m
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=vahiddbXDB)'                            --حذف شود
*.enable_pluggable_database=true
*.local_listener='LISTENER_VAHIDDB'                                            --حذف شود
*.log_archive_format='%t_%s_%r.dbf'
*.nls_language='AMERICAN'
*.nls_territory='AMERICA'
*.open_cursors=300
*.pga_aggregate_target=949m
*.processes=320
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=2847m
*.standby_file_management='AUTO'
*.undo_tablespace='UNDOTBS1'


۱) db_unique_name

برای standby باید مقدار متفاوت باشد:

*.db_unique_name='vahiddbdc2'

Primary همان vahiddb می‌ماند.

اضافه کردن service_name مشابه با دیتابیس اصلی

*.service_names='vahiddb'


۲) مسیر فایل‌ها

چون تو روی ASM کار می‌کنی. اگر در دیتابیس گارد چیز دیگری است، تغییر دهید.

*.db_create_file_dest='+DATA'
*.db_recovery_file_dest='+DATA'
*.db_recovery_file_dest_size=20G   

۳) log_file_name_convert

مثال برای ASM:

*.log_file_name_convert='+DATA/VAHIDDB/','+DATA/VAHIDDBDC2/'
*.db_file_name_convert='+DATA/VAHIDDB/','+DATA/VAHIDDBDC2/'

اگر مسیر ASM شما متفاوت است، آن را اصلاح کنید.

۶) standby_file_management

*.standby_file_management='AUTO'

پس از تغییر:

*.audit_file_dest='/u01/app/oracle/admin/vahiddbdc2/adump'
*.audit_trail='db'
*.compatible='19.0.0'
*.control_files='+DATA/VAHIDDBDC2/CONTROLFILE/current.278.1217810713','+DATA/VAHIDDBDC2/CONTROLFILE/current.289.1217810713'
*.db_block_size=8192
*.db_create_file_dest='+DATA'
*.db_name='vahiddb'
*.db_recovery_file_dest='+DATA'
*.db_recovery_file_dest_size=15g
*.diagnostic_dest='/u01/app/oracle'
*.enable_pluggable_database=true
*.log_archive_format='%t_%s_%r.dbf'
*.nls_language='AMERICAN'
*.nls_territory='AMERICA'
*.open_cursors=300
*.pga_aggregate_target=1554m
*.processes=320
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=4662m
*.standby_file_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.db_unique_name='vahiddbdc2'
*.service_names='vahiddb'
*.log_file_name_convert='+DATA/VAHIDDB/','+DATA/VAHIDDBDC2/'
*.db_file_name_convert='+DATA/VAHIDDB/','+DATA/VAHIDDBDC2/'

۶.۶ ساخت SPFILE از PFILE روی Standby

دیتابیس را با فایلی که ساختیم در حالت nomount بالا می آوریم:

sqlplus / as sysdba

SQL>  startup nomount pfile='/home/oracle/pfile_for_standby.ora';

spfile را از روی pfile میسازیم:

SQL> create spfile='+DATA/VAHIDDBDC2/PARAMETERFILE/spfile.ora'
     from pfile='/home/oracle/pfile_for_standby.ora';

دیتابیس را خاموش می‌کنیم:

SQL> shutdown immediate;

 

۶.۸ ثبت دیتابیس Standby در Clusterware با srvctl

حالا دیتابیس  گارد باید در clusterware ثبت شود. به session ی که oracle_home درست شده است می رویم. کافی است صفحه جدیدی باز کنیم چون در bash_profile گذاشته ایم.

روی dc2:

srvctl add database -db vahiddbdc2 \
 -oraclehome $ORACLE_HOME \
 -spfile +DATA/VAHIDDBDC2/PARAMETERFILE/spfile.ora \
 -pwfile /u01/app/oracle/product/19c/dbhome/dbs/orapwvahiddbdc2 \
 -role PHYSICAL_STANDBY \
 -dbname vahiddb

توضیح پارامترها:

  • -db vahiddbg → نامی که در clusterware برای این دیتابیس ثبت می‌شود
  • -dbname vahiddb → نام واقعی دیتابیس
  • -role PHYSICAL_STANDBY → نقش دیتابیس
  • -spfile و -pwfile → مسیرهای ASM

۶.۹ کنترل نهایی

srvctl config database -db vahiddbdc2

 

خروجی:

Database unique name: vahiddbdc2
Database name: vahiddb
Oracle home: /u01/app/oracle/product/19c/dbhome
Oracle user: oracle
Spfile: +DATA/VAHIDDBDC2/PARAMETERFILE/spfile.ora
Password file: /u01/app/oracle/product/19c/dbhome/dbs/orapwvahiddbdc2
Domain:
Start options: open
Stop options: immediate
Database role: PHYSICAL_STANDBY
Management policy: AUTOMATIC
Disk Groups:
Services:
OSDBA group:
OSOPER group:
Database instance: vahiddbdc2

۷. Static Registration در Listener (هر دو سرور)

در فایل listener.ora هر دو سرور. دقت کنیم چون listener تحت grid infra هست، باید در آن قرار دهیم. یعنی  oraenv را برابر ASM+ بگذاریم.

مانند نمونه زیر:

[oracle@dc1 ~]$ . oraenv
ORACLE_SID = [vahiddb] ? +ASM
The Oracle base remains unchanged with value /u01/app/oracle
[oracle@dc1 ~]$ vi $ORACLE_HOME/network/admin/listener.ora

dc1

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = vahiddb)
      (ORACLE_HOME = /u01/app/oracle/product/19c/dbhome)
      (SID_NAME = vahiddb)
    )
  )

dc2

 

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = vahiddbdc2)
      (ORACLE_HOME = /u01/app/oracle/product/19c/dbhome)
      (SID_NAME = vahiddbdc2)
    )
  )

restart listener:

lsnrctl reload

 

بدون static registration، Broker گاهی در وضعیت ORA-12514 گیر می‌کند.

 

TNS در هر دو دیتابیس در database home در فایل 

$ORACLE_HOME/network/admin/tnsnames.ora

اگر فایل بالا وجود نداشت، آنرا بسازید

به شکل زیر تنظیم شود. احتمالاً در Dc1 که dbca زدیم و دیتابیس ساختیم، vahiddb وجود داشته باشد. دقت کنید که پروتکل ارتباط حتماً از نوع tcp باشد. گاهاً در زمان ساخت دیتابیس با پروتکل ipc ساخته می شود.
مانند حالت زیر
VAHIDDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = IPC)(HOST = dc1)(KEY = LISTENER))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = vahiddb)
    )
  )


در اینصورت آنرا بصورت زیر تصحیح کنید.

 

vahiddb =
 (DESCRIPTION =
  (ADDRESS = (PROTOCOL = TCP)(HOST = dc1.vahiddb.com)(PORT = 1521))
   (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = vahiddb)
   )
 )

vahiddbdc2 =
 (DESCRIPTION =
  (ADDRESS = (PROTOCOL = TCP)(HOST = dc2.vahiddb.com)(PORT = 1521))
   (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = vahidddc2)
      (UR=A)
   )
 )

 

UR=A چیست؟

UR=A = Use Remote Listener for asynchronous connect-time load balancing

 

۹. ساخت Standby با RMAN Active Duplicate

روی dc2: دیتابیس را به حالت nomount می آوریم:

 srvctl start database -d vahiddbdc2 -o nomount

روی dc1:

rman target sys@vahiddb auxiliary sys@vahiddbdc2

خروجی:

 

در RMAN:

run{
allocate auxiliary channel ac1 device type disk;
allocate auxiliary channel ac2 device type disk;
allocate channel c1 device type disk;
allocate channel c2 device type disk;
allocate channel c3 device type disk;
allocate channel c4 device type disk;
DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE DORECOVER NOFILENAMECHECK;
}

۱۰. فعال‌سازی Broker

روی هر دو سرور:

دقت کنید که اگر rac دارید، حتماً در shared storage باید مسیر فایلهای broker هم درست کنید.

ALTER SYSTEM SET dg_broker_start=TRUE SCOPE=BOTH;

۱۰.۱ ساخت Configuration

dgmgrl

connect sys@vahiddb

سپس

CREATE CONFIGURATION dg_vahiddb  AS PRIMARY DATABASE IS vahiddb CONNECT IDENTIFIER IS vahiddb;

ADD DATABASE vahiddbdc2  AS CONNECT IDENTIFIER IS vahiddbdc2   MAINTAINED AS PHYSICAL;

ENABLE CONFIGURATION;

۱۱. تنظیمات مهم Broker (بدون FSFO)

۱۱.۱ فعال کردن Apply

EDIT DATABASE vahiddbdc2 SET STATE='APPLY-ON';

enable configuration;

۱۱.۲ مدیریت فایل‌ها

EDIT DATABASE vahiddbdc2 SET PROPERTY StandbyFileManagement='AUTO';

۱۲. Switchover

VALIDATE DATABASE vahiddb;
VALIDATE DATABASE vahiddbdc2;
SWITCHOVER TO vahiddbdc2;

خروجی:

DGMGRL> switchover to vahiddbdc2;
Performing switchover NOW, please wait...
Operation requires a connection to database "vahiddbdc2"
Connecting ...
Connected to "vahiddbdc2"
Connected as SYSDBA.
New primary database "vahiddbdc2" is opening...
Oracle Clusterware is restarting database "vahiddb" ...
Connected to an idle instance.
Connected to an idle instance.
Connected to an idle instance.
Connected to an idle instance.
Connected to "vahiddb"
Switchover succeeded, new primary is "vahiddbdc2"

اجرای مجدد show configuration:

DGMGRL> show configuration;

Configuration - dg_vahiddb

  Protection Mode: MaxPerformance
  Members:
  vahiddbdc2 - Primary database
    vahiddb    - Physical standby database

Fast-Start Failover:  Disabled

Configuration Status:
SUCCESS   (status updated 55 seconds ago)

۱۳. Failover دستی (Manual Failover)

قبل از Failover باید Flashback فعال باشد. پس از هر دو دیتابیس این موضوع را با جستجو مطمئن می شویم:

 select flashback_on from v$database;


اگر no بود طبق دستورالعمل قبلی همین مقاله آنرا روشن می کنیم

 

 

FAILOVER TO vahiddbdc2;

 

DGMGRL> connect sys@vahiddbdc2
Password:
Connected to "vahiddbdc2"
Connected as SYSDBA.
DGMGRL>  failover to vahiddbdc2;
Performing failover NOW, please wait...
Failover succeeded, new primary is "vahiddbdc2"

۱۴. بازگردانی دیتابیس قبلی با REINSTATE

بعد از بالا آمدن dc1:

SHOW DATABASE vahiddb;

اگر:

ORA-16661: the standby database needs to be reinstated

پس:

REINSTATE DATABASE vahiddb;

 

DGMGRL> REINSTATE DATABASE vahiddb;
Reinstating database "vahiddb", please wait...
Oracle Clusterware is restarting database "vahiddb" ...
Connected to an idle instance.
Connected to an idle instance.
Connected to an idle instance.
Connected to "vahiddb"
Continuing to reinstate database "vahiddb" ...
Reinstatement of database "vahiddb" succeeded

۱۵. چک‌های مهم بعد از راه‌اندازی

SHOW CONFIGURATION;
SHOW DATABASE vahiddb;
SHOW DATABASE vahiddbdc2;