วันพุธที่ 3 ธันวาคม พ.ศ. 2557

ORA-00119 & ORA-00132

ช่วยด้วยครับ ต้องเช็คอะไรตรงไหนอีก
[oracle@PHOEBEORCLDB01 admin]$ sqlplus "/as sysdba"
SQL*Plus: Release 11.2.0.1.0 Production on Wed Dec 3 15:21:54 2014
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to an idle instance.
SQL>
SQL>
SQL>
SQL>
SQL> startup
ORA-00119: invalid specification for system parameter LOCAL_LISTENER
ORA-00132: syntax error or unresolved network name 'LISTENER_WRKLGHT'

2014/12/03(Wed)
16:22 Gade รบกวนทุกท่านดูให้น้องตั้มด้วยค่ะ  เนื่องจากเป็น V.11.2  เกตุเลยไม่แน่ใจ
16:22 Gade SQL> startup
ORA-00119: invalid specification for system parameter LOCAL_LISTENER
ORA-00132: syntax error or unresolved network name 'LISTENER_WRKLGHT'
16:23 Gade init.ora.txt
16:23 Gade init.ora.txt
16:23 Gade listener.ora.txt
16:23 Gade listener.ora.txt
16:23 Gade tnsnames.ora.txt
16:23 Gade tnsnames.ora.txt
16:23 Yok sansa ชื่อ listener ใน spfile มันผิดป่าวคะ
16:24 Puinun ตรงไหนครับ
16:24 Yok sansa ใน spfile ของ db
16:25 Yok sansa อ่อๆ เป็น dispatcher หรอ
16:25 Puinun มันมันหลาย instance แนะครับ
16:26 Yok sansa แต่มันรวมใน listener ตัวเดียวกัน
16:26 Puinun ครับ
16:27 Gade http://myotragusbalearicus.wordpress.com/2013/02/13/oracle-11g-release-2ora-00119-invalid-specification-for-system-parameter-local_listener/
16:28 Gade มันมีเรื่อง .world คือไร  งงเลย
16:29 Pitchayasak Spfile?
16:29 Pitchayasak ที่ส่งมามัน pfile
16:29 Gade น้องตั้ม  เบส start ด้วย pfile หรือ spfile พอรู้ไหมค่ะ
16:33 Puinun แน่จะ pfile ป่ะครับ
16:33 Pitchayasak ไม่ใช่ file ที่ส่งมา
16:34 Pitchayasak Init WRKGHT.ora
16:34 Pitchayasak ต้องอันนี้
16:35 Puinun มันอยู่ใน dbs/spfilexxxx
16:35 Puinun ป่าวครับ
16:35 Pitchayasak ใช่
16:36 Puinun มันเป็นไฟล์ binary ป่าวครับ
16:36 Pitchayasak ใช่
16:36 Yok sansa  ใช่ๆ 
16:37 Pitchayasak ส่งมา
16:37 Yok sansa มันสั่ง create pfile from spfile ได้ แต่ไม่ชัวร์ว่าทำตอนที่ db ไม่ได้ start ได้มั้ย
16:40 Puinun ส่งเมล์มให้พีาเกดแล้วครับ
16:40 Puinun ส่งให้คนอีกไหมครับ
16:40 Puinun ขอเมลล์ด้วยคับ
16:41 Gade spfileWRKLGHT.ora
16:41 Gade spfileWRKLGHT.ora
16:41 Pitchayasak แก้เป็น .txt หน่อย
16:41 Pitchayasak มือถือเปิดไม่ได้
16:42 Gade spfileWRKLGHT.txt
16:42 Gade spfileWRKLGHT.txt
16:45 Pitchayasak Upgrade DB ด้วย DBUA ?
16:45 Puinun ไม่ครับ
16:46 Pitchayasak http://pavandba.com/tag/ora-00132-syntax-error-or-unresolved-network-name-listener_proddb1/
16:46 Pitchayasak เช็คตามนี้ก่อน
16:49 Pitchayasak มันแปลกๆ
16:49 Pitchayasak Spfile ไม่มีคำว่า local_listener
16:50 Puinun ไปเจอเว็ปนึงบอกให้ลบครับ
16:50 Pitchayasak ลบแล้ว start ได้มั้ย
16:51 Puinun ไม่ได้ครับ
16:51 Pitchayasak Error ว่า
16:51 Puinun SQL> startup
ORA-00119: invalid specification for system parameter LOCAL_LISTENER
ORA-00132: syntax error or unresolved network name 'LISTENER_WRKLGHT'
16:52 Yok sansa แต่ใน spfile มันไม่มี parameter นี้แล้วนิ
16:52 Yok sansa ลอง start ด้วยการระบุ path ของ spfile ได้มั้ย
16:53 Puinun ขอsyntex หน่อยครับ
16:55 Pitchayasak เอาไฟล์ที่เกตุแก้มาไปไว้ที่ /tmp
16:56 Puinun ครับ
16:56 Pitchayasak Startup pfile=/tmp/spxxx.txt
16:57 Yok sansa 55 ตามนั้น
16:58 Gade เกตุยังไม่ได้ทำไรเลยพี่เต้  -*-
16:58 Gade ไม่กล้าแนะนำ  เดียวมั่ว  55   11.2
17:01 Puinun Start ได้อ่ะครับ
17:01 Pitchayasak ก็แค่นั้น
17:01 Puinun สตื๊กเกอร์
17:01 Pitchayasak Stop ก่อน
17:01 Yok sansa งั้นแปลว่าตอนนั้นมันไปอ่าน spfile ที่อื่น
17:01 Puinun แต่ทำไมstart แบบไม่ระบุ path ไม่ได้
17:01 Yok sansa ไม่ใช่ file นี้อ่ะซิ
17:02 Pitchayasak cp spfile ใน dbs ออกมา แล้ว rm ของเก่า
17:02 Pitchayasak อย่า mv
17:02 Puinun ครับ
17:03 Pitchayasak หา initWRKGHT.ora แล้วทำแบบเดียวกัน
17:04 Puinun ให้ cp initWRKGHT.ora ไปที่ dbs หรอครับ
17:04 Pitchayasak Start ใหม่ จนกว่าจะ errer ว่า หา pfile ไม่เจอ
17:05 Pitchayasak เอาออกมา
17:05 Pitchayasak เอา init ออกมา
17:05 Puinun ครับ ออกมาแล้วครับ
17:06 Pitchayasak Start ใหม่ จนกว่าจะ errer ว่า หา pfile ไม่เจอ
17:06 Puinun Start แล้วมาบอกหาไฟล์ไม่เจอแล้วครับ
17:07 Pitchayasak แล้วเอา spfile ใหม่ไปวางหรือ ลบ local_listener จาก init
17:07 Puinun รูปภาพ
17:08 Puinun ตัวใหม่?
17:08 Puinun จากไหนครับ
17:08 Pitchayasak แก้ชื่อใน /tmp ให้เป็น sp
17:10 Puinun แก้ initWRKLGHT. > spfileWRKLGHT
17:10 Puinun ใช่ไหมครับ
17:11 Pitchayasak ต้วที่ start สำเร็จน่ะ
17:12 Puinun แล้วต้องแก้ให้จาก .txt เป็น .ora ไหมครับ
17:12 Pitchayasak ใช่ แก้ด้วย
17:15 Puinun Start. ปกติได้แล้วครับ
17:15 Puinun มันเกิดจากอะไรครับ
17:15 Pitchayasak จบ
17:16 Puinun ขอบคุณมากนะครับทุกท่าน


สาเหตุและวิธีป้องกันปัญหา

ปัญหามาจากการที่ oracle พยายามจะ startup ด้วย parameter file ซึ่งมีปัญหาว่ามีคำสั่ง local_listener ถูกเรียกใช้งาน แต่ไม่มีค่านี้ใน spfile และ pfile

สิ่งที่ผิดปกติในกรณีนี้ก็คือไม่ควรมี spfile และ pfile ในเวลาเดียวกัน จะทำให้สับสนในการ startup databse ได้ว่าตกลงอันใหนคืออันจริงที่ใช้งาน
สิ่งผิดปกติถัดไปก็คือมี parameter local_listener ที่ไม่ควรจะมี และทำให้ใช้งานไม่ได้

การแก้ไขเบื้องต้นคือ backup pfile/spfile ออกมา แล้ว delete ของเก่าทิ้งทั้งหมดจนกว่าจะ error ว่าหา pfile ไม่เจอ จากนั้นจึงเลือกไฟล์ที่ถูกต้องนำมาแก้ไขและเปิดใช้เป็น spfile ตัวจริง

Appendix
1. ควรสร้าง job backup ตั้ง schedule อย่างต่ำ monthly เพื่อจะได้มีเก็บเอาไว้ว่า pfile หรือ spfile ที่ใช้งานได้
2. ตรวจสอบ $ORACLE_HOME/dbs สม่ำเสมอ อย่าให้มีอะไรแปลกอยู่ในนั้นโดยไม่ได้ตั้งใจ (ไม่ควรมี spfile และ pfile ในเวลาเดียวกัน ยกเว้น pfile ทำ link ไป spfile)

Refference : http://www.dba-oracle.com/concepts/pfile_spfile.htm

วันเสาร์ที่ 4 ตุลาคม พ.ศ. 2557

Oracle DBA Lab TH [EP.6]

พื้นฐานการ Backup และ Restore ฐานข้อมูล Oracle (ต่อ)
1. Incremental Backup and Restore
2. Database Point-In-Time Recovery
3. การสร้างบริหารจัดการ RMAN Catalog เบื้องต้น



วันจันทร์ที่ 29 กันยายน พ.ศ. 2557

Oracle DBA Lab TH [EP.5]

พื้นฐานการ Backup และ Restore ฐานข้อมูล Oracle (ต่อ)
1. การทำงานกับ Oracle database บน Linux เบื้องต้น
2. การใช้งาน RMAN บน Linux เบื้องต้น
3. การสร้าง RMAN Catalog
4. การทำงานแบบ catalog
- backup to disk
- restore from disk



วันศุกร์ที่ 26 กันยายน พ.ศ. 2557

Oracle DBA Lab TH [EP.4]

พื้นฐานการติดตั้ง Oracle Database บน Linux

เอกสารประกอบการทำ LAB ติดตั้ง Oracle Database 12c Release 1 (12.1) บน Oracle Linux 7 (OL7)
http://www.oracle-base.com/articles/12c/oracle-db-12cr1-installation-on-oracle-linux-7.php

1.ติดตั้ง Oracle Linux 7 64 bit บน VMware
2.ติดตั้ง Oracle Database 12c Release 1
3.สร้าง EMPTY CONTAINER DATABASE



วันจันทร์ที่ 22 กันยายน พ.ศ. 2557

Oracle DBA Lab TH [EP.3]

พื้นฐานการ Backup และ Restore ฐานข้อมูล Oracle
1. การเปิดใช้งาน archivelog
2. การ copy online datafile ด้วยการ set tablespaces เป็น backup mode
3. การใช้งาน RMAN เบื้องต้น
4. การทำงานแบบ nocatalog
  - backup to disk
  - restore from disk



วันศุกร์ที่ 19 กันยายน พ.ศ. 2557

Oracle DBA Lab TH [EP.2]

- แก้ไขปัญหา DB Console ไม่สามารถใช้งานได้
- การทำ Cold/Offline Backup database เบื้องต้น
- การทดสอบลบ datafile และทำการ recovery เบื้องต้น
- การใช้งาน export/import เบื้องต้น
- การใช้งาน datapump เบื้องต้น


วันพฤหัสบดีที่ 18 กันยายน พ.ศ. 2557

Oracle DBA Lab TH [EP.1]

- ติดตั้งระบบฐานข้อมูล Oracle 11g บน Windows XP
- ทดสอบและแก้ไข LISTENER
- ตรวจสอบการใช้งานฐานข้อมูลที่ติดตั้งสำเร็จแล้ว


วันอังคารที่ 28 มกราคม พ.ศ. 2557

CactiOracle Version 0.1

This script is Cacti templates and PHP scripts created for query performance statistics data from ORACLE 11gR2 database.

Download here ====> CactiOracle v 0.1 rev1.zip

Update to revision 1 (31 Jan 2014)
- fixed missing PHP scripts files.
- Add tutorial to create Data Input Methods

Post-Installation requirement
1.Data input field in graph title. http://forums.cacti.net/viewtopic.php?f=5&t=42802
2.Target database
     2.1 Create user 'cacti' password 'cacti' (If not use 'cacti', must change in step datasources/graph create)
     2.2 SQL> grant select any dictionary to cacti;

Installation
1.Import host templates from zip files.
2.Update your Oracle client environment in every PHP scripts files.
putenv("ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1");
putenv("TNS_ADMIN=/u01/app/oracle/product/11.2.0/db_1/network/admin");
3.Create Data Input Methods from PHP scripts.
4.Add Devices and select Host Template to ORACLE Database Monitoring.
5.Create Graph from templates.


Step to create Data Input Methods
1. Oracle Sessions Monitor
Input String =  <path_cacti>/scripts/ss_oracle_sessions.php ss_oracle_sessions <tnsnames> <user> <password>

2. Oracle Tablespaces Monitor
Input String =  <path_cacti>/scripts/ss_oracle_tbls.php ss_oracle_tbls <tnsnames> <user> <password> <tablespace_name>

3. Oracle Shared pool free
Input String =  <path_cacti>/scripts/ss_oracle_shared_pool_free.php ss_oracle_shared_pool_free <tnsnames> <user> <password>

4. Oracle system waited events
Input String =  <path_cacti>/scripts/ss_oracle_waits.php ss_oracle_waits <tnsnames> <user> <password>


5. Oracle Physicals I/O
Input String =  <path_cacti>/scripts/ss_oracle_phyio.php ss_oracle_phyio <tnsnames> <user> <password>

6. Oracle Buffer Hit Ratio
Input String =  <path_cacti>/scripts/ss_oracle_bhitratio.php ss_oracle_bhitratio <tnsnames> <user> <password>

7. Oracle Archived log switch
Input String =  <path_cacti>/scripts/ss_oracle_arcs.php ss_oracle_arcs <tnsnames> <user> <password>


example graph


If you have any question or request new ORACLE graph/template please contact me at   pitchayasak.s@gmail.com

วันจันทร์ที่ 13 มกราคม พ.ศ. 2557

Cacti + ORACLE ตอนที่ 4: Multiple output และ Data input field in graph title

ความเดิมตอนที่แล้วเราสามารถสร้างกราฟได้แล้ว ในบทนี้จะเพิ่มเิติมถึงการกำหนด title ของกราฟให้อ่านง่ายและสามารถรู้ว่ากราฟนี้เป็นหัวข้อใด มาจาก server ใหนและ Instance ชื่ออะไร รวมถึงตัวอย่างการรับค่าจาก Data Input Method แบบหลาย output ในครั้งเดียว และนำมาสร้างกราฟที่แสดงข้อมูลหลายชนิดพร้อมๆักัน

Data input field in graph title
เริ่มจาก download และติดตั้งตามตัวอย่างจาก Link นี้
http://forums.cacti.net/viewtopic.php?f=5&t=42802

1. Place 'addon_data_input_field.php' at 'cacti/lib/' directory
2. Modify get_graph_title() in 'cacti/lib/functions.php' as follows:
function get_graph_title($local_graph_id) {
        global $config;
        include_once($config["library_path"] . "/addon_data_input_field.php");

        $graph = db_fetch_row("select
                graph_local.host_id,
                graph_local.snmp_query_id,
                graph_local.snmp_index,
                graph_templates_graph.title
                from (graph_templates_graph,graph_local)
                where graph_templates_graph.local_graph_id=graph_local.id
                and graph_local.id=$local_graph_id");

        if ((strstr($graph["title"], "|")) && (!empty($graph["host_id"]))) {
                $graph["title"] = substitute_data_input_field($graph["title"], $graph["host_id"], $local_graph_id);
                return expand_title($graph["host_id"], $graph["snmp_query_id"], $graph["snmp_index"], $graph["title"]);
        }else{
                return $graph["title"];
        }
}

Multiple Output
ตัวอย่างนี้จะเป็นการสร้างกราฟ Tablespace usage monitor

1.ให้สร้าง Data Input Method ใหม่ชื่อว่า Oracle Tablespaces Monitor ดังรูป

2.สร้างสคริปท์ ss_oracle_tbls.php ที่ path <path_cacti>/scripts
<?
/* do NOT run this script through a web browser */
if (!isset($_SERVER["argv"][0]) || isset($_SERVER['REQUEST_METHOD'])  || isset($_SERVER['REMOTE_ADDR'])) {
   die("<br><strong>This script is only meant to run at the command line.</strong>");
}

/* display No errors */
error_reporting(0);

if (!isset($called_by_script_server)) {
        array_shift($_SERVER["argv"]);

        print call_user_func_array("ss_oracle_tbls", $_SERVER["argv"])."\n";
}

function ss_oracle_tbls ($tnsnames, $sql_path, $username, $password,$tablespacename) {

        putenv("ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1");
        putenv("TNS_ADMIN=/u01/app/oracle/product/11.2.0/db_1/network/admin");

        $ret = '';

        $gdb_conn = ocilogon($username, $password,$tnsnames);

        $gdb_statement = OCIParse ($gdb_conn, "alter session set nls_date_format='MM/DD/YYYY HH24:MI:SS' ");
        OCIExecute ($gdb_statement);

        if (! OCIExecute($gdb_statement)){
                        return;
        }

        include $sql_path;

        $gdb_statement = OCIParse ($gdb_conn, $query);
        OCIExecute ($gdb_statement);

        while (OCIFetchInto ($gdb_statement, $row, OCI_RETURN_NULLS + OCI_ASSOC)) {
                reset($row);

                $tbls_current=$row['CURR'];
                                $tbls_free=$row['FREE'];
                                $tbls_total=$row['TOTAL'];
                                $tbls_curr_percent=$row['CURRENT_PERCENT'];

        }

        OCIFreeStatement($gdb_statement);

        $ret .= 'current:'.$tbls_current.' current_percent:'.$tbls_curr_percent.' free:'.$tbls_free.' total:'.$tbls_total.' ';

        return trim($ret);
}
?>

3.สร้างสคริปท์ tablespace_usage.php ที่ path <path_cacti>/sql
<?

$query = " SELECT DISTINCT
         a.tablespace_name,
         (SUM (a.bytes) / 1024 / 1024 - ROUND (c.free / 1024 / 1024)) curr,
         (  SUM (DECODE (b.maxextend,
                         NULL, a.bytes / 1024 / 1024,
                           b.maxextend
                         * (SELECT VALUE
                              FROM v\$parameter
                             WHERE name = 'db_block_size')
                         / 1024
                         / 1024))
          - (SUM (a.bytes) / 1024 / 1024 - ROUND (c.Free / 1024 / 1024)))
            free,
         SUM (DECODE (b.maxextend,
                      NULL, a.bytes / 1024 / 1024,
                        b.maxextend
                      * (SELECT VALUE
                           FROM v\$parameter
                          WHERE name = 'db_block_size')
                      / 1024
                      / 1024))
            total,
         ROUND (  100
                * (SUM (a.bytes) / 1024 / 1024 - ROUND (c.free / 1024 / 1024))
                / (SUM (DECODE (b.maxextend,
                                NULL, a.bytes / 1024 / 1024,
                                  b.maxextend
                                * (SELECT VALUE
                                     FROM v\$parameter
                                    WHERE name = 'db_block_size')
                                / 1024
                                / 1024))))
            current_percent
    FROM dba_data_files a,
         sys.filext$ b,
         (  SELECT d.tablespace_name, SUM (NVL (c.bytes, 0)) free
              FROM dba_tablespaces d, dba_free_space c
             WHERE d.tablespace_name = c.tablespace_name(+)
          GROUP BY d.tablespace_name) c
   WHERE     a.file_id = b.file#(+)
         AND a.tablespace_name = c.tablespace_name
         AND a.tablespace_name = UPPER ('$tablespacename')
GROUP BY a.tablespace_name, c.free / 1024 ";

?>

4.สร้าง Data templates และ Graph templates ดังนี้
กดไปตาม Link จนถึงหน้า download จากนั้นนำไป import ยังระบบ Cacti ของท่าน
tablespace_data_template.xml
tablespace_graph_template.xml

เมื่อเปิดดู Data Templates จะเห็นว่ามีการสร้าง Internal Data Source Name มาเท่ากับ output จากสคริปท์ PHP

5. เปิดดุ Graph Templates จะเห็นว่าที่ช่อง title จะมีการใส่ parameter เข้าไปเพื่อให้แสดงว่ากราฟนี้มีข้อมูลมาจาก input อย่างไรบ้าง
|host_description|/|input_tnsnames| - Tablespace - |input_tablespace_name|

6. เปิดเมนู Management -> Data Sources แล้ว Click ที่ Add

ใส่ข้อมูล Data Source Fields -> Name ดังนี้
|host_description| - Tablespace - |input_tnsnames| : |input_tablespace_name|

7.กำหนด SQL script path ให้ตรงกับไฟล์ Tablespace_usage.php

8.เปิดเมนุ Management -> Graph Management แล้ว Click ที่ Add

เมื่อกำหนดค่าตามที่ต้องการแล้วให้กดที่ Save

หลักจากนั้นเมื่อเปิดดูรูปจะสังเกตูเห็นว่ามีข้อมูลแสดงที่ Title ออกมาอย่างครบถ้วนและข้อมูลของกราฟสามารถแสดงรายละเีอียดจากหลาย output ได้แล้ว


หมายเหตุ
จากตัวอย่างจะเป็นการ Monitor Tablespace usage ที่ไม่ได้ใช้ระบบ Auto-Extend เราจึงสังเกตุแค่ค่า Max หรือ Total space ว่ามีค่า used และ free เท่าใหร่ โดยไม่ได้สนใจว่าพร้อมสำหรับขยายอย่างไร การทำแบบนี้เป็นที่นิยมในระบบส่วนใหญ่เพราะจะได้ไม่ต้องกังวลกับ OS Disk หรือ Storage จะเต็มโดยที่เราไม่รู้ตัวหรือเปล่าเพราะกำหนดตายตัวไปแล้วว่าให้ Database ใช้ไปเท่าใหร่ แล้วค่อยมาดูว่าแต่ะละ Tablespace จะเต็ํมหรือยังจะได้ทำการ Add new datafiles

วันพฤหัสบดีที่ 9 มกราคม พ.ศ. 2557

Cacti + ORACLE ตอนที่ 3: สร้าง Data Source และ Graph

ความเดิมตอนที่แล้วเราได้สร้าง Templates เอาไว้เรียบร้อย ขั้นต่อไปจะเริ่มสร้าง Data Source สำหรับเก็บข้อมูลที่ query มาจาก ORACLE และทำการสร้าง Graph ออกมา

สร้าง Data Source
ให้ Click ที่เมนู Management -> Data Sources จากนั้น click ที่ Add ด้านขวาบน

ให้แก้ไขตามรูปตัวอย่างให้ถูกต้องตามระบบที่ท่านได้ทำเอาไว้ จากนั้นให้กด Save


สร้าง Graph
ให้ Click ที่เมนู Management ->Graph Management จากนั้น Click ที่ Add ด้านขวาบน

เมื่อท่านทำการ Save อาจจะไม่แสดงรูปขึ้นมาเป็นเพราะ poller ยังไม่ได้รันเพื่อทำการเก็บข้อมูลเพื่อสร้าง Graph ให้รอประมาณ 5 นาที หากยังไม่มีรูปให้ Click ที่ Turn On Graph Debug Node เพื่อตรวจสอบดูว่ามี Error แบบใด


จัดแสดง Graph
ให้ Click ที่เมนู Management ->Graph Management จากนั้นให้ทำตามรูปตัวอย่าง

เสร็จแล้วกดดูกราฟ

วันอังคารที่ 7 มกราคม พ.ศ. 2557

Cacti + ORACLE ตอนที่ 2: สร้าง Graph Templates และ Data Templates

ความเดิมตอนที่แล้วเราได้ทำการสร้าง Data Input Method เพื่อ query ข้อมูลจาก ORACLE ในลำดับต่อไปจะเป็นการสร้าง Template ที่จะเป็นคล้ายๆกับ Library ไว้ให้ Cacti รู้ได้ว่าเราจะเก็บข้อมูลและสร้างกราฟอย่างไร ผมได้ทำตัวอย่างมาแล้วดังนี้

กดไปตาม Link จนถึงหน้า download จากนั้นนำไป import ยังระบบ Cacti ของท่าน
shared_pool_free_data_template.xml
shared_pool_free_graph_template.xml

หรือท่านสามารถทำด้วยตัวเองดังนี้
Data Template

Graph Template


Cacti + ORACLE ตอนที่ 1: สร้างสคริปท์ PHP เพื่ออ่านค่าจากฐานข้อมูล

ในกาีรทำงานของ Cacti ที่จะสร้าง poller ไปทำการ query ข้อมูลจากระบบที่ต้องการนั้นจะใช้การทำงานจาก SNMP โปรโตคอลเป็นหลัก แต่ในบางกรณีที่เป็นการ query ข้อมูลที่มีลักษณะพิเศษหรือเป็นการทำงานเฉพาะกิจบางอย่างนั้น จะไม่ได้มี SNMP มาให้ เราจึงต้องใช้วิธีการอื่นเพื่อใช้ query ข้อมูลออกมา

สำหรับ ORACLE Database ที่เราจะทำกันในบทนี้เราจะใช้วิธีที่เรียกว่า Data Input Methods ที่มีให้เลือกใช้ในเมนูของ Cacti ดังรูป


ในตัวอย่างนี้ผมจะสร้าง Data Input Methods ใหม่ขึ้นมาตั้งชื่อว่า Oracle Monitor Query เป็นฟังชั่นที่เราจะนำมาใช้สำหรับการ connect ไปยังระบบฐานข้อมูล ORACLE โดยฟังชั่นที่เราสร้างขึ้นมานี้ จะสามารถรับ input เพื่อนำไปประมวลผลค่าออกมาได้ ดังนั้นเราจะสร้างแค่ครั้งเีดียวแล้วจะประยุกต์ใช้ในการทำงานกับแต่ะละ SQL ที่เราจะนำไป query ได้จากหลายๆระบบ

Input Type กำหนดเป็น Script - Script Server (PHP) เพราะเราจะใช้การเรียก php สคริปท์จาก command line เพื่อติดต่อไปยังฐานข้อมูล ORACLE โดยใน php.ini เราจะต้องทำการติดตั้ง module เพื่อการใช้งาน จากตัวอย่างสคริปท์ของผมใช้ oci8 จากการติดตั้ง ORACLE client

Input String
path_cacti  path ที่อยู่ของ cacti (ของผมคือ /usr/share/cacti มาจากการติดตั้งด้วย YUM หากท่านใช้วิธีอื่นจะไม่เหมือนกัน)

/scripts/ss_oracle_query.php ss_oracle_query คือ sub folder ใน cacti ที่ระบุถึง php สคริปท์ที่เราต้องการให้รันเพื่อ query ค่าจาก ORACLE (ss_oracle_query ตัวที่สองใช้เพื่อระบุ function ในสคริปท์ที่เราต้องการ call)

tnsnamesค่า tnsnames หรือชื่อที่เรากำหนดไว้ในไฟล์ tnsnames.ora ที่เราได้ทำการกำหนด connection description เอาไว้

path_oracle_sql เพื่อที่เราจะสามารถกำหนด SQL Statement ได้โดยอิสระสำหรับแต่ละ query ที่เราจะใช้งาน ผมจึงกำหนดให้เป็น path ที่ระบุไปยัง php ไฟล์ที่เราจะนำมา include ไปในสคริปท์ ss_oracle_query.php ที่เป็นตัวรันอีกครั้งหนึ่ง สาเหตุที่ไม่ได้ทำเป็นไฟล์ .sql หรือรับค่าเป็น statement ไปเลยก็เพราะว่าการรันใน php จะต้องทำการแก้ escape character บางอย่างเสียก่อน ไม่สามารถรันได้ทันที (สคริปท์ SQL ที่ต้องทำเป็น PHP นั้นผมจะสอนวิธีการทำ และจะนำมาแจกในบทความต่อๆไปครับ)

user username สำหรับ login เพื่อเข้าไป query ยัง Database ที่เราต้องการ

password password สำหรับ login เพื่อเข้าไป query ยัง Database ที่เราต้องการ


ตัวอย่าง php สคริปท์ที่ใช้ใน parameter path_oracle_sql
/usr/share/cacti/sql/shared_pool_free.php
<?

$query = "      select
                        round(
                                (sum(decode(name,'free memory',bytes))/sum(bytes))*100
                        ,2) as free
                from v\$sgastat
                where pool = 'shared pool'  ";

?>


Source code ของสคริปท์หลักที่ใช้เพื่อ query ข้อมูล
/usr/share/cacti/scripts/ss_oracle_query.php
<?
/* do NOT run this script through a web browser */
if (!isset($_SERVER["argv"][0]) || isset($_SERVER['REQUEST_METHOD'])  || isset($_SERVER['REMOTE_ADDR'])) {
   die("<br><strong>This script is only meant to run at the command line.</strong>");
}

/* display No errors */
error_reporting(0);

if (!isset($called_by_script_server)) {
        array_shift($_SERVER["argv"]);

        print call_user_func_array("ss_oracle_query", $_SERVER["argv"])."\n";
}

function ss_oracle_query ($tnsnames, $sql_path, $username, $password) {

        putenv("ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1");
        putenv("TNS_ADMIN=/u01/app/oracle/product/11.2.0/db_1/network/admin");

        $ret = '';

        $gdb_conn = ocilogon($username, $password,$tnsnames);

        $gdb_statement = OCIParse ($gdb_conn, "alter session set nls_date_format='MM/DD/YYYY HH24:MI:SS' ");
        OCIExecute ($gdb_statement);

        if (! OCIExecute($gdb_statement)){
                        return;
        }

        include $sql_path;

        $gdb_statement = OCIParse ($gdb_conn, $query);
        OCIExecute ($gdb_statement);

        while (OCIFetchInto ($gdb_statement, $row, OCI_RETURN_NULLS + OCI_ASSOC)) {
                reset($row);

                $shared_pool_free=$row['FREE'];
        }

        OCIFreeStatement($gdb_statement);

        $ret .= 'value:'.$shared_pool_free.' ';

        return trim($ret);
}
?>

ข้อควรระวัง
putenv("ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1");
putenv("TNS_ADMIN=/u01/app/oracle/product/11.2.0/db_1/network/admin");
2 บรรทัดนี้ในไฟล์ ss_oracle_query.php ท่านจะต้องแก้ให้ตรงกับระบบที่ท่านใช้งานในการกำหนด Environment เพื่อให้ PHP OCI8 ใช้งานในการเชื่อมต่อไปยังฐานข้อมูล ORACLE

วันอาทิตย์ที่ 5 มกราคม พ.ศ. 2557

การติดตั้ง Cacti เพื่อใช้งาน Monitor ORACLE Database

สามารถดูตัวอย่างได้จาก link ด้านล่างนี้ครับ
http://www.msit.mut.ac.th/newweb/phpfile/show.php?Qid=7842
http://spalinux.com/2009/07/install_cacti_on_fedora_11_part_1

Software Requirement

โปรแกรม cacti ต้องทำการติดตั้งบนระบบปฏิบัติการ Linux ไม่ว่าจะเป็น Radhat , CentOs, Fedora โดยโปรแกรมที่ต้องทำการติดตั้งลงบนเครื่อง
1. Apache : ทำหน้าที่แสดงผลกราฟที่สร้างจาก PHP และ RRDTool ทำหน้าที่เป็น Webserver เพื่อให้ client สามารถเรียกดูได้
2. MySQL : (เวอร์ชั่น 4.1.x or 5.x หรือดีกว่า) ทำหน้าที่เป็น Database server เพื่อเก็บข้อมูลต่าง ๆ เพื่อนำข้อมูลไปวิเคราะห์และสร้างกราฟต่อไป
3. PHP : (เวอร์ชั่น 4.3.6 or greater, 5.x หรือดีกว่า) เป็นสคริปที่ทำงานร่วมกับ RRDTool เพื่อสร้างกราฟ และต้องติดตั้งโมดูลสำหรับติดต่อไปยัง ORACLE ด้วย
4. PHP-SNMP : ส่วนเพิ่มเติมของ PHP สำหรับเข้าถึงข้อมูลอุปกรณ์ที่ต้องการมอนิเตอร์ผ่านโปรโตคอล snmp
5. NET-SNMP : โปรโตคอล snmp ใช้จัดการระบบเครือข่าย
6. RRDTool : (เวอร์ชั้น 1.0.49 or 1.2.x หรือดีกว่า) RRDTool ใช้เพื่อทําการจัดเก็บข้อมูล RRD Round Robin Database ซึ่งเป็นระบบที่มีการจัดเก็บและแสดงผลข้อมูลตามช่วงเวลาที่มีความต่อเนื่อง ซึ่งข้อมูลจะมีการเก็บอย่างกระชับแน่นอน จะไม่มีการขยายพื้นที่เพิ่มขึ้นแม้ว่าเวลาจะมีเพิ่มขึ้นก็ตาม

วันเสาร์ที่ 4 มกราคม พ.ศ. 2557

Monitor ระบบ ORACLE DATABASE อย่างไร

เรื่องมีอยู่ว่าลูกศิษย์ของผมซึ่งทำงานเป็น Outsource DBA ประจำอยู่กับลูกค้าแห่งหนึ่งได้รับมอบหมายงานให้นำ Cacti มาใช้งานสำหรับ Monitor ORACLE ที่มีอยู่หลายระบบ (เค้าเล่าว่าเป็นพัน instance) ก็เลยคิดว่าแทนที่จะสอนลูกศิษย์ตัวเองอย่างเดียวก็มาเขียนให้คนอื่นได้อ่านด้วยน่าจะดีกว่า โดยจากประสบการณ์เดิมของผมที่ได้เคยทดสอบใช้เครื่องมือต่างๆมาหลายชนิด มักจะมีบางหัวข้อที่ไม่สามารถหาเครื่องมือตัวใหนมาช่วยจัดการให้ได้ จนในที่สุดก็ต้องเขียนขึ้นมาเองหรือใช้โปรแกรมที่เป็น Opensource และทำสคริปท์ขึ้นมาใช้ส่วนตัวสำหรับงานของตัวเอง

หลักการทั่วไปของการ monitoring ORACLE
ความยากก็คือเครื่องมือที่มีขายในตลาดสำหรับระบบ Enterprise ที่ใช้สำหรับจัดการกับ Server ที่มีจำนวนมาก โดยส่วนใหญ่ จะเป็นการใช้ระบบ SNMP Agent เพื่อเป็นส่วนใช้สำหรับส่งและรับค่าระหว่าง Database และ Monitoring tools ก็จะมีปัญหาเกิดขึ้นมาเพราะ DBA ส่วนใหญ่แม้กระทั่งตัวผมเองไม่มีความรู้ SNMP ทำให้การติดตั้ง SNMP Agent เป็นไปได้อย่างยากลำบาก โดยเฉพาะสำหรับการติดตั้งบนทุก Server ที่เราต้องการ monitor ตัวอย่างปัญหาที่จะเกิดขึ้นก็ได้แก่ restart server แต่ลืม restart agent เป็นต้น หรือในบางกรณีก็จะมีปัญหากับเรื่อง security ที่เราต้องสร้าง user dbsnmp บนทุกๆ database มันจะมีปัญหาว่าถูกบังคับให้เปลี่ยน password ตามช่วงเวลา จะลำบากมากกับการมาคอยเปลี่ยน แต่ว่าที่เล่ามาทั้งหมดได้รับการทำให้สะดวกขึ้นใน Oracle Enterprise Manager 12c ได้ทำให้การใช้ SNMP Agent สะดวกกว่าเดิม แต่ว่า EM 12c มีราคาที่สูงบางองค์กรก็สู้ไม่ใหวเหมือนกัน

ทางเลือกที่เราจะไม่ใช้ SNMP ก็จะต้องมาทำสคริปท์เพื่อ query ค่าออกมาแล้วส่งต่อให้กับ monitoring tools ก็คือสร้าง background service หรือโปรแกรมขึ้นมารันเพื่อ query ทุกๆ 5 นาที หรือตามเวลาที่ได้ตั้งเอาไว้ แบบนี้ก็เรียกว่า Agent แต่ก็เหมือนเดิมคือถ้าลืม start Agent หรือเกิดอาการ hang/non-response ก็หยุดส่งค่าดื้อๆเอาเหมือนกัน ดังนั้นก็จะมีวิธีอีกแบบก็คือไปสร้างสคริปท์หรือ background service ที่ monitoring tools อย่างเดียวแล้วใช้การ remote query ข้อมูลกลับมาที่ปลายทาง วิธีนี้เรียกว่า Agentless


แล้่วผมจะช่วยลูกศิษย์ใช้ Cacti เพื่อ monitoring ระบบ ORACLE Database อย่างไร
จากโจทย์ที่ได้รับมาก็คือนำมาใช้เพื่อเก็บข้อมูลต่างๆเพื่อการตัดสินใจ โดยสิ่งที่จะนำมาเก็บก็คือ Hit ratio ต่างๆและข้อมูลที่เป็นการเข้าไป query จาก database ก็เลยคิดว่าจะใช้ Agentless โดยใช้ Cacti เป็นระบบ monitoring ที่จะรับค่าที่เรา query ออกมาและบันทึกเอาไว้เพื่อใช้สร้างกราฟเอาไว้ทำ report ได้ ซึ่งบอกได้ว่าเหมือนกับเอา Cacti แค่มาเป็นตัวสร้างกราฟเท่านั้นส่วนการ query ออกมาเราจะต้องทำเองทั้งหมด อ่านมาถึงตรงนี้คนที่เคยคิดจะใช้ Cacti มา monitoring ORACLE คงจะทราบดีว่าหากท่าน search google และในเว็บไซต์ของ Cacti เอง จะพบ template สำหรับใช้งาน ORACLE ในระบบ SNMP และแทบไม่ได้บอกวิธีอะไรมากมาย และไม่สอนให้ query ข้อมูลอื่นๆที่ไม่มีใน template ตัวผมเองเป็น DBA มาหลายปีอยากได้เครื่องมือที่สามารถใช้งานก็จนปัญญาเพราะหาวิธีไม่เจอและเครื่องมือที่ดังๆอย่าง Cacti ก็ไม่มีคนทำสคริปท์สำหรับ ORACLE จนในที่สุดผมก็ทำเองได้สำเร็จครับ ซึ่งผมก็จะค่อยเขียนวิธีทำและวิธีใช้งานในลำดับถัดไป