วันศุกร์ที่ 27 เมษายน พ.ศ. 2561

Monitor Exadata ด้วย ExaWatcher (GetExaWatcherResults.sh)

ถ้าระบบ Exadata เกิดปัญหาเรื่อง performance เรามีหลายวิธีที่จะ Monitor มันได้และ ExaWatcher เป็นอีก tool นึงที่ช่วย Monitor Exadata ในบทความนี้จะใช้ GetExaWatcherResults.sh script (based on ExaWatcher) ในการเก็บข้อมูลต่างๆออกมาเป็น html ไฟล์เพื่อดูผ่าน Web Browser ได้
GetExaWatcherResults.sh จะได้ข้อมูลเกี่ยวกับ
     - CPU utilization and details
     - IO Summary
     - อื่นๆ

Example:
1. As root, cd /opt/oracle.ExaWatcher



2. Execute สคริปต์เลือกเวลา --from ...  --to ...   --resultdir  </พาธที่เก็บไฟล์ผลลัพท์>



3. สคริปต์จะเก็บข้อมูลต่างๆและ Generate ไฟล์ให้และวางไฟล์ไว้ที่พาธตามพารามิเตอร์ --resultdir ที่เราส่งค่าไป



4. สามารถโหลดไฟล์มา Extract บนเครื่องเราแล้วเข้าโฟลเดอร์ Charts เพื่อดูไฟล์ html ได้เลย


5. เปิดไฟล์ index.html


6. ตัวอย่าง











วันเสาร์ที่ 3 มีนาคม พ.ศ. 2561

ปรับ SQL*PLUS prompt ไปที่ username ที่ใช้ connect

ไปแก้ไขไฟล์ config ที่ ORACLE_HOME/sqlplus/glogin.sql


--
-- Copyright (c) 1988, 2005, Oracle.  All Rights Reserved.
--
-- NAME
--   glogin.sql
--
-- DESCRIPTION
--   SQL*Plus global login "site profile" file
--
--   Add any SQL*Plus commands here that are to be executed when a
--   user starts SQL*Plus, or uses the SQL*Plus CONNECT command.
--
-- USAGE
--   This script is automatically run
--
SET SQLPROMPT "_USER'@'_CONNECT_IDENTIFIER _DATE> " -- Write this



วันพุธที่ 17 มกราคม พ.ศ. 2561

Create Oracle Active Data Guard step by step

ในการสร้าง 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