ในการสร้าง Active Data Guard เราต้องมี Physical Standby Database ก่อนแล้วถึง enable Active Data Guard ได้
Preparation:
ตัวอย่างของบทความนี้เซ็ต Primary Database บน Linux ด้วย parameter ตามด้านล่าง
db_unique_name='linux_un'
db_name='orcl'
เซ็ต Standby Database บน Windows ด้วย parameter ตามด้านล่าง
db_unique_name='windows_un'
db_name='orcl'
1. Install Oracle Database software ที่เครื่อง Standby (ต้องเป็น Version เดียวกันและ EE)
2. Primary Database ต้องเป็น archive log mode
3. Primary Database เป็น force logging mode (SQL> alter database force logging;)
4. สร้าง standby redo log ที่ Primary Database ให้จำนวน size เท่ากับ online redo log และมี group มากกว่า 1 group ถ้าเป็น RAC ก็สร้างเพิ่มอีกเป็น n+1 สำหรับแต่ละ thread
Implementation:
1. เนื่องจากเครื่อง Standby เป็น Windows จึงต้องสร้าง Windows service
oradim -NEW -SID windows -STARTMODE manual -PFILE C:\app\KITTI-SRS\product\11.2.0\dbhome_1\database\init.ora
2. ตัวอย่าง Initialization parameters ของทั้ง Primary และ Standby จะมีที่สำคัญคือ
LOCAL_LISTENER , FAL_SERVER , LOG_ARCHIVE_DEST_1 , LOG_ARCHIVE_DEST_2 , DB_UNIQUE_NAME , INSTANCE_NAME , STANDBY_FILE_MANAGEMENT , DB_FILE_NAME_CONVERT , LOG_FILE_NAME_CONVERT)
Primary Database
*.audit_file_dest='/u01/app/oracle/admin/orcl/adump'
*.audit_trail='db'
*.compatible='11.2.0.4.0'
*.control_files='/u01/app/oracle/oradata/orcl/control01.ctl','/u01/app/oracle/fast_recovery_area/orcl/control02.ctl'
*.db_block_size=8192
*.db_unique_name='linux_un'
*.db_domain=''
*.db_name='orcl'
*.instance_name='linux'
*.local_listener='LISTENER'
*.fal_server='windows' # for switchover purpose
*.log_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES)'
*.log_archive_dest_2='SERVICE=windows LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=windows_un'
*.log_archive_config='DG_CONFIG=(linux_un,windows_un)'
*.log_archive_max_processes=8
*.db_file_name_convert='C:\app\KITTI-SRS\oradata\orcl','/u01/app/oracle/oradata/orcl' # for switchover purpose
*.log_file_name_convert='C:\app\KITTI-SRS\oradata\orcl','/u01/app/oracle/oradata/orcl' # for switchover purpose
*.standby_file_management='AUTO' # for switchover purpose
*.db_recovery_file_dest='/u01/app/oracle/fast_recovery_area'
*.db_recovery_file_dest_size=4385144832
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'
*.log_archive_format='%t_%s_%r.dbf'
*.memory_target=1153433600
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'
Standby Database
*.audit_file_dest='C:\app\KITTI-SRS\admin\orcl\adump'
*.audit_trail='db'
*.compatible='11.2.0.4.0'
*.control_files='C:\app\KITTI-SRS\oradata\orcl\control01.ctl','C:\app\KITTI-SRS\fast_recovery_area\orcl\control02.ctl'
*.db_block_size=8192
*.db_unique_name='windows_un'
*.db_domain=''
*.db_name='orcl'
*.instance_name='windows'
*.fal_server='linux' # for switchover purpose
local_listener='LISTENER'
*.log_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES)'
*.log_archive_dest_2='SERVICE=linux LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=linux_un' # for switchover purpose
*.log_archive_config='DG_CONFIG=(linux_un,windows_un)'
*.log_archive_max_processes=8
*.log_file_name_convert='/u01/app/oracle/oradata/orcl','C:\app\KITTI-SRS\oradata\orcl' # for switchover purpose
*.db_file_name_convert='/u01/app/oracle/oradata/orcl','C:\app\KITTI-SRS\oradata\orcl' # for switchover purpose
*.standby_file_management='AUTO'
*.db_recovery_file_dest='C:\app\KITTI-SRS\fast_recovery_area'
*.db_recovery_file_dest_size=4385144832
*.diagnostic_dest='C:\app\KITTI-SRS'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'
*.log_archive_format='%t_%s_%r.dbf'
*.memory_target=1153433600
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'
Note. db_file_name_convert กับ log_file_name_convert เป็น static parameter ซึ่งต้อง restart database
3. ตั้งค่า Listener เพื่อ enable static service registration เพื่อใช้ในการทำ RMAN duplicate database แบบ active
Primary
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = kittisource)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0.4/dbhome_1)
(PROGRAM = extproc))
(SID_DESC =
(GLOBAL_DBNAME = linux_un)
(SID_NAME = linux)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0.4/dbhome_1)))
ADR_BASE_LISTENER = /u01/app/oracle
Standby
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = KITTISRS)(PORT = 1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = C:\app\KITTI-SRS\product\11.2.0\dbhome_1)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ONLY:C:\app\KITTI-SRS\product\11.2.0\dbhome_1\bin\oraclr11.dll")
)
(SID_DESC =
(GLOBAL_DBNAME = windows_un)
(SID_NAME = windows)
(ORACLE_HOME = C:\app\KITTI-SRS\product\11.2.0\dbhome_1)))
ADR_BASE_LISTENER = C:\app\KITTI-SRS
4. เพิ่ม TNS alias ใน tnsnames.ora เพื่อให้ Primary กับ Standby สามารถ connect ผ่าน TNS alias ได้
(เพิ่ม alias ให้ LISTENER ด้วยเพราะใช้ใน LOCAL_LISTENER parameter)
Primary and Standby
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = KITTISRS)(PORT = 1521))
)
)
linux =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = kittisource)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = linux_un)))
windows =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = KITTISRS)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = windows_un)))
5. ทำการ copy password file จาก Primary ไปที่ Standby แล้วเปลี่ยนชื่อเป็น pwd<sid>.ora
6. เปิด Standby Database เป็น nomount mode และ start listener (ใช้ parameter file ที่เตรียมไว้และควรสร้างและใช้ spfile แทน)
7. เช็คสถานะของ Primary Database (ต้องเป็น open หรือ mount เพื่อทำ RMAN active duplicate)
8. ใช้ RMAN (ที่เครื่อง Primary หรือ Standby ก็ได้) เพื่อ connect ทั้ง Primary และ Standby
9. ใช้คำสั่ง RMAN duplicate เพื่อทำการคัดลอกไฟล์จาก Primary Database เพื่อไปสร้าง Standby Database
Verification:
1. Query จากเครื่อง Standby Database เพื่อตรวจสอบข้อมูลของ DB
2. เช็ค data files
3. เช็ค online redo log files กับ standby redo log files
4. ตรวจสอบว่า redo transport service ทำงานอยู่ไหม (RFS processes running)
Start and Test Active Data Guard:
1. Open database และเปิด Real-time apply
2. ทดลองสร้าง table และ query