این راهنما مطابق یک سناریوی واقعی طراحی شده و تمام بخشهای مهمی که معمولاً در آموزشها جا میمانند—از جمله 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;