ORACLE/Backup & Recovery2007. 12. 11. 20:01
반응형
: Configuration of Load Balancing and Transparent Application Failover
  문서 ID: 공지:226880.1 유형: BULLETIN
  마지막 갱신 날짜: 15-NOV-2007 상태: PUBLISHED

Configuration of Load Balancing and Transparent Application Failover


This note was created to provide a guideline to the configuration of:

1) client side connect time load balance only
2) server side listener connection load balance with client side connect
   time load balance
3) server side listener connection load balance only
3) transparent application failover

Before you configure the Net Services features, here is a definition of the
these features that can be implemented either singly or in combination with
each other.

 Client Side Connect-Time Failover
The connect-time failover enables clients to connect to another listener if
the initial connection to the first listener fails. The number of listener 
protocol addresses determines how many listeners are tried. Without 
connect-time failover, Oracle Net attempts a connection with only one listener.  
The default is on.

 Transparent Application Failover
The Transparent Application Failover (TAF) feature is a runtime failover for
high-availability environments, such as Oracle9i Real Application Clusters and
Oracle9i Real Application Clusters Guard. TAF fails over and reestablishes 
application-to-service connections. It enables client applications to 
automatically reconnect to the database if the connection fails and, 
optionally, resume a SELECT statement that was in progress. The reconnection 
happens automatically from within the Oracle Call Interface (OCI) library.

 Client Side Connect Time Load Balancing
The client load balancing feature enables clients to randomize connection 
requests among the listeners. Oracle Net progresses through the list of 
protocol addresses in a random sequence, balancing the load on the various 
listeners. Without client load balancing, Oracle Net progresses through the 
list of protocol addresses sequentially until one succeeds.  This normally is 
referred to connect-time load balance.  

 Server Side Listener Connection Load Balancing
The listener connection load balancing feature improves connection performance
by balancing the number of active connections among multiple dispatchers and 
instances. In a single-instance environment, the listener selects the least 
loaded dispatcher to handle the incoming client requests. In an Oracle9i Real 
Application Clusters environment, connection load balancing also has the 
capability to balance the number of active connections among multiple instances.

Due to dynamic service registration, a listener is always aware of all 
instances and dispatchers regardless of their locations. Depending on the load
information, a listener decides which instance and, if shared server is 
configured, which dispatcher to send the incoming client request to. In a 
shared server configuration, a listener selects a dispatcher in the following 
order:
1. Least-loaded node
2. Least-loaded instance
3. Least-loaded dispatcher for that instance

In a dedicated server configuration, a listener selects an instance in the 
following order:
1. Least loaded node
2. Least loaded instance

If a database service has multiple instances on multiple nodes, the listener 
chooses the least loaded instance on the least loaded node. If shared server 
is configured, then the least loaded dispatcher of the selected instance is 
chosen.


Included is server side node1's init.ora, listener.ora, and tnsnames.ora files 
as well as client side tnanames.ora file.

This is a four nodes cluster setup.  The configuration is as follows.  If you 
replace your hostname, service_name, sid_name, instance_name and $ORACLE_HOME
in the example files, you should be able to configure a successful setup.  

       hostname  service name  sid name  instance_name  ORACLE_HOME
       ========  ============  ========  =============  =====================
node1   hprac-22      rac         rac1         rac1     /oracle/9iship/rac901
node2   hprac-23      rac         rac2         rac2     /oracle/9iship/rac901
node3   hprac-24      rac         rac3         rac3     /oracle/9iship/rac901
node4   hprac-25      rac         rac4         rac4     /oracle/9iship/rac901


All 4 nodes init.ora file have the following parameters:
remote_listener='LISTENERS_RAC'
rac1.local_listener="LISTENER_rac1”
rac2.local_listener="LISTENER_rac2"
rac3.local_listener="LISTENER_rac3"
rac4.local_listener="LISTENER_rac4"
# dispatchers="(pro=ipc)(dis=0)"
db_name='rac'
rac1.instance_name='rac1'
rac2.instance_name='rac2'
rac3.instance_name='rac3'
rac4.instance_name='rac4'

Since service_names is not specified in the init.ora file, it defaults to 
db_name.db_domain.  Each node should list it's own host name and instance_name.  
With the above setup, after you start the instance, when checking the sql 
session from node1, you will find the following info.  


SQL> show parameter db_name
NAME                        TYPE      VALUE
--------------------------- --------- -----------------------------------------
db_name                     string    rac

SQL> show parameter db_domain
NAME                        TYPE      VALUE
--------------------------- --------- -----------------------------------------
db_domain                   string

SQL> show parameter service_names
NAME                        TYPE      VALUE
--------------------------- --------- -----------------------------------------
service_names               string    rac

SQL> show parameter instance_name
NAME                        TYPE      VALUE
--------------------------- --------- -----------------------------------------
instance_name               string    rac1

SQL> show parameter listener
NAME                    TYPE      VALUE
---------------------- -----     ----------------------------------------------
local_listener         string    LISTENER_rac1
mts_listener_address   string
mts_multiple_listeners boolean   FALSE
remote_listener        string    LISTENERS_RAC


hprac-22 listener.ora file
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
      )
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = hprac-22)(PORT = 1521))
      )
    )
  )

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /oracle/9iship/rac901)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (ORACLE_HOME = /oracle/9iship/rac901)
      (SID_NAME = rac1)
    )
  )


hprac-22 ~ hprac-25 tnsnames.ora file

LISTENERS_RAC =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = hprac-22)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = hprac-23)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = hprac-24)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = hprac-25)(PORT = 1521))
    )
  )

# For hprac-22 only
LISTENER_rac1 =
  (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = hprac-22)(PORT = 1521))
  )

# For hprac-23 only
LISTENER_rac2 =
  (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = hprac-23)(PORT = 1521))
  )

# For hprac-24 only
LISTENER_rac3 =
  (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = hprac-24)(PORT = 1521))
  )

# For hprac-25 only
LISTENER_rac4 =
  (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = hprac-25)(PORT = 1521))
  )


Client side Tnsnames.ora file
RAC1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = hprac-22)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = rac)
      (INSTANCE_NAME = rac1)
    )
  )

RAC2 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = hprac-23)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = rac)
      (INSTANCE_NAME = rac2)
    )
  )

RAC3 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = hprac-24)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = rac)
      (INSTANCE_NAME = rac3)
    )
  )

RAC4 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = hprac-25)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = rac)
      (INSTANCE_NAME = rac4)
    )
  )

RAC =
  (DESCRIPTION =
    (LOAD_BALANCE = yes)
    (ADDRESS = (PROTOCOL = TCP)(HOST = hprac-22)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = hprac-23)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = hprac-24)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = hprac-25)(PORT = 1521))
    (CONNECT_DATA =
      (SERVICE_NAME = rac)
    )
  )

failover =
  (DESCRIPTION =
    (enable=broken)
    (LOAD_BALANCE = yes)
    (ADDRESS = (PROTOCOL = TCP)(HOST = hprac-22)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = hprac-23)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = hprac-24)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = hprac-25)(PORT = 1521))
    (CONNECT_DATA =
      (SERVICE_NAME = rac)
      (failover_mode=(type=select)(method=basic))
    )
  )



Remarks:
1) LISTENERS_RAC, LISTENER_rac1, LISTENER_rac2, LISTENER_rac3, LISTENER_rac4, 
is the net_service_name (connect descriptor) for remote_listener and 
local_listener.  On the client side, you do not need these net_service_name.
2) failover is the net_service_name for transparent application failover (TAF)
testing.
3) RAC is the net_service_name for client side load balance, if you do not 
need to configure TAF.

There are few different ways to set up client side connect time load balance.  
Here is another alternative:

4) RAC_alternative =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (LOAD_BALANCE = yes)
      (ADDRESS = (PROTOCOL = TCP)(HOST = hprac-22)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = hprac-23)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = hprac-24)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = hprac-25)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = rac)
    )
  )
Note:  The (load_balance=yes) instructs Net to progress through the list of 
listener addresses in a random sequence, balancing the load on the various 
listeners.  When set to OFF, instructs Net to try the addresses sequentially 
until one succeeds.  This parameter must be correctly coded in your net 
service name (connect descriptor).  By default, this parameter is set to ON 
for DESCRIPTION_LISTs.  Load balancing can be specified for an ADDRESS_LIST or 
associated with a set of ADDRESSes or set DESCRIPTIONs. If you use ADDRESS_LIST,
(load_balance=yes) should be within the (ADDRESS_LIST=) portion.  If you do 
not use ADDRESS_LIST, (load_balance=yes) should be within the (description=)
portion.  We recommend not to use this (ADDRESS_LIST=) clause.

5) (failover=on) is default for ADDRESS_LISTs, DESCRIPTION_LISTs, and a set of
DESCRIPTIONs., therefore, you do not have to specify.  This is for 
connect-time-failover, please do not confuse it with transparent application 
failover (TAF).  
6) (failover_mode=): The FAILOVER_MODE parameter must be included in the 
CONNECT_DATA portion of a net_service_name.  
7) There is no (backup=failover) in (failover_mode=), this implies 
(failover_mode=(type=select)(method=basic)(backup=failover)), which means 
whenever failover occurs, the connected session will failover to the 
net_service_name failover again.  A backup should be specified when using 
PRECONNECT to pre-establish connections.  For details of TAF, please refer to 
Oracle official documentations.


Methodology for the testing
1. You should always start with a simple setup and then move towards 
more complicated one.
2. After you start the listener and instance, verify the output from 
'lsnrctl services' first.  'lsnrctl status' alone does not provide you with 
sufficient info whether or not you have the correct setup.  If ‘lsnrctl 
services’ output is incorrect.  STOP!  Correct the listener.ora or init.ora 
before you continue.  
3. Test the connections from the server for the client-side-load-balancing, 
verify it with the verify.sql provided here.  You can comment out the sql 
you do not need.
4. Test the connections from the server for the server side listerener 
connection load balance, verify it.
5. Test the TAF connections from the server, verify the failover_type and
failover_mothod before shutting down the instance or rebooting the server. 


===============================================================================
Before you start the testing, you can create a loop.sh file with the following
lines repeated as many times as you like.  In my testing, I repeat 512 times 
connection.  Please replace username, password and net_service_name accordingly.

loop.sh
nohup sqlplus su/su@failover @verify.sql &
   sleep 1
nohup sqlplus su/su@failover @verify.sql &
   sleep 1
nohup sqlplus su/su@failover @verify.sql &
   sleep 1
nohup sqlplus su/su@failover @verify.sql &
   sleep 1


verify.sql (to verify the connection)
REM  set pagesize 1000
REM  the following query is for TAF connection verification
col sid format 999
col serial# format 9999999
col failover_type format a13
col failover_method format a15
col failed_over format a11
select sid, serial#, failover_type, failover_method, failed_over
  from v$session where username = 'SU';

REM  the following query is for load balancing verification
select instance_name from v$instance;
exit

REM you can also combine two queries:
col inst_id format 999
col sid format 999
col serial# format 9999999
col failover_type format a13
col failover_method format a15
col failed_over format a11

select inst_id, sid, serial#, failover_type, failover_method, failed_over
  from gv$session where username = 'SU';

REM  a simple select to see the distribution of users when testing connection 
REM  load balancing

select inst_id, count(*) from gv$session group by inst_id;

To run the test, simply type './loop.sh', the output will go to nohup.out.

===============================================================================

Client Side Connect Time Load Balancing



Testing
For client side connect time load balancing testing only, without server side 
listener connection load balancing, please remove the remote_listener in the 
init.ora file and restart all instances.  There will be no remote instances 
registered to the listener.  You will only find the local server for each 
instance.  

hprac-22 'lsnrctl service' 
Service "rac" has 1 instance(s).
  Instance "rac1", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
Service "rac1" has 1 instance(s).
  Instance "rac1", status UNKNOWN, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0
         LOCAL SERVER
The command completed successfully


hprac-23 'lsnrctl service' 
Service "rac" has 1 instance(s).
  Instance "rac2", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
Service "rac2" has 1 instance(s).
  Instance "rac2", status UNKNOWN, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0
         LOCAL SERVER
The command completed successfully


hprac-24 'lsnrctl service' 
Service "rac" has 1 instance(s).
  Instance "rac3", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
Service "rac3" has 1 instance(s).
  Instance "rac3", status UNKNOWN, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0
         LOCAL SERVER
The command completed successfully


hprac-25 'lsnrctl service' 
Service "rac" has 1 instance(s).
  Instance "rac4", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
Service "rac4" has 1 instance(s).
  Instance "rac4", status UNKNOWN, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0
         LOCAL SERVER
The command completed successfully


Simply run the './loop.sh' script, and check the output periodically.

> grep rac1 nohup.out | wc -l
28
> grep rac2 nohup.out | wc -l
28
> grep rac3 nohup.out | wc -l
22
> grep rac4 nohup.out | wc -l
17


> grep rac1 nohup.out | wc -l
87
> grep rac2 nohup.out | wc -l
72
> grep rac3 nohup.out | wc -l
73
> grep rac4 nohup.out | wc -l
63


> grep rac1 nohup.out | wc -l
147
> grep rac2 nohup.out | wc -l
126
> grep rac3 nohup.out | wc -l
133
> grep rac4 nohup.out | wc -l
106


After the testing completes, in this particular test, there were 147 
connections go to rac1, 126 connections go to rac2, 133 connections go to 
rac3 and 106 connections go to rac4.  This gives you a rough idea about 
the distribution of client side randomly selection among all 4 nodes.  

==============================================================================

Server Side Listener Connection Load Balancing Testing (combined with client 
side connect time load balancing)

Server side listener connection load balancing is where the listener routes 
the connections to the least-loaded instance.  Please add back remote_listener 
parameter in the init.ora file and restart all 4 instances.  Remember to 
verify the output of ‘lsnrctl services’.  The node1 'lsnrctl services' output 
looks like (I have eliminiated "MODOSE" and "PLSExtProc" service output to 
make it easier to read):

hprac-22 $ lsnrctl services

LSNRCTL for HPUX: Version 9.0.1.3.0 - Production on 06-JUN-2002 19:44:17

Copyright (c) 1991, 2001, Oracle Corporation.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC)))
Services Summary...
Service "rac" has 4 instance(s).
  Instance "rac1", status READY, has 4 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-22)(PORT=1521))
      "D002" established:0 refused:0 current:0 max:2026 state:ready
         DISPATCHER <machine: hprac-22, pid: 27840>
         (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hprac-22)(PORT=62235))
         (PRESENTATION=oracle.aurora.server.SGiopServer)(SESSION=RAW))
      "D001" established:0 refused:0 current:0 max:2026 state:ready
         DISPATCHER <machine: hprac-22, pid: 27838>
         (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hprac-22)(PORT=62234))
         (PRESENTATION=oracle.aurora.server.GiopServer)(SESSION=RAW))
  Instance "rac2", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-23)(PORT=1521))
      "D002" established:0 refused:0 current:0 max:2026 state:ready
         DISPATCHER <machine: hprac-23, pid: 16911>
         (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hprac-23)(PORT=51212))
         (PRESENTATION=oracle.aurora.server.SGiopServer)(SESSION=RAW))
      "D001" established:0 refused:0 current:0 max:2026 state:ready
         DISPATCHER <machine: hprac-23, pid: 16909>
         (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hprac-23)(PORT=51211))
         (PRESENTATION=oracle.aurora.server.GiopServer)(SESSION=RAW))
  Instance "rac3", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-24)(PORT=1521))
      "D002" established:0 refused:0 current:0 max:2026 state:ready
         DISPATCHER <machine: hprac-24, pid: 27815>
         (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hprac-24)(PORT=52409))
         (PRESENTATION=oracle.aurora.server.SGiopServer)(SESSION=RAW))
      "D001" established:0 refused:0 current:0 max:2026 state:ready
         DISPATCHER <machine: hprac-24, pid: 27813>
         (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hprac-24)(PORT=52408))
         (PRESENTATION=oracle.aurora.server.GiopServer)(SESSION=RAW))
  Instance "rac4", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-25)(PORT=1521))
      "D002" established:0 refused:0 current:0 max:2026 state:ready
         DISPATCHER <machine: hprac-25, pid: 5081>
         (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hprac-25)(PORT=53755))
         (PRESENTATION=oracle.aurora.server.SGiopServer)(SESSION=RAW))
      "D001" established:0 refused:0 current:0 max:2026 state:ready
         DISPATCHER <machine: hprac-25, pid: 5079>
         (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hprac-25)(PORT=53754))
         (PRESENTATION=oracle.aurora.server.GiopServer)(SESSION=RAW))
Service "rac1" has 1 instance(s).
  Instance "rac1", status UNKNOWN, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0
         LOCAL SERVER
The command completed successfully
$

Note: Comparing this to the 'lsnrctl status' output below, you will find the
above provides much more information.  Please note that for an instance on its
own node, i.e. rac1 on node1 (hprac-22), you should have both local server and
remote server.  For all other remote instances, i.e. rac2, rac3 and rac4 on 
node1 (hprac-22), you will only find the remote server.  Under the remote 
server, please make sure the address listed is correct, no null hostname.
(ADDRESS=(PROTOCOL=TCP)(HOST=hprac-23)(PORT=1521))
                        ^^^^^^^^^^^^^

hprac-22 $ lsnrctl status

LSNRCTL for HPUX: Version 9.0.1.3.0 - Production on 06-JUN-2002 19:45:14

Copyright (c) 1991, 2001, Oracle Corporation.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for HPUX: Version 9.0.1.3.0 - Production
Start Date                15-MAY-2002 15:33:41
Uptime                    22 days 4 hr. 11 min. 33 sec
Trace Level               off
Security                  OFF
SNMP                      OFF
Listener Parameter File   /oracle/9iship/rac901/network/admin/listener.ora
Listener Log File         /oracle/9iship/rac901/network/log/listener.log
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hprac-22)(PORT=1521)))
Services Summary...
Service "rac" has 4 instance(s).
  Instance "rac1", status READY, has 4 handler(s) for this service...
  Instance "rac2", status READY, has 3 handler(s) for this service...
  Instance "rac3", status READY, has 3 handler(s) for this service...
  Instance "rac4", status READY, has 3 handler(s) for this service...
Service "rac1" has 1 instance(s).
  Instance "rac1", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully


Example of 'lsnrctl services' output from hprac-23, hprac-24, hprac-25.  
To make it easier to read, I have eliminated the aurora dispatchers info.  


hprac-23 $ lsnrctl services

LSNRCTL for HPUX: Version 9.0.1.3.0 - Production on 06-JUN-2002 19:44:15
Copyright (c) 1991, 2001, Oracle Corporation.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC)))
Services Summary...
Service "rac" has 4 instance(s).
  Instance "rac1", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-22)(PORT=1521))
   Instance "rac2", status READY, has 4 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-23)(PORT=1521))
  Instance "rac3", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-24)(PORT=1521))
  Instance "rac4", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SER   (ADc-25)(PORT=1521))
Service "rac2" has 1 instance(s).
  Instance "rac2", status UNKNOWN, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0
         LOCAL SERVER
The command completed successfully
$

hprac-24 $ lsnrctl services

LSNRCTL for HPUX: Version 9.0.1.3.0 - Production on 06-JUN-2002 19:44:14
Copyright (c) 1991, 2001, Oracle Corporation.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC)))
Services Summary...
Service "rac" has 4 instance(s).
  Instance "rac1", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-22)(PORT=1521))
  Instance "rac2", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-23)(PORT=1521))
   Instance "rac3", status READY, has 4 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-24)(PORT=1521))
  Instance "rac4", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-25)(PORT=1521))
Service "rac3" has 1 instance(s).
  Instance "rac3", status UNKNOWN, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0
         LOCAL SERVER
The command completed successfully
$


hprac-25  $ lsnrctl services

LSNRCTL for HPUX: Version 9.0.1.3.0 - Production on 06-JUN-2002 19:43:20
Copyright (c) 1991, 2001, Oracle Corporation.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC)))
Services Summary...
Service "rac" has 4 instance(s).
  Instance "rac1", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-22)(PORT=1521))
  Instance "rac2", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-23)(PORT=1521))
  Instance "rac3", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-24)(PORT=1521))
  Instance "rac4", status READY, has 4 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-25)(PORT=1521))
Service "rac4" has 1 instance(s).
  Instance "rac4", status UNKNOWN, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0
         LOCAL SERVER
The command completed successfully


===============================================================================
Simply run the './loop.sh' script again.  You can also periodically check the 
results.

After the testing completes, in this particular test, there were 182 
connections go to rac1, 109 connections go to rac2, 153 connections go to 
rac3 and 68 connections go to rac4.  This output combines both client side 
load balancing (randomly selected) and the server side listener connection 
load balancing.
  
> grep rac1 nohup.out | wc -l
182
> grep rac2 nohup.out | wc -l
109
> grep rac3 nohup.out | wc -l
153
> grep rac4 nohup.out | wc -l
68

You can safely assume that node1 had the least CPU load, therefore, most 
connections went to rac1.  Node4 had the heaviest CPU load, therefore, least 
connections went to rac4.  

After the testing, you can check 'lsnrctl services' from all 4 nodes again:
hprac-22 'lsnrctl service'
Service "rac" has 4 instance(s).
  Instance "rac1", status READY, has 4 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:182 refused:0 state:ready
         LOCAL SERVER
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-22)(PORT=1521))
  Instance "rac2", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:33 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-23)(PORT=1521))
   Instance "rac3", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:47 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-24)(PORT=1521))
   Instance "rac4", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:23 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-25)(PORT=1521))
Service "rac1" has 1 instance(s).
  Instance "rac1", status UNKNOWN, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0
         LOCAL SERVER
The command completed successfully


hprac-23 'lsnrctl service'
Service "rac" has 4 instance(s).
  Instance "rac1", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:58 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-22)(PORT=1521))
  Instance "rac2", status READY, has 4 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:109 refused:0 state:ready
         LOCAL SERVER
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-23)(PORT=1521))
   Instance "rac3", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:50 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-24)(PORT=1521))
   Instance "rac4", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:22 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-25)(PORT=1521))
Service "rac2" has 1 instance(s).
  Instance "rac2", status UNKNOWN, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0
         LOCAL SERVER
The command completed successfully


hprac-24 'lsnrctl service'
Service "rac" has 4 instance(s).
  Instance "rac1", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:65 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-22)(PORT=1521))
   Instance "rac2", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:39 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-23)(PORT=1521))
  Instance "rac3", status READY, has 4 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:153 refused:0 state:ready
         LOCAL SERVER
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-24)(PORT=1521))
  Instance "rac4", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:23 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-25)(PORT=1521))
Service "rac3" has 1 instance(s).
  Instance "rac3", status UNKNOWN, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0
         LOCAL SERVER
The command completed successfully



hprac-25 'lsnrctl service'
Service "rac" has 4 instance(s).
  Instance "rac1", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:55 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-22)(PORT=1521))
  Instance "rac2", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:32 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-23)(PORT=1521))
  Instance "rac3", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:48 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-24)(PORT=1521))
  Instance "rac4", status READY, has 4 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:68 refused:0 state:ready
         LOCAL SERVER
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-25)(PORT=1521))
Service "rac4" has 1 instance(s).
  Instance "rac4", status UNKNOWN, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0
         LOCAL SERVER
The command completed successfully

===============================================================================

Server Side Listener Connection Load Balancing Only Testing
If you prefer, you can eliminate the client side connect time load balance by 
removing or commenting out (LOAD_BALANCE = yes) and check the distribution of 
the server side listener connection load balance only.

RAC_no_client_side_load_balance =
  (DESCRIPTION =
#      (LOAD_BALANCE = yes)
      (ADDRESS = (PROTOCOL = TCP)(HOST = hprac-22)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = hprac-23)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = hprac-24)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = hprac-25)(PORT = 1521))
    (CONNECT_DATA =
      (SERVICE_NAME = rac)
    )
  )

In this case, all connections will go to hprac-22 listener and hprac-22 
listener will route to the other instances based on the last updated load 
information updated by PMON.  

The result is 
> grep rac1 nohup.out | wc -l
189
> grep rac2 nohup.out | wc -l
106
> grep rac3 nohup.out | wc -l
105
> grep rac4 nohup.out | wc -l
112

After the testing completes, in this particular test, there were 189 
connections go to rac1, 106 connections go to rac2, 105 connections go to 
rac3 and 112 connections go to rac4.  This gives you a rough idea about 
the distribution of server side listener connection load balancing among 
all 4 nodes.  You can compare it with the previous two tests.  


hprac-22 ‘lsnrctl services’
Service "rac" has 4 instance(s).
  Instance "rac1", status READY, has 4 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:189 refused:0 state:ready
         LOCAL SERVER
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-22)(PORT=1521))
  Instance "rac2", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:106 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-23)(PORT=1521))
  Instance "rac3", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:105 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-24)(PORT=1521))
  Instance "rac4", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:112 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-25)(PORT=1521))
Service "rac1" has 1 instance(s).
  Instance "rac1", status UNKNOWN, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0
         LOCAL SERVER
The command completed successfully


hprac-23 ‘lsnrctl services’
Service "rac" has 4 instance(s).
  Instance "rac1", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-22)(PORT=1521))
  Instance "rac2", status READY, has 4 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-23)(PORT=1521))
      "DEDICATED" established:106 refused:0 state:ready
         LOCAL SERVER
  Instance "rac3", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-24)(PORT=1521))
  Instance "rac4", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-25)(PORT=1521))
Service "rac2" has 1 instance(s).
  Instance "rac2", status UNKNOWN, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0
         LOCAL SERVER
The command completed successfully


hprac-24 ‘lsnrctl services’
Service "rac" has 4 instance(s).
  Instance "rac1", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-22)(PORT=1521))
  Instance "rac2", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-23)(PORT=1521))
  Instance "rac3", status READY, has 4 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-24)(PORT=1521))
      "DEDICATED" established:105 refused:0 state:ready
         LOCAL SERVER
  Instance "rac4", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-25)(PORT=1521))
Service "rac3" has 1 instance(s).
  Instance "rac3", status UNKNOWN, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0
         LOCAL SERVER
The command completed successfully


hprac-25 ‘lsnrctl services’
Service "rac" has 4 instance(s).
  Instance "rac1", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-22)(PORT=1521))
  Instance "rac2", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-23)(PORT=1521))
  Instance "rac3", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-24)(PORT=1521))
  Instance "rac4", status READY, has 4 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=hprac-25)(PORT=1521))
      "DEDICATED" established:112 refused:0 state:ready
         LOCAL SERVER
Service "rac4" has 1 instance(s).
  Instance "rac4", status UNKNOWN, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0
         LOCAL SERVER
The command completed successfully

You will also notice that from hprac-22 ‘lsnrctl service’ output, it has all 4
instances established connection count info.  However, the other 3 nodes only 
have it’s own instance established connection count info.  It’s due to no 
client side load balancing (load_balance=on), all connections go to hprac-22 
listener (first one in the address_list) and hprac-22 listener routes to the 
other instances.  

===============================================================================

Common misconception

If you want to have remote instances registered with the listener, even if 
your listener is using port 1521, you still need to have local_listener in 
your init.ora file.  Otherwise, with remote_listener="LISTENERS_RAC" alone, 
you will not get the remote instances registered with the listener and no 
server side listener connection load balancing.  This is due to Bug 2194549, 
fixed at 10i.  Let’s remove all local_listener parameters from the init.ora 
file and restart all 4 nodes, to see what will happen.  Please note the (HOST=)
under REMOTE SERVER.  

If you are not using the default port 1521, it’s required that you have 
local_listener in the init.ora file.  If your hostname output is your 
interconnect ip address as opposed to the public ethernet ip address, PMON 
process will register the service and instance with the hostname’s listener.  
In this case, you should also specify the local_listener parameter to 
instruct the PMON to register the service and instance with the public 
ethernet ip address listener. 

hprac-22 'lsnrctl service'
 (Similar output will be found for hprac-23, hprac-24, hprac-25)
Service "rac" has 4 instance(s).
  Instance "rac1", status READY, has 4 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=1521))
                                ^^^^^^^
  Instance "rac2", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=1521))
                                ^^^^^^^
  Instance "rac3", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=1521))
                                ^^^^^^^
  Instance "rac4", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=1521))
                                ^^^^^^^
Service "rac1" has 1 instance(s).
  Instance "rac1", status UNKNOWN, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0
         LOCAL SERVER
The command completed successfully


Since the remote instances registered with NULL hostname, only 1 out of 4 
connections (4 nodes configuration) will go thru (via local server) and the 
others will fail with ORA-12502.  The following test was using the 
net_service_name RAC with (load_balance = yes).  

> grep rac1 nohup.out | wc -l
30
> grep rac2 nohup.out | wc -l
33
> grep rac3 nohup.out | wc -l
32
> grep rac4 nohup.out | wc -l
33
> grep 12502 sqlnet.log | wc -l
384

In this particular testing, 384 output 512 connections failed. Among the 
successful connections, 30 connections go to rac1, 33 connections go to rac2, 
32 connections go to rac3, and 33 connections go to rac4.  On the client 
side sqlnet.log file you will find the following error messages:

***********************************************************************
Fatal NI connect error 12502, connecting to:
 (DESCRIPTION=(enable=broken)(ADDRESS=(PROTOCOL=TCP)(HOST=hprac-25)(PORT=1521))(
CONNECT_DATA=(service_name=rac)(failover_mode=(type=select)(method=basic))(CID=(
PROGRAM=)(HOST=opcbhp1)(USER=usupport))))

  VERSION INFORMATION:
        TNS for HPUX: Version 9.0.1.3.0 - Production
        TCP/IP NT Protocol Adapter for HPUX: Version 9.0.1.3.0 - Production
  Time: 06-JUN-2002 19:27:25
  Tracing not turned on.
  Tns error struct:
    nr err code: 0
    ns main err code: 12564
    TNS-12564: TNS:connection refused
    ns secondary err code: 0
    nt main err code: 0
    nt secondary err code: 0
    nt OS err code: 0

The ora-12502 error is due to every connection going to node1 listener and 
it would try to route 3 out of 4 connections (4 nodes configuration) to the 
remote server with (ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=1521)).  It does not 
know where, or which host to connect to.  

In this particular testing, for the failing 384 connections, 89 went to 
hprac-22 listener, 98 went to hprac-23 listener, 97 went to hprac-24 listener 
and 100 went to hprac-25 listener. Here was the statistics: 

> grep HOST=hprac-22 sqlnet.log | wc -l
89
> grep HOST=hprac-23 sqlnet.log | wc -l
98
> grep HOST=hprac-24 sqlnet.log | wc -l
97
>  grep HOST=hprac-25 sqlnet.log | wc -l
100

hprac-22 'lsnrctl service'
Service "rac" has 4 instance(s).
  Instance "rac1", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:30 refused:0 state:ready
         LOCAL SERVER
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=1521))
  Instance "rac2", status READY, has 4 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:29 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=1521))
  Instance "rac3", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:29 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=1521))
  Instance "rac4", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:31 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=1521))
Service "rac1" has 1 instance(s).
  Instance "rac1", status UNKNOWN, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0
         LOCAL SERVER
The command completed successfully

hprac-23 'lsnrctl service'
Service "rac" has 4 instance(s).
  Instance "rac1", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:33 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=1521))
  Instance "rac2", status READY, has 4 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:33 refused:0 state:ready
         LOCAL SERVER
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=1521))
  Instance "rac3", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:33 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=1521))
  Instance "rac4", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:32 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=1521))
Service "rac2" has 1 instance(s).
  Instance "rac2", status UNKNOWN, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0
         LOCAL SERVER
The command completed successfully

hprac-24 'lsnrctl service'
Service "rac" has 4 instance(s).
  Instance "rac1", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:33 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=1521))
  Instance "rac2", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:32 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=1521))
  Instance "rac3", status READY, has 4 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:32 refused:0 state:ready
         LOCAL SERVER
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=1521))
  Instance "rac4", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:32 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=1521))
Service "rac3" has 1 instance(s).
  Instance "rac3", status UNKNOWN, has 1 handler(s) for this service...
    Handler(s)d:0 refusecommice "rac" has 4 instance(s).
  Instance "rac1", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:34 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=1521))
  Instance "rac2", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:33 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=1521))
  Instance "rac3", status READY, has 3 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:33 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=1521))
  Instance "rac4", status READY, has 4 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:33 refused:0 state:ready
         LOCAL SERVER
      "DEDICATED" established:0 refused:0 state:ready
         REMOTE SERVER
         (ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=1521))
Service "rac4" has 1 instance(s).
  Instance "rac4", status UNKNOWN, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0
         LOCAL SERVER
The command completed successfully


Caution:  If you are not running 9.0.1.3, for dedicated connection, server 
side load balancing will route most connections to one node, this is due to 
Bug 2134254.  The workaround is to add dispatchers="(pro=ipc)(dis=0)" in 
init.ora file.  

===============================================================================

Transparent Application Failover (TAF) testing

Please familiar yourself with WebIV Note 97926.1 - Failover Issues and 
Limitations [Connect-time failover and TAF] by Richard Powell for detailed 
explanation about TAF.  The following only demonstrate the transparent 
application failover testing.  

> sqlplus su/su@failover

SQL*Plus: Release 9.0.1.3.0 - Production on Thu Jun 6 19:44:57 2002
(c) Copyright 2001 Oracle Corporation.  All rights reserved.

Connected to:
Oracle9i Enterprise Edition Release 9.0.1.3.0 - 64bit Production
With the Partitioning and Real Application Clusters options
JServer Release 9.0.1.3.0 - Production

SQL> col sid format 999
SQL> col serial# format 9999999
SQL> col failover_type format a13
SQL> col failover_method format a15
SQL> col failed_over format a11
SQL> select sid, serial#, failover_type, failover_method, failed_over
     from v$session where username = 'SU';

       SID    SERIAL# FAILOVER_TYPE FAILOVER_METHOD FAILED_OVER
---------- ---------- ------------- --------------- -----------
        13          8 SELECT        BASIC           NO

If you see NONE under failover_type and failover_method, STOP!!  You need
to fix your tnsnames.ora file, it does not make sense to continue to test 
'shutdown abort' or reboot server.

SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
rac4

*** Due to the load balancing, we need to find out which instance it 
currently connects to.  Now, we can continue our TAF testing.  

SQL> select count(*) from
(select * from dba_source
union
select *  from dba_source
union
select *   from dba_source
union
select *    from dba_source
union
select *     from dba_source)
/

*** At this point, I ‘shutdown abort’ rac4 from another window.  The query
did not stop and the result should be back.  

COUNT(*)
----------
     60221

*** The query results is back without any error.  

SQL> col sid format 999
SQL> col serial# format 9999999
SQL> col failover_type format a13
SQL> col failover_method format a15
SQL> col failed_over format a11
SQL> select sid, serial#, failover_type, failover_method, failed_over
     from v$session where username = 'SU';

       SID    SERIAL# FAILOVER_TYPE FAILOVER_METHOD FAILED_OVER
---------- ---------- ------------- --------------- -----------
        13          5 SELECT        BASIC           YES

SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
rac1

*** Note here, it failed over to rac1 with different serial# and 
failed_over flag was set.
 
Restarted rac4, make this database back to 4 instances database.

SQL> select count(*) from
(select * from dba_source
union
select *  from dba_source
union
select *   from dba_source
union
select *    from dba_source
union
select *     from dba_source)
/

*** At this point, I ‘shutdown abort’ rac1 from another window.  The query 
did not stop and the result should be back.  


  COUNT(*)
----------
     60221
The query results is back without any error.  

SQL>          
    SID    SERIAL#    FAILOVER_TYPE FAILOVER_METHOD FAILED_OVER
---------- ---------- ------------- --------------- -----------
        14         20 SELECT        BASIC           YES

SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
rac2

*** Note here, it failed over to rac2 with different sid, serial# and 
failed_over flag was set.


Troubleshooting:

If there still is a problem, you should send the screen print out together 
with the following into to the support:

1. listener.ora, tnsnames.ora, sqlnet.ora files from all server nodes
2. 'lsnrctl services' output from all server nodes, please note: 
'lsnrctl status' output is not sufficient. 
3. init.ora, common.ora, and spfile converted init.ora if any, from all 
server nodes
4. in sql session, spool out the following info:
show parameter db_name
show parameter db_domain
show parameter service_name
show parameter instance_name
show parameter listener

5. ‘hostname’ output and /etc/hosts file or nslookup `hostname` output.
6. tnsnames.ora, sqlnet.ora files from the client side
7. sqlnet.log files from both client and server, listener.log file from the 
server
8. In sqlnet.ora files on both client and server, please set up the tracing 
parameters as follows and send us the sqlnet client/server trace files from 
both client and server sides.
trace_level_client = 16
trace_unique_client = on
# please provide a valid directory with write permission for the following 
parameter
trace_directory_client = /oracle/9iship/rac901/network/trace 
trace_level_server = 16
# please provide a valid directory with write permission for the following 
parameter
trace_directory_server = /oracle/9iship/rac901/network/trace  
trace_timestamp_client = on
trace_timestamp_server = on

9.  When you finish the testing, please make sure that you comment out the 
following two lines.  
# trace_level_client = 16
# trace_level

반응형
Posted by [PineTree]
ORACLE/ADMIN2007. 12. 7. 00:16
반응형


DATABASE LINK 사용 방법
=======================


먼저 한글 data간의 전달을 위해 두 db간의 character set이 같아야 합니다.
character set을 확인하는 방법은

sqlplus system/manager
select * from v$nls_parameters;
하여 보면 nls_characterset에 대한 값이 나옵니다.

 
  예를 위해 다음과 같은 환경을 가정하겠습니다.
    
           HOST NAME    :      HP7     -       SUN7      
      
           ORACLE_SID   :      ORA7   -    ORATEST 
    
  이라 할 때

  1)  HP7 에서 SUN7로 DB LINK 생성하기. 

 

      scott/tiger 로 Login

    SQL*NET V1의 경우
      SQL> create public database link  HP7TOSUN6
                connect to scott identified by tiger
                using 't:SUN7:ORATEST';

    (rdbms 7.3 이상은 SQL*NET v2 를 사용하십시오)


    SQL*NET V2의 경우

 

create [public |private] DATABASE LINK {사용할 링크 명}
 CONNECT TO {접속 아이디} IDENTIFIED BY {접속암호}using'연결문자열';   

 

 public 일 경우 모든 사용자가 사용할 수 있으며 pribate일 경우에는 생성한 사용자만 사용할 수있다.
 
 링크 이름을 지정하는 데 숫자가 먼저 올 수 없다.


      SQL> create public database link HP7TOSUN7
           connect to scott identified by tiger
           using 'ORATEST';

      로 하면 된다.

      이 때 V2인 경우의 ORATEST는 $ORACLE_HOME/network/admin/ directory의
      tnsnames.ora file 내에 지정된 service name이다.
      tnsnames.ora의 service name이 잘 setting 되어 있는지 확인하는 방법
      : SQL*Plus scott/tiger@service name했을 때, SQL*Plus에 log-in되어야
      합니다.
    

  2> SUN7 에 있는 TABLE의 select 및 view(view는 필요에 따라 생성) 작성,
     HP에서 작업
   
      SQL> select * from emp@HP7TOSUN7;

      SQL> create view emp_view as select *
           from emp@HP7TOSUN7 a
           where a.deptno = 10;
                   
  3> HP7 에서 SYNONYM을 생성하여 사용하는 경우

 

         SQL> create synonym emp for emp@HP7TOSUN7;
         SQL> select * from emp;

 

   로 한다면 간단히 분산 DB의 환경에서 사용할 수 있습니다.

  select를 제외한 DML(insert, update, delete)을 하려면,
  sql*plus log-in 시에 다음과 같은 option이 display 되어야 합니다.

  SQL*Plus: Release 3.3.3.0.0 - Production on Mon Jan 19 14:18:47 1998
  Copyright (c) Oracle Corporation 1979, 1996.  All rights reserved.

  Connected to:
  Oracle7 Server Release 7.3.3.4.0 with the 64-bit option - Production
  Release With the distributed, ......
  ------------------------------------

  remote 작업의 예

  select * from table_name@HP7TOSUN7;
  insert into table_name@HP7TOSUN7;
  delete table_name@HP7TOSUN7;
  ...

  (단 SERVER TO SERVER로 NETWORK 환경이 구축되어 있어야 하고,
  listener 가 반드시 떠 있어야 합니다.)

 

DATABASE LINK 삭제하기

 
 DROP [public|private\ database link {삭제할링크 명};

 

==db links 조회

 

==USER ACCOUNT

SELECT * FROM USER_DB_LINKS

 

--DBA ACCOUNT

SELECT * FROM DBA_DB_LINKS

 

/* NEW 오라클 테이블 비우기 */
select 'truncate table '||table_name||';' from user_tables;


 

/* NEW 오라클 노로깅 */
select 'alter table '||table_name||' nologging;' from user_tables ;


 

/* NEW 오라클 index drop */
select 'drop index '||object_name||';' from user_objects
where object_type = 'INDEX';


 

/* NEW 오라클 인서트  */
select 'insert /*+ append */ into '||table_name||' select * from '||table_name||'@dblinkname;'
from user_tables
where owner = 'KVDBA';


 


/* NEW 오라클 테이블 로깅으로 변경 */
select 'alter table '||table_name||' logging;' from user_tables;


덧글. 오라클이 CBO이면 analyze 를 수행할것을 권장...

반응형

'ORACLE > ADMIN' 카테고리의 다른 글

오라클 캐릭터 셋 변경(CHARACTER SET)  (0) 2008.04.02
오라클 파라미터 관련 사이트 링크  (0) 2007.12.13
oracle lock  (0) 2007.08.14
ORACLE relink  (0) 2007.08.07
Oradebug Command  (0) 2007.08.04
Posted by [PineTree]
ORACLE/SQL2007. 11. 17. 01:08
반응형

▶ DB에 있는 모든 Table 이름보기

    select table_name from user_tables

 

테이블 명 바꾸기 A -> B

 

alter table  A rename to B

 

   ▶ Table의 Primary Key 찾기

    select * from user_ind_columns where table_name = 'CodeTable'

   ▶ 인수전달

 

    select * from user_ind_columns where table_name = '&1' 

   →; save key 

      SQL> start key CodeTable

   ▶ 서로 연결되는 Key를 찾는 방법 

   select constraint_name, constraint_type, r_constraint_name  

    from user_constraints

       where table_name = 'TABLE_NAME

  ▶ TABLE 구조 보기

    DESC TABLE_NAME

   ▶ Constraint 확인

    select table_name, constraint_name, constraint_type

      from user_constraints

    where table_name in ('DEPARTMENT','EMPLOYEE');

   ▶ 테이블 COPY 하기

    create table emp_41

    as

    select id, last_name, userid, start_date from s_emp

    where dept_id = 41;

    → where절에 엉뚱한 조건을 주면 emp_41이란 이름으로 테이블이 만들어진다.   

   ▶ 선택한 Row만큼만 보여주기

    select * from tmp_table

    where rownum <= 100

    → 이렇게 하면 데이터가 10000건이 있더라도, 1~100건만 보여주게 된다.

   ▶ 오라클의 모든 유저 보기

    select * from all_users

    KO16KSC5601 이면 한글...

    US7ASCII 이면 영문이다. → regedit에서 편집하면 간단히 해결.

   ▶ Space 있는 값을 Null로 비교

    RTRIM(a.ymd_myun) IS NULL

   ▶ Desc명령으로 Table구조 보는 효과와 같은 방법

    SELECT column_name, data_type, data_length, nullable FROM cols

    WHERE table_name = 'YTB_CARCOM'

    → 반드시 테이블명은 대문자 이어야 한다.

   ▶ Function Script 보는 방법.

    select text from user_source where name = 'FUNCTION_NAME'

   ▶ 요일 찾는 방법.

    select TO_CHAR(sysdate,'D') from dual

반응형

'ORACLE > SQL' 카테고리의 다른 글

&lt;25가지 SQL작성법&gt;  (0) 2008.02.19
oracle에서 hint의 사용  (0) 2008.02.14
Materialized View 설명  (0) 2008.02.14
유용한 오라클 명령어  (0) 2008.01.28
demobld.sql  (0) 2007.09.17
Posted by [PineTree]
ORACLE/TUNING2007. 11. 16. 00:40
반응형
Toad를 이용한 DB튜닝방법

 

 

DBA에게 유용한 Toad의 숨은 기능 찾기

박중수 | 엔커블루 기술본부 대표 컨설턴트

기업에서의 데이터 증가는 기하급수적으로 늘어나고 있으며 그에 따른 데이터베이스 성능도 대용량을 처리할 수 있도록 발전하고 있다. 따라서 데이터베이스 관리자는 예전과 달리 데이터베이스의 운영을 매뉴얼하게 할 수 있는 상태에 직면해 있으며, 자동화된 모니터링 및 Alert!s로 안정적인 서비스에 대응할 수 있는 툴을 원하고 있다. 이러한 요구사항을 위한 토드의 GUI 환경에서의 데이터베이스 모니터링 기능을 살펴보자.

데이터베이스 개발에 있어 토드(Toad)를 사용하는 사람들은 일반적으로 “토드는 개발자들을 위한 개발 툴”이란 생각을 많이 한다. 즉 단순히 SQL 문장이나 PL/SQL 문장을 빠르고 쉽게 개발할 수 있고, 데이터베이스 객체의 생성 및 변경 작업을 GUI 환경에서 간단하게 수행하며 소스코드 상의 문제점들을 자동으로 찾아주고, 디버깅 기능을 통해 개발자들의 수고를 덜어 줄 수 있는 툴 정도로만 인식하고 있는 것이다. 하지만 토드를 좀 더 세밀하게 들여다보면 개발자만을 위한 툴이 아닌 데이터베이스를 관리(management)하는 DBA(Database Administrator)가 사용할 수 있는 다양한 기능들이 숨겨져 있다. 이 글에서는 토드에 숨겨진 유용한 기능에 대해 소개하고자 한다.

DBA의 역할은 무엇일까?

 

DBA는 현재 운영되고 있는 시스템, 데이터베이스, 애플리케이션, 네트워크, 서비스 등의 다양한 환경을 구성하고 설치, 보안, 운영 및 설계나 개발 단계에 직, 간접적으로 참여해 전체 구성이 원활하게 유지되도록 하는 업무를 담당하고 있다.
이러한 업무를 수행하다 보면 원하는 서비스가 제대로 동작하지 못하고 특정 부분에 대한 장애가 발생하거나 알 수 없는 그 무엇인가에 의해 성능이 원하는 만큼 나오지 않을 경우도 있다. 특히 DBA에게 내·외적 요소에 의한 뜻하지 않는 돌발상황으로 인해 소비되는 시간이나 노력은 가장 큰 부담이다. 이럴 경우 DBA는 누군가가 현재의 시스템이나 데이터베이스의 부하 없이 효율적으로 문제점을 찾아내어 원인 파악을 해주고 문제점을 해결할 방법을 제시해 준다면 하늘로 날아갈 것 같은 기분을 느낄 것이다.
실제 DBA들은 이로 인해 발생하는 비용을 최소화하기 위해 툴을 사용한다. 하지만 문제점을 감지하는 툴, 문제점을 분석하는 툴, 문제점을 해결하는 툴에 이르기까지 다양한 툴 도입에 따라 발생하는 비용 부담과 함께 툴을 효과적으로 사용하고 있는가를 생각해보면 힘이 빠질 수밖에 없다.
이 글에서는 툴을 효과적으로 사용할 수 있는 정보를 제공하기 위해 가장 널리 사용되는 토드라는 데이터베이스 개발 툴을 선택했다. 특히 토드는 개발 툴 위주로 개발이 됐지만 ‘DBA 모듈’이라는 옵션 기능이 있어 토드 하나만 갖고도 데이터베이스를 최적의 상태로 유지할 수 있는 기능이 있다. 물론 전문적으로 감지·분석·해결에 초점을 맞춘 방대한 툴과의 비교는 어렵겠지만 그래도 적은 비용으로 문제를 해결할 수 있는 솔루션이 있다면 좋지 않겠는가.

DB의 문제점을 발견하라!

토드를 구입했다고 해서 DBA 기능을 전부 사용할 수 있는 것은 아니다(‘토드 DBA 모듈’은 옵션 제품이다). 제품을 구입할 당시에 DBA 모듈이라는 제품을 추가적으로 구입해야 사용이 가능하다. 하지만 개발 위주의 작업이 아닌 전사적인 방법으로 토드를 사용할 것이라면 추천할 만한 사항이라고 생각한다. 그러면 자신이 사용하고 있는 토드를 갖고 이 DBA 기능을 어떻게 사용할 수 있을까?
확인할 수 있는 가장 간단한 방법은 토드의 메인 메뉴 중에서 DBA 메뉴를 클릭해 보면 그 아래 리스트가 길게 나와 있느냐 짧게 나와 있느냐에 따라 확인할 수 있다. <화면 1>처럼 길게 리스트가 나온다면 DBA의 기능을 최적의 상태에서 사용할 수 있다는 뜻이다. 그럼 토드의 DBA 기능을 Detect, Diagnostic, Resolve라는 3개의 단계에 초점을 맞추어 살펴보자.

<화면 1> DBA 메뉴


데이터베이스에 문제가 발생하면 DBA는 일단 원인부터 파악한다. 하지만 어느 부분이 문제가 있는지를 감지하기란 사막에서 모래알을 찾는 것만큼 어려운 일이다. 토드에서 지원하고 있는 DBA 기능 중에서 데이터베이스 모니터(Database Monitor), 헬쓰 체크(Health Check), 인스턴스 매니저(Instance Manager)를 통해 현재의 데이터베이스 상태를 감지할 수 있다.

데이터베이스 모니터

우선 데이터베이스 운영자는 데이터베이스의 성능을 높이기 위해 물리적인 I/O의 병목현상을 제거함으로써 시스템의 메모리와 CPU 자원의 경합을 줄이며 안정적인 서비스를 제공할 수 있다. 그리고 데이터베이스 운영자는 각 세션들에서 발생되는 Wait Event(네트워크 통신이나 I/O 요청 또는 데이터베이스의 특정 자원을 여러 프로세스가 동시에 액세스할 때 발생하는 경합에 의한 대기)의 원인을 제거함으로써 원활한 응답속도를 유지해야 한다.
데이터베이스 모니터 기능은 데이터베이스의 Data Dictionary (V$SYSSTAT, V$SYSTEM_EVENT)를 이용해 메모리, I/O, Latch, 세션 그룹으로 나눠 관련 정보를 추출해 <화면 2>와 같이 9가지 그룹으로 사용자가 Refresh Rate(Interval)를 적용해 주어진 시간에 따라 변화되는 모습을 한 화면에서 볼 수 있다. 이에 성능과 관련된 문제점을 쉽게 파악할 수 있으며, 성능에 지장을 초래한 SQL의 진단 또는 초기 파라미터를 조정할 수 있다.

<화면 2> 데이터베이스 모니터


◆ 데이터베이스 모니터의 주요 기능
① Auto Refresh 설정 기능
② Refresh Rate 설정 기능
③ Alert!s에 대한 Propagation 기능
④ 데이터베이스의 Data Dictionary(V$) 정보 그래픽 디스플레이 기능

이터베이스 모니터의 그래프 정보
① Logical I/O : 논리적인 I/O는 SGA(메모리)에 존재하는 데이터베이스 블럭의 Change, Current, Consistent Read들에 대한 통계 추이의 정보
② Physical I/O : 물리적인 I/O는 데이터파일(디스크)의 해당 블럭을 읽어 SGA(메모리)로 올리거나 또는 메모리에서 변경된 블럭을 데이터파일(디스크)로 작성, 그리고 LGWR에 의해서 온라인 리두(redo) 로그 파일로 작성되는 통계 추이의 정보
③ Event Wait : 데이터베이스는 시스템 또는 세션별로 발생하는 Wait 이벤트 통계 정보를 누적해 기록하는데 풀 스캔(Full Scan)시 I/O를 요청하고 대기하는 ‘Mulit-block Read’, 인덱스 스캔시 I/O를 요청하고 대기하는 ‘Single-block Read’, 테이블 스캔시 버퍼 캐시를 거치지 않는 ‘Direct Patch Read’ 등의 통계 추이의 정보
④ Sessions : Sessions는 데이터베이스에 접속한 모든 세션들을 활동 세션(active), 백그라운드 세션(system), 아이들(Idle) 세션으로 분류해 표현한 정보
⑤ all Rates : 사용자가 요청한 SQL에 대한 구문 분석(parse), 실행(execute), 변경 정보 영구저장(commit), 변경 정보 취소(rollback) 정보
⑥ Miss Rates : 데이터베이스의 대표적인 성능 지표인 버퍼 캐시(Buffer Cache) 미스율, 라이브러리/딕셔너리 미스율(SQL Area), 래치 미스율(Latch)의 정보
⑦ SGA Memory Usage : SGA에 할당된 메모리의 사용률에 대한 정보(Shared Pool, 버퍼 캐스, 로그 버퍼)
⑧ Shared Pool : SGA에 할당된 메모리 중 SQL에 대한 공유 메모리의 Detail 사용률에 대한 정보(라이브러리 캐시, 딕셔너리 캐시, Misc Area 등)
⑨ Index Query % : 데이터베이스에서 사용된 SQL 중 쿼리에 대해 인덱스 사용(Indexed %)과 미사용(Non-Indexed %)에 대한 정보

데이터베이스 모니터의 Alert!
그렇다면 DBA는 현재 데이터베이스가 문제점이 있는지의 여부를 판단하기 위해 항상 데이터베이스 모니터링 툴을 보고만 있어야 하는가? 그렇다면 진정한 탐지 툴(Detection Tool)이라고 할 수가 없을 것이다. 이를 위해 Alert! 기능을 제공한다. 토드 옵션의 데이터베이스 모니터를 찾아보면 모니터링하고자 하는 앞의 9가지 항목들에 대해 임계치(Thresholds)를 설정해 해당 임계치에 도달하면 Alert!를 DBA에게 보여줄 수 있도록 지정할 수도 있다. 그러면 토드가 설치되어 있는 PC의 맨 아래에 Toad Database Monitor라는 아이콘이 나타나서 DBA에게 신호를 보내준다.

헬쓰 체크

데이터베이스 구축 후 시간이 지남에 따라 데이터의 크기는 현저하게 증가하게 되고 또한 다양한 문제점들이 나타나게 되는데, 인스턴스에서 발생하는 문제점들을 DBA가 찾아서 조치하기에는 시간과 비용이 만만치 않다. 이에 DBA는 C 검사를 원하는 항목(SGA, Analyze, Extent, JOB……)들에 대해 조건을 설정한다. 해당 조건을 만족하는 내용에 대해 자동으로 체크해 결과를 보여준다면 DBA의 역할은 그만큼 줄어들 것이며, 이를 통해 데이터베이스에 지장을 초래할 수 있는 원인들을 미연에 방지할 수 있다.

◆ 헬쓰 체크의 주요 기능
① 전체의 아이템을 수행하거나 특정한 아이템만 선택해 체크할 수 있다.
② 분석 결과에 대한 리포트
③ SGA 사용 내역
④ Unanalyzed Segments(테이블, 인덱스, 파티션 테이블/인덱스)
⑤ 100개가 넘는 Extent를 소유한 세그먼트
⑥ JOB의 Broken, Sysdate보다 이전의 JOB, Long running JOB 등

<화면 3>은 토드의 헬쓰 체크 기능을 수행한 화면이다. 여기에는 Checks and Options, Other Settings, Report Output 등 3가지 탭으로 구성되어 있는데, Check and Options 탭에서 이미 지정되어 있는 다양한 인스턴스 체크 사항 중에서 원하는 항목을 지정하고 그에 따른 값을 입력하고 실행하면 Report Output 탭에 Health Check를 수행한 결과를 보여준다.

<화면 3> 데이터베이스 헬쓰 체크


인스턴스 매니저

이 기능은 현재 동작 중인 데이터베이스의 인스턴스에 커넥션을 자동으로 수행해 Startup 상태인지 Shutdown 상태인지를 체크할 수 있으며, 토드에서 직접 Startup/Shutdown 명령을 수행하거나 Init 파라미터 파일을 빌딩(building)할 수도 있다.

<화면 4> 인스턴스 메니저


DB의 문제점을 분석하라!

데이터베이스의 문제점을 파악했으면 과연 이 문제점의 원인은 무엇이며, 현재 데이터베이스 성능에서 병목현상(Bottleneck)이 발생하는 영역은 어디인지에 대해 자세하게 분석해야 한다.
분석 작업은 시작해야 하는 포인트가 중요하다. 예를 들어, 오라클 데이터베이스에서 현재 심각하게 성능이 다운되는 현상이 발생하고 있다면 과연 이 문제가 메모리 쪽인지, I/O 쪽인지, I/O라면 데이터파일인지 리두 로그 파일인지를 파악해야 한다. 메모리라면 Shared Pool인지 데이터베이스 버퍼 캐시인지 리두 로그인지 판단해야 한다. DBA 입장에서 특정 문제점이 발생한 영역을 알 수 있다면 그 부분을 집중적으로 분석해 문제점을 해결해야 하는데, 토드는 이러한 분석을 쉽게 할 수 있는 다양한 기능들을 갖고 있다.

Database Probe

데이터베이스의 구성은 크게 메모리(SGA), 프로세스, 데이터파일(Online Redo Logfile, User Datafile)로 구성되며 서버 프로세스와 백그라운드 프로세스에 의해 자동적으로 운영된다. Database Probe는 <화면 5>와 같이 3개의 그룹으로 나뉘어 각 그룹별로 중요한 정보를 보여주게 된다.

<화면 5> Database Probe


먼저 프로세스 부분은 전용 서버 프로세스와 공유 서버 프로세스의 수 및 병렬 처리 내용과 데이터베이스 서버 프로세스가 사용하는 독점 메모리인 PGA 메모리의 사용 현황의 관계를 보여주고 있으며, 메모리(SGA) 부분은 서버 프로세스가 데이터를 처리하는 버퍼 캐시, SQL과 PL/SQL 문장을 저장하기 위한 Shared Pool, 공유 서버의 세션 정보를 저장하는 Large Pool, 데이터 블럭의 변경된 정보(Before/After)를 저장하는 리두 로그 버퍼, 자바 프로그램을 이용하는 영역의 Java Pool의 사용률을 보여주며, 마지막으로 데이터파일 부분은 파일의 크기와 현재까지의 사용률을 그래픽하게 처리하고 있어 데이터베이스의 전반적인 리소스를 얼마나 사용하고 있는지를 시각적으로 판단해 데이터베이스의 초기 파라미터 및 데이터파일의 크기 또는 리두 로그 파일의 크기 및 개수 등을 조정하는 데 필요한 정보를 제공한다.

◆ Database Probe의 주요 기능
① SGA 각 영역의 Hit Ratio 및 사용률 및 Wait/Retry 정보
② 전용 서버 프로세스 및 공유 서버 프로세스의 수 및 PGA 정보
③ 데이터파일의 전체 크기 및 사용률

Top Session Finder
현재 시스템에서 특정 리소스를 많이 사용하는 오라클 세션들을 발췌해 탑 리스트(Top List)로 보여준다. 앞의 Database Probe를 이용해 현재 데이터베이스 측면을 분석했으면, 그 내부에서 작업 중인 세션들에 대한 자세한 정보를 분석해야 할 것이다. 하지만 그 많은 세션들을 일일이 분석하기란 여간 힘든 일이 아니다. 그 중에서 시스템의 리소스를 많이 사용하는 세션이 문제점을 갖고 있기 때문에, 그에 따른 이벤트 정보를 토대로 탑 세션을 발췌한다. 예를 들어 CPU를 많이 사용하는 탑 세션, I/O를 많이 발생시키는 탑 세션처럼 DBA가 원하는 시스템 리소스 측면을 강조한 기능이라고 할 수 있다. <화면 6>에서는 세션들 중에서 ‘session logical reads’, 즉 논리적인 읽기가 큰 세션부터 내림차순으로 정렬된 정보를 Dataset 형태로 제공하고 있다.

<화면 6> Top Session Finder


◆ Top Session Finder의 주요 기능
① CPU, 메모리, 커서(CURSORS) 등과 같은 자원 그룹별로 문제 세션을 검색
② 데이터베이스 세션 정보의 결과를 Dataset 형태나 Pie Chart 형식으로 제공

세션 브라우저
세션 브라우저 기능은 데이터베이스에 접속 중인 모든 세션들에 대해 총괄적으로 세션 액티비티(Session Activity)를 분석하기 위해 제공된 기능이다. <화면 7>은 특정 세션의 Wait Event에 대한 상세 정보를 ‘Current Waits’와 ‘Total Waits’로 분리해 제공하고 있다. 특정 세션을 선택하면 다음과 같은 상세정보를 동적으로 추출할 수 있다.

<화면 7> 세션브라우저


- 세션 : 선택한 세션의 ID, 프로그램, 모듈, Machine, OS 유저, DB 유저 등의 정보를 제공
- 프로세스 : 선택한 세션의 프로세스 정보 제공
- I/O : 선택한 세션이 발생시킨 I/O 정보인 읽기/쓰기 정보 제공
- Waits : 선택한 세션에서 발생한 Wait Event 정보 제공
- Current Statement : 선택한 세션에서 수행 중인 SQL 문장 정보 제공
- Open Cursors : 선택한 세션이 오픈한 커서 정보 제공
- Access : 선택한 세션이 액세스한 객체 정보 제공
- Locks : 세션 잠금 정보 제공
- RBS Usage : 선택한 세션이 사용한 롤백 세그먼트(Rollback Segment) 정보 제공
- Long Ops : 선택한 세션이 배치(Batch)성 작업을 수행했을 경우 현재까지 진행된 상황에 대한 정보 제공
- Statistics : 선택한 세션에 대한 통계 정보 제공

OS 유틸리티
이 기능은 데이터베이스 측면이 아닌 데이터베이스가 동작 중인 시스템(OS) 부분의 정보를 분석하고자 할 경우 사용한다. 유닉스나 윈도우 계열의 OS를 사용할 경우 또는 해당 OS에 해당되는 정보를 분석하고자 할 경우 유용하게 사용할 수 있다. <화면 8>은 CPU의 사용률을 시스템, 사용자를 구분해 사용되고 있는 정보와 프로세스 정보 및 디스크 I/O에 대한 정보를 그래프로 제공하고 있어, 시스템의 전반적인 자원 사용율을 나타내고 있다.

<화면 8> OS 유틸리티 메뉴


<화면 9> 유닉스 모니터


DB상의 문제점을 어떻게 해결할 것인가?

데이터베이스의 문제점을 감지(detect)하고 분석(diagnostic)했으면, 그에 따른 행동을 취해야 한다. 일반적으로 제시하는 해결방안은 시스템 튜닝, 데이터베이스 튜닝, 애플리케이션 튜닝, SQL Statement 튜닝으로 구분할 수 있는 데, 토드에서는 문제점을 해결하기 위한 다양한 기능이 존재한다.

테이블 스페이스와 테이블 스페이스 맵

이는 데이터베이스의 논리적 구조를 이루는 가장 핵심적인 요소이다. 데이터베이스의 데이터가 존재하는 물리적인 데이터파일과 연결되어 있으며, 그 안에 세그먼트, 익스턴트(Extent), 블럭이라는 구조가 존재하고 있다. 만약 테이블 스페이스의 공간이 부족하거나, 데이터파일에 Fragmentation이 발생해 장애가 발생한 경우라면 해당 테이블 스페이스의 공간을 늘려주는 작업과 그 안에 존재하는 Fragmentation을 Coalesce하는 작업을 수행해 다시 재구성하는 문제를 생각해야 할 것이다. 또한 이로 인해 I/O Wait가 발생해 성능이 떨어지는 원인이 된다면 해당 데이터파일도 다시 재구성하거나 재구축하는 절차를 수행해야 한다. 이러한 과정을 손쉽게 수행할 수 있도록 하는 기능이 바로 테이블 스페이스 기능이다.
토드에서 테이블 스페이스와 데이터파일에 대한 정보를 변경할 수 있으며, 프리 스페이스(Free Space)와 해당 테이블 스페이스에 존재하는 객체 정보를 확인할 수 있다.
그리고 뒤에 있는 Space History와 I/O History 탭에서는 특정 테이블 스페이스나 데이터파일에 대한 Capacity Plan 정보를 확인할 수 있다. <화면 10>은 데이터베이스의 각 테이블 스페이스에 대해 할당된 크기와 가장 큰 연속된 공간 및 프리 스페이스를 보여주고 있다. 만약에 특정 세그먼트의 크기가 부족해 확장될 때 ‘MAX Mb’의 값보다 크다면 확장하지 못하고 에러가 발생하게 된다. 따라서 DBA는 이러한 정보로 각 테이블 스페이스에 속한 오브젝트 중 MAX 값보다 큰 테이블이나 인덱스가 존재한다면 해당 테이블 스페이스에 데이터파일을 추가한다거나 다음 익스턴트의 크기를 줄이기 위해 테이블과 인덱스의 NEXT 옵션을 변경해야 할 것이다.

<화면 10> 테이블 스페이스 예


또한 특정 테이블 스페이스의 물리적인 구조 중에서 가장 작은 단위인 블럭들을 그래픽하게 보여줘 해당 테이블 스페이스의 객체가 차지하고 있는 블럭의 갯수나 세그먼트 정보를 자세하게 확인할 수도 있으며, 데이터파일에 존재하는 Fragmentation도 분석해 Coalesce 과정을 수행할 수 있는데, 이 기능은 <화면 11>의 테이블 스페이스 맵을 활용해 수행할 수 있다.

<화면 11> 테이블 스페이스 예


     컨트롤 파일과 리두 로그 매니저
물리적인 데이터베이스 구조인 컨트롤 파일(Control File)과 리두 로그 파일(Redo Log File)에 대한 정보를 확인할 수 있으며, 로그 스위치(Log Switch), 리두 로그 파일 변경 작업, 아카이브 스타트/스톱(Archive Start/Stop)과 같은 특정 작업을 직접 수행할 수 있다. 컨트롤 파일은 데이터베이스의 물리적인 구조에 대한 정보를 저장하고 있으며 각 타입별로 레코드 세션(Record Section)을 사용하게 된다. <화면 12>에서의 컨트롤 파일의 상세내용을 보면 각 세션(“REDO LOG”, “DATAFILE”…)별로 최대 레코드를 갖고, 또한 사용량을 표시하는데, 만약 각 세션의 토탈 레코드들과 사용된 레코드가 동일하게 되면 더 이상 해당 세션에 대한 자원 할당을 할 수 없게 되므로 컨트롤 파일을 재생성해야 된다. 그리고 이러한 정보를 미리 확인해 대처할 수 있다.

<화면 12> 컨트롤 파일 관리


<화면 13> 칸트롤 파일과 리두 로그 매니저


Log Switch Frequency Map
<화면 14>는 하루를 1시간 그룹으로 구분해 각 시간대별로 로그 스위치의 발생 정도를 나타내어 트랜잭션 양을 파악할 수 있으며, 또한 하루 중에 가장 트랜잭션이 많은 시간대를 파악해 그 시간대에 발생할 수 있는 작업(Batch Job) 등을 다른 시간대로 변경해 수행할 수 있도록 하고 있다. Log Switch Frequency Map 기능은 현재 데이터베이스에서 발생하는 로그 스위치의 회수를 체크해 보여준다.

<화면 14> Log Switch Frequency Map


시간대별로 몇 번의 로그 스위치가 발생했는지 파악할 수 있으며 가장 많은 로그 스위치가 발생한 시간이 언제인지를 확인해 DBA로 하여금 로그 파일의 재구성과 리두 로그 버퍼의 크기에 대한 어드바이스를 받을 수 있도록 정보를 제공하고 있으며, 이를 통해 인스턴스에서 체크포인트의 발생 빈도를 예측할 수 있도록 해준다. DBA는 이 정보를 토대로 SGA 메모리의 최적화 상태를 점검할 수 있다.

Rebuild Objects
테이블 스페이스에 대한 문제를 해결하다 보면 그 안에 존재하는 특정 객체에 대해 다시 재구성해야 하는 경우가 발생한다. 테이블 스페이스 레벨에서만 문제가 해결되면 가장 좋겠지만 실제로는 데이터가 존재하는 테이블이나 인덱스 쪽에 더 무게를 둘 수밖에 없게 된다. 이 기능을 이용해 특정 테이블이나 인덱스 또는 특정 유저, 테이블 스페이스에 해당하는 객체에 대해 일괄적으로 또는 개별적으로 Rebuild 과정을 진행할 수 있다.

   Repair Chained Rows
데이터베이스의 block_size가 적거나 특정 테이블의 Row가 데이터베이스 블럭의 크기보다 큰 경우에 UPDATE 문장이 발생하는 테이블에 종종 발생되는 Chaining이나 마이그레이션이 일어나게 되는데, 이렇게 하나의 Row가 여러 블럭에 걸쳐 있으면 데이터베이스의 성능이 떨어지기 마련이다. 이 기능은 데이터베이스의 특정 테이블에서 Chaining이나 마이그레이션이 발생할 경우 해당 테이블을 분석해 Chained Row를 해결하고자 제공하는 기능이다. <화면 15>는 ‘CHAIN_TEST’ 테이블에 Chain된 Row가 약 3만 건 정도가 발생한 것인데, 화면 오른쪽에 ‘Repair’ 버튼을 누르면 Chained Row를 제거할 수 있게 된다.

<화면 15> Repair Chanined Rows


Export/Import! Utility Wizard와 SQL*Loader Wizard
Export/Import! Utility Wizard와 SQL*Loader Wizard는 오라클의 Export/Import! 명령과 SQL*Loader를 Wizard 를 통해 쉽게 구현할 수 있도록 제공하는 기능이다. Export/Import!를 이용해 일반적으로 해당 객체를 재구성하는 과정을 거치게 되는데 GUI 환경에서 누구나 손쉽게 사용할 수 있도록 제공하고 있으며, 테이블, 유저, 테이블 스페이스, 데이터베이스 모드를 모두 지원한다. 또한 SQL*Loader의 모든 기능을 지원해 컨트롤 파일을 구성할 경우 이미 지정되어 있는 많은 옵션들을 간단하게 설정할 수 있다.

Server Statistics
이 기능은 현재 인스턴스에 대해 통계 정보를 분석해 보여주며, 인스턴스 내부에 발생하는 다양한 항목들을 DBA가 확인할 수 있다.
Analysis, Waits, Latched, Session, Instance Summary 등의 5가지 탭을 통해 전체 데이터베이스의 통계 정보를 파악한다. 또한 데이터베이스에서 통계치의 값이 어떠한지에 대해 분석해 DBA에게 제시해 준다. 이를 통해 현재 통계정보의 부정확한 값들에 대한 어드바이스를 제시해 DBA로 하여금 최적의 인스턴스 상태를 유지할 수 있는 방향을 제시한다. DBA는 <화면 16>에서 빨간색으로 표시되어 있는 값들에 대해 체크해 인스턴스 환경을 수정할 수 있다.

<화면 16> Server Statistics, 데이터베이스의 대표적인 성능 지수들의 현재 값


이 외에 토드에서 지원되는 문제를 해결할 수 있는 기능을 보면 다음과 같다.

◆ Oracle Parameter and NLS Parameter : Server Statistics 기능에서 제시한 내용을 기준으로 특정 데이터베이스 파라미터를 수정할 경우, 이 기능을 사용해 쉽게 변경할 수 있다.

◆ New Database Wizard : 이 기능은 새로운 데이터베이스를 생성하기 위해 Create Database 명령을 수행하도록 하는 기능이다. DBA가 새로운 데이터베이스를 생성(create)하고자 할 경우 쉽게 GUI 환경에서 생성할 수 있도록 도와주는 위저드 기능이다.

◆ Compare Schema and Compare Database : 서로 다른 데이터베이스끼리 비교를 하거나 특정 스키마들끼리의 비교처럼 DBA가 특정 작업을 수행하기 이전과 이후에 대한 비교 작업을 수행할 경우 적용한다.

데이터베이스 브라우저 기능이란?

지금까지 DBA 기능에 대해 각 기능별로 소개를 했다. 하지만 DBA가 이 모든 기능들을 일일이 하나씩 확인한다면 이것 또한 너무 불편할 것이다.
이를 위해 토드에서는 데이터베이스 관리를 위해 필요한 내용들을 종합적으로 구성해 하나의 화면에서 확인하고 설정할 수 있도록 통합관리 체제로 관리하고 있다. 이 기능이 바로 데이터베이스 브라우저(Database Browser)이다. <화면 17>처럼 데이터베이스 브라우저는 하나의 데이터베이스를 기준으로 정보를 제공하는 것이 아니라 현재 네트워크 상에 존재하는 모든 데이터베이스를 한눈에 확인할 수 있도록 중앙집중 방식을 선택하고 있다. DBA가 A DB, B DB 등을 분산해 관리한다면 업무 효율성도 떨어질 뿐만 아니라 그로 인해 발생하는 시간과 노력에 대한 비용도 한이 없을 것이다. 데이터베이스 브라우저는 다음의 다양한 탭을 갖고 있다.

<화면 17> 데이터베이스 브라우저


◆ 데이터베이스 브라우저의 다양한 탭
- 오버뷰(Overview) : SGA 크기, Shared Pool의 크기, Hit Ratio, Event Wait 정보 확인
- 인스턴스 : 인스턴스 정보 확인
- 데이터베이스 : 데이터베이스 정보 확인
- Options : 해당 데이터베이스에 설정되어 있는 제품의 옵션 리스트 확인
- 파라미터 : 데이터베이스 파라미터 정보 확인
- 세션 : 현재 데이터베이스에 연결되어 있는 세션 정보 확인
- 탑 세션 : 현재 연결되어 있는 세션 중에서 탑 세션 리스트 확인
- RBS 액티비티 : 롤백 세그먼트의 액티비티 정보 확인
- Space Usage : 각 테이블 스페이스의 스토리지 파라미터 정보와 스페이스 정보 확인
- 데이터파일 I/O : 각 데이터파일의 토탈 사이즈, 프리 사이즈(Free Size)와 내부 블럭마다의 읽기/쓰기 회수 등에 대한 정보 확인

SQL 튜닝 엑스퍼트

SQL 튜닝 엑스퍼트는 토드의 DBA 모듈에 포함되어 있는 기능은 아니며, 토드의 엑스퍼트 튜닝 모듈(Xpert Tuning Module)에 있는 기능이다.
DBA가 시스템 퍼포먼스 튜닝만 수행하는 것이 아니라 그 안에서 동작하는 애플리케이션 튜닝에 더욱 많은 시간을 소비할 것이기 때문에 토드를 이용해 이 부분을 해결할 수 있는 방법을 제시하고자 한다. 데이터베이스를 운영하다 많이 접하게 되는 문제는 바로 잘못 작성된 SQL 문장이 될 것이다. 토드의 엑스퍼트 에디션은 현재 데이터베이스에서 잘못 작성되어 성능이 다운되는 요인이 되고 있는 SQL 문장을 찾아 가장 최적의 SQL 문장으로 바꿔주는 기능을 갖고 있다.
SQL 튜닝 엑스퍼트 기능은 SQL 에디터나 프로시저 에디터(Procedure Editor)에서 SQL 문장이나 PL/SQL 문장을 대상으로 개발시에 최적의 SQL과 PL/SQL을 만들고 싶을 경우이거나, 실행했으나 반응 시간(Response Time)이 너무 높게 나타나서 현재 환경에 맞는 최적의 문장을 만들고 싶을 경우 사용한다. 일단 SQL 에디터와 프로시저 에디터 아이콘 버튼을 실행하면 SQL 튜닝 엑스퍼트라는 화면으로 이동할 수 있다. SQL 튜닝 엑스퍼트 화면의 왼쪽에는 네비게이터 패널(Navigator Panel)이라는 것이 있는데, 이 네비게이터 패널의 순서에 따라 SQL 튜닝 과정을 진행하면 된다. 다음은 SQL 튜닝 엑스퍼트에서 SQL 튜닝 과정을 진행하는 절차이다.

1단계, SQL Detail

여기서는 SQL 에디터나 프로시저 에디터에서 수행 중인 SQL 문장을 드래그해 Execution Plan과 해당 SQL 문장에 나타난 객체의 정보를 확인할 수 있다. Execution Plan을 통해 현재 SQL 문장이 어떻게 수행될 것이지 예측할 수 있으며, 해당 테이블에 생성되어 있는 인덱스나 컬럼의 정보를 확인할 수 있다.

<화면 18> SQL Detail Window


2단계, View Advice

이 부분은 현재의 SQL 문장에 대해 Execution Plan의 정보만 갖고 튜닝 액션을 결정할 수가 없을 경우 개발자나 DBA에게 현재 환경에 적합한 가장 최적의 SQL 솔루션을 제공한다.

<화면 19> View Advice Window


- Auto Tune : 이는 오라클 옵티마이저가 판단한 근거를 기준으로 자동으로 현재 SQL 문장에 맞는 최적의 솔루션 리스트를 제공한다. 이는 튜닝 초보자에게 적합한 것으로 SQL 튜닝에 대한 지식이 없더라도 튜닝 솔루션을 찾을 수 있게 한다.

- Advice : 이는 현재 환경에 적합한 Advice List를 보여줌으로써 어느 정도 숙련된 튜너가 자기가 생각한 튜닝 솔루션과 일치하는 사항을 찾아 수행할 수 있도록 정보를 제공한다.

- Manual Tune : 토드의 SQL 튜닝 엑스퍼트에게 의존하지 않고 직접 SQL 문장을 코딩하는 경우 사용한다.

3단계, Compare Scenario

Advice에서 선택한 사항을 토대로 Original SQL 문장과 Advice SQL 문장의 Explain Plan과 SQL 문장을 기준으로 비교할 수 있도록 정보를 제공한다.

<화면 20> Compare Scenario Window


4단계, Execution Scenario

Compare Scenario 스텝까지는 직접 SQL 문장을 실행하지 않은 상태에서 간접적으로 비교를 수행한 것에 반해 이 부분은 직접 Original SQL 문장과 Advice SQL 문장을 실행해 비교할 수 있는 정보를 제공한다. 만약 Trace 정보를 만들고 싶다면 옵션으로 지정할 수도 있다.
실행 과정이 끝나면 Original SQL과 Advice SQL에 대해 그래픽하게 비교할 수 있는 그림이 나타나며 이를 통해 시각적으로 최적의 솔루션을 찾을 수 있다.

<화면 21> Advice 적용 후 성능 향상 기대치 비교


- Index Advice : 만약 View Advice 단계에서 선택한 Advice가 인덱스를 추가·삭제·변경하는 작업이었다면 이번 단계에서는 인덱스에 대한 DDL 명령을 수행해야 한다. 하지만 이를 적용했을 경우 다른 SQL 문장이 영향을 받을 수 있기 때문에 조심스럽게 접근해야 할 것이다. 따라서 실제로는 실행시에 인덱스에 대한 DDL 명령을 수행하지 않고 버추얼하게 수행해 현재 데이터베이스에 영향을 주지 않는 선에서 비교할 수 있도록 정보를 제공한다.

- Rewrite : View Advice 단계에서 선택한 Advice가 문장을 바꾸는 선에서 제공되고 있다면, 현재 Original SQL문장을 대신할 수 있는 대체 SQL 문장을 선택한 경우이다. 이를 통해 현재 과정을 진행하면 Original SQL과 Advice SQL을 전부 실제로 실행하는 과정을 거치게 된다.

- Other Advice : DDL Advice나 SQL Rewrite가 아닌 다른 내용들을 제시한 것을 선택한 경우가 해당된다.

5단계, Execution Results

실행한 내용을 토대로 그 결과를 보여주며 실행시에 생성된 통계 정보를 비교할 수 있다. 토탈 CPU, Elapsed Time, Logical Read, Physical Read 등의 많은 통계 정보를 서로 비교할 수 있다.

6단계, Best Practice

앞의 Advice에서 선택한 사항을 토대로 실제 실행과정을 거친다. 예를 들어, 인덱스 생성 Advice를 선택했다면 4번 단계에서는 가상적으로 생성해 비교를 수행했는데, 이를 비교 검토 후 적용하는 과정이라고 생각하면 된다. 또한 추가적으로 수행할 때 더 적합한 내용들이 있다면, 예를 들어 분석 작업 같은 내용이 여기에 포함될 수 있는데 최적의 상태가 될 수 있는 리스트를 제시하면 튜너는 여기에서 원하는 내용을 선택할 수 있다.

7단계, Tuning Resolution

지금까지 진행해온 모든 사항을 기본으로 해 Original SQL과 Advice SQL에 대해 어느 정도 성능 효과를 보였는지를 확인할 수 있다.

토드의 다양한 기능을 습득하기 바라며

지금까지 토드에서 제공하는 DBA 모듈에 대한 일부 기능을 소개했다. 토드라는 툴은 너무나 많은 기능들을 갖고 있기 때문에 사용자의 입장에서 어떤 기능들이 토드에 있는지조차 모르는 경우가 다반사라고 생각한다. 이렇게 토드에는 숨겨진 많은 기능들이 독자의 업무에 도움이 될 수 있으면 하는 바람이다.

 

제공 : DB포탈사이트 DBguide.net

반응형
Posted by [PineTree]
ORACLE2007. 10. 22. 22:31
반응형

저번주까지 테스트서버를 구축해서 이번주는 현업이랑 개발자분들이 테스트를 하기 땜시 저는 한가하답니다.

그래서 몇자 끄적거려봅니다...^^;;

보통 유지보수하실때 Oracle ERP서버도 하시나요? 아마 잘 안하실것 같은데~

저는 오라클 엔지니어 생활을 쫌 하다가 Oracle ERP 까지 같이 작업하게 되었습니다.

처음엔 진짜 하기 싫었는데 사장님이 협박해서리...ㅠ ㅠ

근데 지금은 잘한 결정이라고 생각되네요~ 왜냐면 플젝 들어갈때 그냥 DBA보다는 단가가 살짝 높더라구요~ㅋㅋㅋ

이제 ERP 접한지도 2년이 넘었지만 아직 너무 많이 부족하답니다.

하지만 혹시나 도움이 되실까 하고...^^;;

가끔 오라클 엔지니어분이나 담당자분들이 ERP DB관련해서 많이 물어보는 내용을 몇 개 간추려 보려구요.

Oracle ERP는 말 그대로 package제품입니다.

user들의 편의를 위해서 약간의 개발을 하기도 하지만 package이기 때문에 그냥 설치하고 쓰는거죠.

그래서 어떻게 보면 담당자들이 이상한짓을 거의 안하기 땜시 일반적으로 작업하시는 DB보다 훨씬 관리하기가 쉽습니다.

그냥 하시던 대로 관리하시면 되는데 약간 다른게 있습니다.

한번 읽어두시면 나중에 도움이 쬐끔은 되겠죠~^^

 

 

 

1. DB user중에 apps 혹은 applsys user의 password를 변경하실때는 주의하셔야 합니다.
default로 apps user와 applsys user의 password는 "apps"입니다.
보통 alter user apps identified by <password>; 이렇게 하잖아요.
근데 ERP에서는 그렇게 하시면 Program이 안돌아갑니다.
왜냐하면 여러 환경파일속에서도 사용되고...구동되는 job(concurrent managers로 구동되는 job)들고 password를 물고 돌아가기 때문입니다.
또한 apps user와 applsys user의 password는 항상 같아야 합니다.
그래서 FNDCPASS utility를 사용해서 바꾸셔야 합니다.
부득이한 상황에서 manual하게 작업하기도 하지만 step도 많고 권장하지도 않습니다.
혹시나 담당자들이 password를 바꿔달라고 하면 그냥 쓰라고 하세요~ㅋㅋㅋ(DBA가 할 일이 아닙니다.)

 

2. Tablespace를 merge할수 있습니다.
많은 담당자들이 tablespace가 너무 많아서 관리가 어렵다고 하소연하는걸 많이 들었습니다.
11.5.9인가? 아무튼 그 버젼까지는 모듈별로 tablespace가 생성되서 tablespace의 갯수가 300개가 넘습니다.
아주 지랄같죠.
근데 OATM(Oracle Applications Tablespace Model and Migration Utility)이라는 utility를 이용하면 tablespace갯수를 13개정도로 줄일수 있습니다.
처음부터 이렇게 만들면 얼마나 좋습니까? 오라클 자슥들~!!!
아무튼 이렇게 tablespace를 merge하면 Dictionary managed에서 locally로 바꿀수도 있습니다.(SYSTEM tablespace는 별도로 locally로 작업해야 합니다.)
또한 저장공간 활용에 유리하고 관리도 용이합니다.
큰 작업이므로 단기간 프로젝트형식으로 작업해야 하는겁니다.
따라서 담당자들이 해달라고 하면...역시 그냥 쓰세요...!!!^^;

 

3. patch 방법이 좀 틀립니다.
당연히 우리가 DB에 적용하는 opatch(one-off)와 patchset은 똑같이 작업합니다.
하지만 readme파일을 보면 driver파일을 적용하는 패치들이 있습니다.
driver파일명은 u<patch_number>.drv / c<patch_number>.drv / d<patch_number>.drv / g<patch_number>.drv 이렇습니다.
이런 놈들은 adpatch utilty 이용해서 apply해야 합니다.
담당자들이 메타링크를 보다가 필요한 패치를 찾아서 적용해달라고 많이 요청합니다.
이런 패치는 DBA가 작업할것이 아니기 땜시...또 그냥 쓰세요!!! 하면 됩니다.

 

4. log data purge
ERP는 많은 job들이 돌아갑니다. report도 많이 뽑습니다. 제가 모듈쪽은 전혀 모르기 땜시 뭔짓을 하는지는 모르지만 항상 뭔가가 돌아갑니다...ㅋㅋㅋ
그래서 로그도 무지 많이 생깁니다.
로그가 아니더라도 담당자랑 상의한 후에 며칠,혹은 몇달치만 남기고 지워도 되는 그런 데이터도 많습니다.
그런 데이터가 table에 들어가기도 하고 파일로 서버에 떨어지는것도 많습니다.
게네들을 일일이 찾아서 손으로 지우면 환장하거든요.
그래서 친철한(?) 오라클은 purge와 관련된 Concurrent Request program을 제공합니다.
purge program을 돌리면 table과 파일 둘다 삭제됩니다.
가끔 안정화 프로젝트같은 단기간 플젝을 들어가면 정말 가관입니다.
우찌 한번도 안지웠을까나...
이런건 처음 세팅한 엔지니어가 나쁜X 입니다.
담당자는 잘 모르니가 엔지니어가 교육을 시켜주든지, 기본적인 문서를 줘야죠.
시스템이 점점 느려지는 이유가 될수도 있습니다.
엄청난 데이터를 날려주고 reorg하고 analyze해주어야 합니다.(sql tuning관련 이슈는 생기죠~^^)
만약 담당자가 메타링크에서 대충 보고 로그성 테이블을 날려달라고 하면 하지마세요.
반드시 program을 이용해서 지워야 합니다.
ERP는 여러 테이블이 연결되어있기 때문에 수동으로 작업하는건 거의 불가능합니다.

 

5. ORACLE_HOME의 구분
보통 DB를 사용할때 .profile에다가 몇개의 환경변수를 setting하잖아요.
그중에서 ORACLE_HOME의 경로를 setting하는데 ERP에서는 보통 두개가 있다고 생각하시면 됩니다.
하나는 application쪽 작업을 위한 806_ORACLE_HOME이구요.
다른 하나는 DB작업을 위한 RDBMS_ORACLE_HOME입니다.
따라서 편의를 위해서 ERP서버의 .profile에는 case문으로 선택해서 login하게끔 만들어 놓습니다.
case문에는 환경변수를 실행하게끔 되어있구요.
.profile에 직접 환경변수를 세팅하지 않구요. 환경변수가 들어있는 .env파일을 실행시킵니다.
RDBMS_ORACLE_HOME 위치에 <SID>_<hostname>.env라는 파일이 있습니다.
열어보시면 많이 보셨던 환경파일들이 있을겁니다.
가끔 오라클 엔지니어가 ERP DB점검하러 가서 script돌릴라고 하는데 DB접속이 안된다고 연락이 옵니다.
이럴때는 한번쯤 echo $ORACLE_HOME으로 확인해서 806이라고 나오면 잘못 접속하신겁니다.

 

6. analyze방법
보통 dbms_stats, 혹은 analyze명령으로 통계정보를 수집하잖아요.
근데 ERP에서는 "Gather schema statistics"등의 concurrent manager program을 이용하라고 recommand합니다.
내부적으로 fnd_stats.gather_schema_statistics라는게 돌아가고 아마도 그 놈이 dbms_stats를 호출할겁니다.
혹시 보시면 금방 아시겠지만 "ALL"로 지정하면 모든 schema소유의 table을 몽땅 analyze합니다.
근데 버그인지 몰라도 개발을 위해 따로 생성한 user는 잘 안되는 경우가 있어서 그 user꺼만 더 돌려주는게 좋습니다.

 

7. domain index에 주의
혹시 table reorg작업을 하실때 주의할 사항이 있습니다.
table을 reorg하면 그 table에 붙어있는 index들이 unusable되니까 rebuild를 해줘야 하잖아요.
ERP에는 intermedia나 Oracle Text등에서 사용되는 "domain index"라는 놈이 있는데요.
이 자슥이 unusable되면 alter명령으로 rebuild가 안됩니다.
에러코드보고 메타링크 찾으면 되겠지만서도...놀라실까봐 말씀드립니다...^^;;
저도 처음에는 깜짝 놀랬었걸랑요~ㅋㅋㅋ
보통 이놈들은 강제로 drop하고 새로 생성하는데요.
메타링크를 찾아보면 해당 domain index를 생성하는 script를 알수 있습니다. 그걸 슬쩍 돌려주면 잘 생성됩니다.

 

출처 :http://cafe.naver.com/prodba/3767   네이버카페 PRODBA  저자 : 부엌칼님

반응형
Posted by [PineTree]
ORACLE/Migration2007. 10. 9. 20:31
반응형
======================================================================================
create.. select..

CREATE TABLE TABLE1 AS SELECT * FROM TABLE2

======================================================================================
insert.. select..

INSERT INTO TABLE1 SELECT FROM TABLE2 [ WHERE 어쩌구 저쩌구 ]
INSERT INTO TABLE1 ( COL1, COL2, COL3 ) SELECT  COL1, COL2, COL3 FROM TABLE2 [ WHERE 어쩌구 ]

======================================================================================
LONG 타입 데이터 insert.. select.. 하기

create table t1(t1name long);
create table t2(t2name long);
create global temporary table t_long_temp(text_temp clob);
insert into t_long_temp select to_lob(t1name) from t1;
insert into t2(t2name) select  text_temp from t_long_temp;
반응형
Posted by [PineTree]
ORACLE/SQL2007. 9. 17. 23:29
반응형

CREATE TABLE EMP
       (EMPNO decimal(4) NOT NULL,
        ENAME varchar(10),
        JOB varchar(9),
        MGR decimal(4),
        HIREdate varchar(14),
        SAL number(7,2),
        COMM number(7,2),
        DEPTNO number(2));

INSERT INTO EMP VALUES
        (7369, 'SMITH',  'CLERK',     7902,
         '1980-12-17',  800, NULL, 20);
INSERT INTO EMP VALUES
        (7499, 'ALLEN',  'SALESMAN',  7698,
         '1981-2-20', 1600,  300, 30);
INSERT INTO EMP VALUES
        (7521, 'WARD',   'SALESMAN',  7698,
         '1981-2-22', 1250,  500, 30);
INSERT INTO EMP VALUES
        (7566, 'JONES',  'MANAGER',   7839,
         '1981-4-2',  2975, NULL, 20);
INSERT INTO EMP VALUES
        (7654, 'MARTIN', 'SALESMAN',  7698,
         '1981-9-28', 1250, 1400, 30);
INSERT INTO EMP VALUES
        (7698, 'BLAKE',  'MANAGER',   7839,
         '1981-5-1',  2850, NULL, 30);
INSERT INTO EMP VALUES
        (7782, 'CLARK',  'MANAGER',   7839,
         '1981-6-9',  2450, NULL, 10);
INSERT INTO EMP VALUES
        (7788, 'SCOTT',  'ANALYST',   7566,
         '1982-12-9', 3000, NULL, 20);
INSERT INTO EMP VALUES
        (7839, 'KING',   'PRESIDENT', NULL,
         '1981-11-17', 5000, NULL, 10);
INSERT INTO EMP VALUES
        (7844, 'TURNER', 'SALESMAN',  7698,
         '1981-12-8',  1500,    0, 30);
INSERT INTO EMP VALUES
        (7876, 'ADAMS',  'CLERK',     7788,
         '1983-1-12', 1100, NULL, 20);
INSERT INTO EMP VALUES
        (7900, 'JAMES',  'CLERK',     7698,
         '1981-12-3',  950, NULL, 30);
INSERT INTO EMP VALUES
        (7902, 'FORD',   'ANALYST',   7566,
         '1981-12-3',  3000, NULL, 20);
INSERT INTO EMP VALUES
        (7934, 'MILLER', 'CLERK',     7782,
         '1982-1-23', 1300, NULL, 10);

CREATE TABLE DEPT
       (DEPTNO number(2),
        DNAME varchar2(14),
        LOC varchar2(13) );

INSERT INTO DEPT VALUES (10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO DEPT VALUES (20, 'RESEARCH',   'DALLAS');
INSERT INTO DEPT VALUES (30, 'SALES',      'CHICAGO');
INSERT INTO DEPT VALUES (40, 'OPERATIONS', 'BOSTON');

CREATE TABLE BONUS
        (ENAME varchar2(10),
         JOB   varchar2(9),
         SAL   number(7,2),
         COMM  number(7,2));

CREATE TABLE SALGRADE
        (GRADE number(1),
         LOSAL number(7,2),
         HISAL number(7,2));

INSERT INTO SALGRADE VALUES (1,  700, 1200);
INSERT INTO SALGRADE VALUES (2, 1201, 1400);
INSERT INTO SALGRADE VALUES (3, 1401, 2000);
INSERT INTO SALGRADE VALUES (4, 2001, 3000);
INSERT INTO SALGRADE VALUES (5, 3001, 9999);

반응형

'ORACLE > SQL' 카테고리의 다른 글

&lt;25가지 SQL작성법&gt;  (0) 2008.02.19
oracle에서 hint의 사용  (0) 2008.02.14
Materialized View 설명  (0) 2008.02.14
유용한 오라클 명령어  (0) 2008.01.28
유용한 DB 쿼리  (0) 2007.11.17
Posted by [PineTree]
ORACLE2007. 9. 12. 20:20
반응형

-엔코아 커뮤니티 변동구님 정리-


[사고의 전환]


 * 1.대용량데이터베이스 솔루션 1,2 (이화식.조광원, 엔코아정보컨설팅) <= 강추
   => 데이터베이스 프로그래밍의 접근 방식을 이전과 다르게 바꾸어주는 책이다.
      처음 보거나 혼자본다면 그 참뜻을 깨닫기 힘드니까 반드시 동영상과 스터디를 겸할 것
      너무 생소해서 약간 지루할 수도 있고 버전도 오래 되었으나 현존하는 책 중에는
      이 책에 필적할 만한 책이 없기에 볼 수 밖에 없다.
      2권부터 보고 1권을 참고하는 것이 약간은 덜 지루해질 수 있는 방법이다.
      주의할 것은 너무 세세한 팁에 연연하다가는 정작 중요한 것을 놓칠 수 있으므로
      처음에는 전체적인 맥을 익히는데 주력하고 스터디나 동영상 강의를 통해 부족한
      부분을 보완하는 것이 좋다. 두번째 볼때는 같은 내용을 최신버전이나 다른 DBMS에서의 
      구현방법과 비교해보는 것도 이해를 돕는 좋은 수단이 될 수 있다.




[오라클]


 * 1.Beginning Oracle Programming (Sean Dillon 외 4인, 정보문화사)
   => 대용량데이터베이스 솔루션으로 사고의 전환을 이룬 후 오라클의 기본적인 구조와
      기능의 사용법등을 다양하게 익힐 수 있는 책이다. 토마스카이트가 기술한 내용은 
      아래의 두 책에서 더 상세하게 설명하고 있으므로 이해가 안가면 읽고 넘어가도 된다.
 * 2.expert one-on-one Oracle (Thomas Kyte, 정보문화사) <= 강추
   => 앞부분은 오라클의 아키텍처와 트랜잭션 내부 매커니즘 등을 다루고 뒷부분은 오라클의 
      다양한 기능에 대해 설명하고 있다. Beginning 이 툴이나 PL/SQL등의 사용법 위주라면 
      이 책은 개발자 관점에서 오라클을 사용할 때 꼭 알아야 한다고 생각하는 내용들을 
      정말로 다양하게 설명하고 있다. 아래 오라클 메뉴얼들의 압축판이라고 할까.
      8장 인덱스까지는 꼭 필요한 내용들이니까 자세히 하고 나머지 부분 중 필요한 것을
      선택해서 읽는 것이 좋을 것이다. 내용이 어렵기 때문에 적어도 8장까지는 스터디를
      해보는 것이 좋다고 생각한다. 번역에 간혹 문제가 있을 수 있으니 오사모 FTP에 있는
      원서 PDF파일을 통해 의심스러운 내용은 확인하고 넘어가야 한다.
 * 3.이펙티브 오라클 (Thomas Kyte, 정보문화사) <= 강추
   => 원제는 Effective Oracle by Design이다. (번역되기전 책 제목만 알땐 모델링책으로 오해함)
      원서 제목처럼 디자인(물리적디자인)을 통해 오라클을 효과적으로 사용하기 위해 알아야
      할 것들을 다양하게 기술하고 있다. 아키텍처의 선택, SQL문의 처리방식, CBO의 성능향상, SQL의 성능 향상, PL/SQL의 효과적 활용 등을 설명한다. 한마디로 Data Quality를 보장하면서 성능을 극대화하기 위해 오라클의 다양한 기능을 어떻게 활용하는 것이 좋은가에 대한 것이다.
      Expert책 보다는 재미가 있고 많은 부분을 오해하고 있다는 것을 깨닫게 해 줄 것이다.
      대용량책을 이해하고 이 책을 이해한다면 최고의 데이터베이스 프로그래머가 될 수 있을 것이다.

 * 4.Oracle Manual
 *   1)Concepts
 *   2)Application Developer's Guide - Fundamentals
     3)Administrator's Guide
 *   4)Performance Tuning Guide and Reference
   => 오라클의 메뉴얼은 다른 DBMS의 메뉴얼과는 다르게 정말로 풍부한 내용을 담고 있다.
      어떤 다른 책보다 근본적인 내용부터 자세한 설명을 하고 있다. 토마스 카이트도
      먼저 메뉴얼을 읽고 시작하라고 충고한다. 모든 내용은 메뉴얼에 있다는 말과 함께.
      현실적으론 내용이 너무 방대하고 영문이라 모든 메뉴얼을 읽기는 힘들 것이다.
      꼭 필요한 메뉴얼은 전부 읽고 나머지는 필요에 따라 참고하는 것이 좋을 것이다.
      (저는 영어 이해력이 부족하고 또 게을러서 조금씩 참고만 하고 있는 수준임)
      위는 토마스 카이트가 개발자가 꼭 읽으라고 했던 메뉴얼중의 일부이다.

   5.
대용량데이터베이스를위한 오라클SQL튜닝 (조종암, 대청)
   => Trace분석을 통해 어떻게 SQL을 튜닝할 것인지를 설명하는 책이다.
      Trace에서 나타나는 Row수의 의미와 그것을 통해 어떻게 구현하는 것이 유리한지를 설명한다.
      또한 대용량인 경우의 튜닝법과 BOM의 분석도 설명하고 있다.(이부분은 아직 못 읽음)


[SQL Server]


   1.Microsoft SQL Server 2000 개발자용,관리자용 : 전문가로가는지름길 (정원혁, 대림)
   => SQL Server에 대한 기초가 부족한 경우에만 읽을 것, 빌려읽어도 무방
 * 2.Inside Microsoft SQL Server 2000 (Kalen Delaney, 정보문화사) <= 강추
 * 3.실무 예제 중심의 고급 SQL 서버 개발자 가이드 (켄 헨더슨(하성희역), 피어슨에듀케이션코리아)
   4.Microsofr SQL Server 2000 : Resource Kit (MS SQL Server 2000 개발팀, 정보문화사)

[모델링]

 * 1.데이터 모델링(데이터아키텍처) 동영상 강의 (이화식) <= 강추
   =>모델링이 왜 필요하고 어떤 컨셉으로 접근해 가야 하는지부터 논리모델링의 모든 부분과
     물리모델링까지 설명하고 있다. 어려운 내용이 많아서 스터디를 통해 함께 하는 것이 좋을 것이다.
     모델링의 처음부터 끝까지 다양한 내용을 실전적인 방법으로 접근해갈 수 있도록 한다.
     다소 아쉬운 부분은 엔코아의 특성상 논리모델링에만 충실하지 않고, 물리모델링의 방식을  논리모델링에 적용하고 있다는 인상을 지우기 힘들다. 그래도 처음 모델링을 접할 때 이만큼  참신하고 좋은 방식으로 접근해가는 자료는 없는 것 같다. 특히 이력관리부분이 매우 좋다.

   2.
데이터아키텍처 (이화식, 엔코아정보컨설팅)
   =>강의를 보았으나 엔티티나 속성, 관계에 대한 개념이 부족할 경우 읽는 것이 좋다.
     기본 개념만 설명하고 있어서 상세모델링(서브타입, Arc, 이력관리 등)에 대한 내용은 없다.
    설명하고자 하는 내용에 비해 책이 너무 장황하여 맥을 놓치는 경우가 있기에 동영상을 숙지하였다면 굳이 볼 필요는 없다고 생각한다.


   3.Data Modeling And Relational Database Design (오라클의 pdf자료)
   =>이화식 사장님의 모델링 동영상 강의로부터 실전모델링의 컨셉을 익힌 후 기본 모델링의 개념과 이슈들을 익히는데 좋은 자료이다. 오라클이 관계형 이론에 충실한 DBMS인 만큼 그들의 모델링이론도 아주 훌륭한 것으로 생각된다. 오라클에서 나온 자료이지만 논리모델링인 만큼 DBMS와는 무관하다.

 * 4.데이터모델링 핸드북 (Michael C. Reingruber and William W. Gregory, 인터비전) <= 강추
   =>논리모델링에 발생하는 여러가지 이슈에 대하여 왜 그러해야 하는지 조목조목 설명하고 있다.
     얇은 책이지만 정말로 많은 고민을 통해 만든 책이라는 생각을 하게 하고 논리모델링의 원칙에 대
 많은 생각을 하게 만들어주는 책이다. 엔코아 이화식 사장님의 모델링 이론과는 약간의 차이가
있으나
  두 가지를 다 공부한 후에 좋은 부분을 취사선택해 가는 것이 모델링 능력발전에 도움이
되리라 생각한다.
번역과 표기법이 약간 신경쓰이긴 하지만 전해주는 주옥같은 내용에 비하면
참을 만하다.

 

[데이터베이스이론]

   1.데이터베이스 시스템 (C. J. Date, 홍릉과학출판사)


위의 자료들은 순전히 주관적인 판단에 의해 작성한 것입니다.


분야마다 번호는 학습을 하는 순서를 나열한 것이며, 별표는 꼭 공부해야 해야 한다고 생각하는 것입니다.주관적인 판단인 만큼 교재의 선정이나 학습의 순서가 사람마다 다르게 생각될 수도 있을 것입니다.또한 영어에 취약한 저의 특성상 좋다고 하는 몇몇 영문 교재들은 전부 제외될 수 밖에 없었습니다.위의 교재들은 대부분 제가 읽어본 자료이지만 이해도에 대한 것은 스스로가 많이 의심하고 있습니다.몇몇 자료는 부분적으로 읽거나 심지어는 목차만 본 자료도 있습니다.그래서 위의 자료에 대한 설명은 자료를 제대로 이해할 때 이럴 것 같다는 뜻으로 이해해 주셨으면 합니다.


또 하나 학습에 대한 개인적인 생각을 말씀드리자면 첨부터 하나하나 자세히 하는 것보다는 최소한 두번 본다는 자세로 처음에는 맥을 짚으면서 재밌고 관심있는 내용은 자세히 읽고 부담스러운 내용은 가볍게 넘어가는 방식으로 한번 다 보는 것이 중요하다구 생각합니다. 그리고 다음에 볼때는 테스트 할 것은 하면서 보충하는 거지요. 그래야만 나중에 그러한 요구가 생겼을때 필요한 부분을 참고하면서 일을 할 수 있단 거지요.

토마스 카이트의 말처럼 데이터베이스에 있는 기능을 어플리케이션에서 구현하느라 
시간을 허비하지 않도록..

 

























문제의 해결방식은...
업무적방법 < 모델링 < DBMS 기능 < SQL.PL/SQL < 어플리케이션 순으로
앞쪽으로 갈수록 시간과 노력이 절약되는 법이니까..
암튼 즐겁게 데이터를 가지고 노는 날까지 노력합시다
반응형
Posted by [PineTree]
ORACLE/ADMIN2007. 8. 14. 00:17
반응형

< oracle lock 걸린것 확인 하는 방법 >

select  username un, osuser ou, s.sid sid , s.serial# ser, l.type ty,
        decode(lmode,1,'NONE',2,'RS',3,'RX',4,'S',5,'RSX',6,'X') mh,
        o.name ob, id1,
        decode(request,1,'NONE',2,'RS',3,'RX',4,'S',5,'RSX',6,'X') mr
from    v$lock l, v$session s, sys.obj$ o
where   l.sid = s.sid
and     l.id1 = o.obj#(+)
and     username is not null
order by sid

************** 또 다른 방법 **************

oracle home/rdbms/admin/catblock.sql
                        utilblock.sql

 

 

===============================================================================================

* 다음 Query는 Lock과 관련된 transaction을 출력해준다.

  column username format a10
  column sid format 999
  column lock_type format a15
  column MODE_HELD format a11
  column MODE_REQUESTED format a10
  column LOCK_ID1 format a8
  column LOCK_ID2 format a8
  select a.sid,
    decode(a.type,
   'MR', 'Media Recovery',
   'RT', 'Redo Thread',
   'UN', 'User Name',
   'TX', 'Transaction',
   'TM', 'DML',
   'UL', 'PL/SQL User Lock',
   'DX', 'Distributed Xaction',
   'CF', 'Control File',
   'IS', 'Instance State',
   'FS', 'File Set',
   'IR', 'Instance Recovery',
   'ST', 'Disk Space Transaction',
   'IR', 'Instance Recovery',
   'ST', 'Disk Space Transaction',
   'TS', 'Temp Segment',
   'IV', 'Library Cache Invalidation',
   'LS', 'Log Start or Switch',
   'RW', 'Row Wait',
   'SQ', 'Sequence Number',
   'TE', 'Extend Table',
   'TT', 'Temp Table',
   a.type) lock_type,
   decode(a.lmode,
   0, 'None',            /* Mon Lock equivalent */
   1, 'Null',            /* N */
   2, 'Row-S (SS)',     /* L */
   3, 'Row-X (SX)',     /* R */
   3, 'Row-X (SX)',     /* R */
   4, 'Share',           /* S */
   5, 'S/Row-X (SSX)', /* C */
   6, 'Exclusive',      /* X */
   to_char(a.lmode)) mode_held,
   decode(a.request,
   0, 'None',            /* Mon Lock equivalent */
   1, 'Null',            /* N */
   2, 'Row-S (SS)',     /* L */
   3, 'Row-X (SX)',     /* R */
   4, 'Share',           /* S */
   5, 'S/Row-X (SSX)', /* C */
   6, 'Exclusive',      /* X */
   to_char(a.request)) mode_requested,
   to_char(a.id1) lock_id1, to_char(a.id2) lock_id2
  from v$lock a
  where (id1,id2) in
      (select b.id1, b.id2 from v$lock b where b.id1=a.id1 and
              b.id2=a.id2 and b.request>0);


  ( 위의 Query를 실행시키면 다음과 같은 내용이 출력된다.

 SID LOCK_TYPE         MODE_HELD   MODE_REQUE   LOCK_ID1   LOCK_ID2
 --- ---------------   ----------  ----------   --------   --------
   5  Transaction       Exclusive    None        262172     90
   6  Transaction       None         Exclusive   262172     90
   9  Transaction       None         Exclusive   262172     90

  SID 6과 9는 SID 5가 걸고 있는 Lock이 풀리기를 기다리고 있음을 알 수 있다.

 * 다음 Query는 Lock과 관련된 테이블을 출력해 준다.

  column username format a10
  column lockwait format a10
  column sql_text format a80
  column object_owner format a14
  column object format a15
  select b.username username, c.sid sid, c.owner object_owner,
     c.object object, b.lockwait, a.sql_text SQL
  from v$sqltext a, v$session b, v$access c
  where a.address=b.sql_address and
     a.hash_value=b.sql_hash_value and
     b.sid = c.sid and c.owner != 'SYS';
  /

  ( 위의 Query를 실행하면 다음과 같은 결과가 출력된다.

  USERNAME          SID OBJECT_OWNER   OBJECT          LOCKWAIT
  --------------- --- ------------- -------------- ----------
  SQL
  ---------------------------------------------------------------
  LTO2                6  LTO                EMP             C3D320F4
  update lto.emp set empno =25 where empno=7788
  LTO3                9  LTO                EMP             C3D320C8
  delete from lto.emp where empno=7788
  LTO                 5  LTO                DEPT
  insert into lto.dept values (60,'PROGRAMMER','LOS ANGELOS')

 여기서는 USERNAME에 나와있는 유저가 OBJECT에 나와있는 테이블을 수정하려고
 함을 나타낸다. LT02,LT03는 LT0가 Commit,Rollback 하기를 기다리고 있음을 알
 수 있다. 하지만 여기에는 가장 최근의 DML 명령 하나만 나와있기 때문에 여기
 나온 명령이 반드시 Lock을 걸고 있는 명령이라고 단정지을 수는 없다.

  관련된 프로세스
  ---------------
 * 다음 Query를 실행해 보면 프로세스와 관련된 정보를 얻을 수 있다.

  column "ORACLE USER" format a11
  column SERIAL# format 9999999
  column "OS USER" format a8
  select substr(s.username,1,11) "ORACLE USER", p.pid "PROCESS ID",
    s.sid "SESSION ID", s.serial#, osuser "OS USER",
    p.spid "PROC SPID",s.process "SESS SPID", s.lockwait "LOCK WAIT"
  from v$process p, v$session s, v$access a
  where a.sid=s.sid and
     p.addr=s.paddr and
     s.username != 'SYS';
  /

 * 위의 Query를 실행하면 다음과 같은 결과가 출력된다.

 ORACLE    PROCESS  SESSION  SERIAL#  OS USER   PROC   SESS   LOCKWT 
  USER          ID       ID                     SPID   SPID
 ------    -------  -------  -------  -------   ----   ----   ------
 LTO            19        5       31  usupport  17312  17309
 LTO2           25        6       43  usupport  17313  17310  C3D320F4
 LTO3           26        9        1  usupport  17314  17311  C3D320D8

 이 때는 다음과 같이 조치한다.

 1. LTO에게 Commit,Rollback 할 것을 요구한다.
 2. SQLDBA>ALTER SYSTEM KILL SESSION '5,31';
 3. %kill -9 17309   (유닉스상의 Shadown Process)
   stop/id=<SESS SPID> (PROC SPID=SESS SPID on vms running single task)

 여기서 SYS 유저는 제외시켰는데 필요하다면 Query의 Where 조건에서
 s.username != 'SYS' 부분을 삭제하면 된다.

  CATBLOCK.SQL & UTLLOCKT.SQL
  ---------------------------
 $ORACLE_HOME/rdbms/admin 디렉토리에 있는 스크립트 가운데 catblock.sql과
 utlockt.sql을 사용하여서 Lock 상황을 쉽게 파악할 수 있다. 이들은 다음과
 같이 실행한다.

 %cd $ORACLE_HOME/rdbms/admin
 %sqldba lmode=y (svrmgrl
 SVRMGR>connect internal
 SVRMGR>@catblock


  결과는 다음 Query 문으로 알아 본다.

 column waiting_session format a8
 select lpad(' ',3*(level-1)) || waiting_session,
   lock_type,
   mode_requested,
   mode_held,
   lock_id1,
   lock_id1,
   lock_id2
 from lock_holders
 connect by  prior waiting_session = holding_session
 start with holding_session is null;

  위의 Query에 의한 출력은 다음과 같다.

 WAITING_ LOCK_TYPE           MODE_REQUE MODE_HELD   LOCK_ID1   LOCK_ID2
 -------- ----------------- ---------- ---------- ---------- ----------
   5       None
   6       Transaction        Exclusive   Exclusive   262172      90
   9       Transaction        Exclusive   Exclusive   262172      90

  여기서 Session 6, Session 9가 Session 5를 기다리고 있음을 알 수 있다.

  Lock & Hanging 문제를 추정하는 방법
  -----------------------------------
 프로그램 상에서 어느 부분이 Lock, Hanging 문제를 일으키는지 알아내기가
 여의치 않을때 다음과 같은 방법을 사용해 보기 바란다.

 1. init<SID>.ora의 sql_trace=ture로 세팅하면 연관된 SQL 명령이 출력될
    것이다.
 2. OS 상에서도 Process 상태를 점검하여 본다.
 3. OS 상의 Debugging 기능을 사용하거나 만약 가능하다면 oradbx를 사용한다.
    Platform 에 따라서 없을 수도 있다.
 4. 여러가지 Monitoring 방법과 Locking/Blocking 스크립트를 이용한다.

  PROCESS STACKS 확인
  -------------------
 때로는 Hanging Process나 리소스를 점유하고 있는 Process의 Process Stack을
 점검해 보는 것이 문제 해결에 도움이 되는 경우가 있다.

 1. OS Debugging 프로그램을 이용하여 Hangup 되기 전의 마지막 Call을 확인
    한다.

    ex)%truss -p <shadow pid>

 2. oradbx(오라클 debugging 프로그램)은 Support,Development 시에만 사용
    된다.

 select substr(s.username,1,11) "ORACLE USER" ,
    p.pid "PROCESS ID", s.sid "SESSION ID", s.serial#,
    osuser "OS USER", p.spid "PROC SPID"
 from v$session s, v$access a, v$process p
 where a.sid=s.sid and
    p.addr=s.paddr and
    s.username != 'SYS';
 /

  위의 Query를 실행하면 다음과 같은 결과가 출력된다.

  ORACLE    PROCESS  SESSION  SERIAL#  OS USER   PROC   SESS   LOCKWT   
   USER          ID       ID                     SPID   SPID       
  ------    -------  -------  -------  -------   ----   ----   ------     
  LTO            19        5       31  usupport  17312  17309            
  LTO2           25        6       43  usupport  17313  17310  C3D320F4   
  LTO3           26        9        1  usupport  17314  17311  C3D320D8

 만약 oradbx가 없다면 다음과 같이 해서 만들어 준다.

 %cd $ORACLE_HOME/rdbms/lib
 %make -f oracle.mk oradbx

 LTO Process가 무엇을 하고 있는지 알고 싶으면 Process Stack을 보면 알수
 있다.

 ps -ef | grep 17312
   usupport 17312 17309 0 Sep 15 ?  0:00 oracleV713(DESCRIPTION=(LOCAL=YE

 type <oradbx>
 debug 17312 (이 유저의 oracle shadow process)
 dump stack
 dump procstat

 위에서 생성된 트레이스 화일(user_dump_dest 에 생성됨)을 이용하면 Hanging
 문제를 해결하는데 큰 도움이 된다.

  자주 발생하는 LOCK 문제들
  -------------------------
 1. Parent-Child 관계로 묶인 테이블에서 Child 테이블에 Index가 없는 상황
    에서 Child 테이블을 수정하게 되면 Parent테이블에 TABLE LEVEL SHARE
    LOCK이 걸리게 되어서 Parent 테이블에 대한 모든 Update가 금지된다.
 2. 블럭의 PCTFREE가 매우 작다면 한 블럭에 여러개의 레코드가 들어 있기
    때문에 한 블럭에 과도한 트랜잭션이 들어와서 블럭의 Transaction Layer가
    Release 되기를 기다리게 되는 경우도 있다.

 Ex)
 create table test (a number) initrans 1 maxtrans 1;

 SYSTEM:  insert into test values (5);            /* completed   */
 SCOTT:   insert into SYSTEM.test values (10);   /* Scott waits */

  SID OWNER   LOCK_TYPE       MODE_HELD   MODE_REQUE LOCK_ID1 LOCK_ID2
 ---- -----   ------------- ----------- ---------- -------- --------
    7 System  Transaction     Exclusive   None        196639    54
   10 Scott    Transaction      None        Share        196639    54

 

 

 

=======================================================================================

select sid, serial#,taddr,lockwait,그외기타정보컬럼 from v$session where
schemaname <> ''sys''
/
락이 걸리거나 의심되는 sid, serial#을

alter system kill session ''sid, serial#'';
해당명령으로 할당해제합니다.

다음내용참조하세요
1. v$session
주요 column
sid : session identifier
serial# : session serial number
username : 해당 session을 맺은 oracle username
lockwait : 대기중인 lock address

select sid, serial#, username, lockwait
from v$session ;

sid serial# username lockwait
------ --------- ----------- ----------
6 35 lto2 c2d2b3b4
8 70 system
12 15 lto
14 17 lto3 c2d2b438
15 30 sys

여기서 lockwait에 무언가가 기록 되어 있다면 해당 session은 특정
resource를 얻기 위해 대기중인 상태임
위의 예에서 lt02, lt03이 이에 해당함

2. v$lock
현재 system에 걸려 있는 lock들과 요구되어지는 lock들에 대한 정보
주요 column
sid : 해당 lock 또는 lock request의 소유 session
type : 현재 걸려있는 lock 또는 요구되는 lock의 type
주로 문제가 되고 관심을 가져야 하는 것은 tx type
(transaction)임
id1, id2 : 각 lock type별로 특수한 정보들이 기록됨
lock type이 tx일 경우 동일한 resource에 대한 lock을
요구하는 경우 각각의 id1, id2는 동일한 값을 갖는다.
lmode : 만약 해당 row가 걸려있는 lock에 대한 정보라면 lock mode가,
lock request에 대한 정보라면 none 이 들어 있음
request : 만약 해당 row가 걸려있는 lock에 대한 정보라면 none이,
lock request에 대한 정보라면 요구되는 lock mode가 들어 있음
* lock type, lock mode에 관한 자세한 내용은 ''oracle7 server concepts
manual'' chapter 10 data concurrency를 참조

select s.username, s.sid, s.serial#, l.type, l.id1, l.id2,
l.lmode, l.request
from v$session s, v$lock l
where s.sid = l.sid ;

username sid serial# type id1 id2 lmode request
--------- ---- -------- ----- ------- ------ ------- --------
lto2 6 35 tm 2294 0 rx none
lto2 6 35 tm 2295 0 rx none
lto2 6 35 tx 262167 87 none x
lto2 6 35 tx 327682 90 x none
lto 12 15 tm 2294 0 rx none
lto 12 15 tm 2295 0 rx none
lto 12 15 tx 262167 87 x none
lto3 14 17 tm 2294 0 rx none
lto3 14 17 tm 2295 0 rx none
lto3 14 17 tx 262167 87 none x
lto3 14 17 tx 196636 87 x none

* 다음 사용자들은 lock을 기다리고 있는 상태이다.
lto2 6 35 tx 262167 87 none x
lto3 4 17 tx 262167 87 none x

* 이들이 기다리고 있는 lock은 다음과 같다.
lto 12 15 tm 2294 0 rx none
lto 12 15 tm 2295 0 rx none
lto 12 15 tx 262167 87 x none

3. v$access
system에서 현재 lock이 걸려있는 object들과 이들을 access하고자 시도하는
session들에 대한 정보가 들어 있음
주요 column
sid : 현재 lock이 걸려있는 object를 access하고자 시도하는 session의 id
owner : lock이 걸려있는 object의 owner
object : lock이 걸려있는 object name

4. v$sqltext
주요 column들
address, hash_value : 특정 session이 수행하는 sql문을 확인하기 위해
v$session의 sql_address, sql_hash_value와 join한다.
sql_text : sql문

현재 sga영역에 존재하는 sql statement에 대한 정보가 들어있음
현재 특정 session이 수행하는 sql문을 조회하기 위해 다음 sql문을
이용한다.

select s.sid, s.serial#, s.username, a.sql_text
from v$sqltext a, v$session s
where s.sid = 11 and s.serial# = 9 -- session의 sid, serial#를 확인한
and a.address = s.sql_address -- 후 where조건에 기술
and a.hash_value = s.sql_hash_value ;

위에서 언급한 view들을 적절히 활용하여 문제의 lock을 걸고 있는 session을
찾아내어 alter system kill session ''sid, serial#'' ; 를 이용하여 해당
session을 kill시킨다.

시나리오 : lock이 걸린 table을 추측할 수 있을 경우
1. v$access 에서 해당 table에 lock을 잡고있는(요청하는) session
의 id를 확인
2. v$lock에서 위 1의 sid가 요청하는 resource를 잡고 있는 session을 확인
3. 필요하다면 v$sqltext를 보아서 실행중인 sql문을 확인
4. 위 2에서 확인된 session을 kill

 


 

반응형

'ORACLE > ADMIN' 카테고리의 다른 글

오라클 파라미터 관련 사이트 링크  (0) 2007.12.13
DATABASE LINK 사용법  (0) 2007.12.07
ORACLE relink  (0) 2007.08.07
Oradebug Command  (0) 2007.08.04
10g SYSAUX tablespace 줄이기  (0) 2007.08.02
Posted by [PineTree]
ORACLE/ADMIN2007. 8. 7. 02:34
반응형

다음과 같은 경우에는 자동으로 relink가 이루어짐

  • Oracle product install
  • Oracle에서 제공하는 installer를 이용한 patch 적용

manual하게 해줘야하는 경우
  • OS upgrade
  • OS system library에 변화가 일어난 경우 (OS patch에서 이루어짐)
  • 새로운 relink가 실패한 경우
  • initial startup 동안 Oracle 실행파일이 core dump를 일으킨 경우
  • Oracle patch 적용된 경우 (README에 명시된 경우에만!!!)

relink
  1. $ORACLE_HOME 변수 설정이 정확한지 체크 (" env | pg" $ORACLE_HOME이 절대경로인지확인)
  2. UNIX 환경변수 점검 (LIBPATH, LD_LIBRARY_PATH, SHLIB_PATH)
    setenv LD_LIBRARY_PATH ${ORACLE_HOME}/lib:${LD_LIBRARY_PATH}
    Solaris 경우
    Oracle 7.3.X, 8.0.X, or 8.1.X:
    $PATH에 /usr/ccs/bin 가 /usr/ucb 보다 앞에 있는지 확인
    32bit(non 9i) Oracle : LD_LIBRARY_PATH=$ORACLE_HOME/lib
    64bit(non 9i) Oracle : LD_LIBRARY_PATH=$ORACLE_HOME/lib, LD_LIBRARY_PATH_64=$ORACLE_HOME/lib64
    Oracle 9.X.X (64Bit) on Solaris (64Bit) OS : LD_LIBRARY_PATH=$ORACLE_HOME/lib32, LD_LIBRARY_PATH_64=$ORACLE_HOME/lib
    Oracle 9.X.X (32Bit) on Solaris (64Bit) OS : LD_LIBRARY_PATH=$ORACLE_HOME/lib
  3. DB가 shutdown된 상태인지와 listener가 내려간 상태인지 확인 (참고:component 가 제대로 설치되지않은 경우 fail남)
  4. Oracle 7.3.x
    For executables: oracle, exp, imp, sqlldr, tkprof
    cd $ORACLE_HOME/rdbms/lib
    make -f ins_rdbms.mk install
    For executables: svrmgrl, svrmgrm
    cd $ORACLE_HOME/svrmgr/lib
    make -f ins_svrmgr.mk linstall minstall (linstall is for svrmgrl, minstall is for svrmgrm)
    For executables: sqlplus
    cd $ORACLE_HOME/sqlplus/lib
    make -f ins_sqlplus.mk install
    For executables: dbsnmp, oemevent, oratclsh
    cd $ORACLE_HOME/network/lib
    make -f ins_agent.mk install
    For executables: names, namesctl
    cd $ORACLE_HOME/network/lib
    make -f ins_names.mk install
    For executables: tnslsnr, lsnrctl, tnsping, csmnl, trceval, trcroute
    cd $ORACLE_HOME/network/lib
    make -f ins_network.mk install
  5. Oracle 8.0.x
    For executables: oracle, exp, imp, sqlldr, tkprof, mig, dbv, orapwd, rman, svrmgrl, ogms, ogmsctl
    cd $ORACLE_HOME/rdbms/lib
    make -f ins_rdbms.mk install
    For executables: sqlplus
    cd $ORACLE_HOME/sqlplus/lib
    make -f ins_sqlplus.mk install
    For executables: dbsnmp, oemevent, oratclsh, libosm.so
    cd $ORACLE_HOME/network/lib
    make -f ins_oemagent.mk install
    For executables: tnslsnr, lsnrctl, namesctl, names, osslogin, trcasst, trcroute
    cd $ORACLE_HOME/network/lib
    make -f ins_network.mk install
  6. Oracle 8.1.X or 9.X.X
    cd $ORACLE_HOME/bin
    relink
    accepted values for parameter: all, oracle, network, client, client_sharedlib, interMedia, precomp, utilities, oemagent, ldap
    또는
    For executables: oracle, exp, imp, sqlldr, tkprof, mig, dbv, orapwd, rman, svrmgrl, ogms, ogmsctl #: cd $ORACLE_HOME/rdbms/lib
    make -f ins_rdbms.mk install
    For executables: sqlplus
    cd $ORACLE_HOME/sqlplus/lib
    make -f ins_sqlplus.mk install
    For executables: isqlplus
    cd $ORACLE_HOME/sqlplus/lib
    make -f ins_sqlplus install_isqlplus
    For executables: dbsnmp, oemevent, oratclsh
    cd $ORACLE_HOME/network/lib
    make -f ins_oemagent.mk install
    For executables: names, namesctl
    cd $ORACLE_HOME/network/lib
    make -f ins_names.mk install
    For executables: osslogin, trcasst, trcroute, onrsd, tnsping
    cd $ORACLE_HOME/network/lib
    make -f ins_net_client.mk install
    For executables: tnslsnr, lsnrctl
    cd $ORACLE_HOME/network/lib
    make -f ins_net_server.mk install
    For executables related to ldap (for example Oracle Internet Directory):
    cd $ORACLE_HOME/ldap/lib
    make -f ins_ldap.mk install


 
  For executables: sqlplus
 
  % cd $ORACLE_HOME/sqlplus/lib
  % make -f ins_sqlplus.mk install
 
  For executables: dbsnmp, oemevent, oratclsh, libosm.so
 
  % cd $ORACLE_HOME/network/lib
  % make -f ins_oemagent.mk install
 
  For executables: tnslsnr, lsnrctl, namesctl, names, osslogin, trcasst,
  trcroute
 
  % cd $ORACLE_HOME/network/lib 
  % make -f ins_network.mk install

 

 

==========================================================================================

:  How to Relink Oracle Database Software on UNIX
  문서 ID:  공지:131321.1 유형:  BULLETIN
  마지막 갱신 날짜:  15-MAY-2007 상태:  PUBLISHED


PURPOSE
-------

Provide relinking instructions for Oracle Database software
on UNIX platforms.

 
SCOPE & APPLICATION
-------------------

Anyone who maintains Oracle RDBMS software on a UNIX platform.


Relinking Oracle
================

Background:
Applications for UNIX are generally not distributed as complete executables. 
Oracle, like many application vendors who create products for UNIX, distribute
individual object files, library archives of object files, and some source
files which then get ?relinked? at the operating system level during
installation to create usable executables.  This guarantees a reliable
integration with functions provided by the OS system libraries.

Relinking occurs automatically under these circumstances:

 - An Oracle product has been installed with an Oracle provided installer.
 - An Oracle patch set has been applied via an Oracle provided installer. 

The following information has been added to the 'Certify' section of Metalink:

   General Notes For Oracle Database - Enterprise Edition:
   O/S Information:
   The vendors guarantee operating system binary compatibility; therefore, no
   reinstall or relink of the Oracle software is required when upgrading these
   operating systems unless specifically stated otherwise.

Relinking Oracle manually is suggested under the following circumstances
(even though the OS vendor may not require it):

 - An OS upgrade has occurred.
 - A change has been made to the OS system libraries.  This can occur during
   the application of an OS patch.
 - A new install failed during the relinking phase.
 - Individual Oracle executables core dump during initial startup.
 - An individual Oracle patch has been applied (however, explicit relink
   instructions are usually either included in the README or integrated into
   the patch install script)

Customers who want to (or have been advised to) manually relink should follow
the procedure below.

[Step 1] Log into the UNIX system as the Oracle software owner
==============================================================================
Typically this is the user 'oracle'.
 

[STEP 2] Verify that your $ORACLE_HOME is set correctly:
===============================================================================
For all Oracle Versions and Platforms, perform this basic environment check
first:
 
 % cd $ORACLE_HOME
 % pwd   

 ...Doing this will ensure that $ORACLE_HOME is set correctly in your current
    environment.
 

[Step 3] Verify and/or Configure the UNIX Environment for Proper Relinking:
===============================================================================
For all Oracle Versions and UNIX Platforms:
 The Platform specific environment variables LIBPATH, LD_LIBRARY_PATH, &
 SHLIB_PATH typically are already set to include system library locations like
 '/usr/lib'.  In most cases, you need only check what they are set to first,
 then add the $ORACLE_HOME/lib directory to them where appropriate.
 i.e.:  % setenv LD_LIBRARY_PATH ${ORACLE_HOME}/lib:${LD_LIBRARY_PATH}
 (see Note 131207.1 How to Set UNIX Environment Variables for help with
 setting UNIX environment variables)

If on AIX with:
--------------
   
    Oracle 7.3.X:
       - Set LIBPATH to include $ORACLE_HOME/lib
   
    Oracle 8.0.X:
       - Set LIBPATH to include $ORACLE_HOME/lib
       - Set LD_LIBRARY_PATH to include $ORACLE_HOME/lib and
         $ORACLE_HOME/network/lib (Required when using Oracle products that
         use Java)
       - Set LINK_CNTRL to L_PTHREADS_D7 if using AIX 4.3. ('oslevel' verifies
         OS version)
   
    Oracle 8.1.X, 9.X.X or 10.X.X:
       - For 8.1.5, set LINK_CNTRL to L_PTHREADS_D7
       - If not 8.1.5, ensure that LINK_CNTRL is not set
       - Set LIBPATH to include $ORACLE_HOME/lib
     

If on DATA GENERAL AVIION (DG) with:
-----------------------------------

    Oracle 7.3.X or 8.0.X:
       - Set LD_LIBRARY_PATH to include $ORACLE_HOME/lib
       - ensure TARGET_BINARY_INTERFACE is unset
   
    Oracle 8.1.X:
       - Set LD_LIBRARY_PATH to include
         $ORACLE_HOME/lib:$ORACLE_HOME/JRE/lib/PentiumPro/native_threads

If on HP-UX with:
----------------

    Oracle 7.3.X, 8.0.X, 8.1.X;
       - Set SHLIB_PATH to $ORACLE_HOME/lib
       If using 64bit 8i Oracle, also
       - Set LD_LIBRARY_PATH to $ORACLE_HOME/lib64
       - ensure LPATH is unset
 
    Oracle 9.X.X or 10.X.X;
       - ensure LPATH is unset

If on NCR with:
--------------

    Oracle 7.3.X, 8.0.X or 8.1.X:
       - Set LD_LIBRARY_PATH to include $ORACLE_HOME/lib:/usr/ccs/lib

If on SCO UNIXware with:
-----------------------

    Oracle 7.3.X or 8.0.X:
       - Set LD_LIBRARY_PATH to include $ORACLE_HOME/lib
   
    Oracle 8.1.X:
       - Set LD_LIBRARY_PATH to include
         $ORACLE_HOME/lib:$ORACLE_HOME/JRE/lib/x86at/native_threads

If on SGI with:
--------------

    32bit Oracle 7.3.X or 8.0.X:
       - Set LD_LIBRARY_PATH to include $ORACLE_HOME/lib
       - Set SGI_ABI to -32 

    64bit Oracle 8.0.X or 8.1.X (8i is only available in 64bit):
       - Set LD_LIBRARY_PATH to include $ORACLE_HOME/lib
       - Set SGI_ABI to -64
       - If one does not already exist, create the file compiler.defaults and
         set the COMPILER_DEFAULTS_PATH variable:

     In the Oracle software owner's $HOME directory, create a file called
     'compiler.defaults':
 
        % cd $HOME
        % echo "-DEFAULT:abi=64:isa=mips3:proc=r10k" > compiler.defaults

     Then set the environment variable COMPILER_DEFAULTS_PATH to point to the
     $HOME directory.
 
        % setenv COMPILER_DEFAULTS_PATH $HOME
 
     If this is not set, relinking will fail because the compiler defaults to
     MIPS4 objects although Oracle requires MIPS3.
       - Set LD_LIBRARY64_PATH to include the $ORACLE_HOME/lib and the
         $ORACLE_HOME/javavm/admin directories.
       - Set LD_LIBRARYN32_PATH to include the $ORACLE_HOME/lib32 directory.
         NOTE: LD_LIBRARY64_PATH & LD_LIBRARYN32_PATH must be undefined when
         installing software with Oracle Universal Installer.

If on SOLARIS (Sparc or Intel) with:
------------------------------------

    Oracle 7.3.X, 8.0.X, or 8.1.X:
       - Ensure that /usr/ccs/bin is before /usr/ucb in $PATH 
         % which ld   ....should return '/usr/ccs/bin/ld'

       If using 32bit(pre 9i) Oracle,
       - Set LD_LIBRARY_PATH=$ORACLE_HOME/lib

       If using 64bit(pre 9i) Oracle,
       - Set LD_LIBRARY_PATH=$ORACLE_HOME/lib
       - Set LD_LIBRARY_PATH_64=$ORACLE_HOME/lib64

    Oracle 9.X.X or higher:
       - LD_LIBRARY_PATH & LD_LIBRARY_PATH_64 do not need to be set to include
         a reference to $ORACLE_HOME/lib or $ORACLE_HOME/lib64 for a generic database
         software installation.
         (However they should not contain a reference to the ORACLE_HOME of another Oracle version)

If on Digital/Tru64, IBM/Sequent PTX, Linux or any other UNIX Platform not
mentioned above with:
------------------------------------------------------------------------------

    Oracle 7.3.X, 8.0.X, 8.1.X, 9.X.X or 10.X.X:
       - Set LD_LIBRARY_PATH to include $ORACLE_HOME/lib


[Step 4] For all Oracle Versions and UNIX Platforms:
===============================================================================
Verify that you performed Step 2 correctly:

 % env|pg  ....make sure that you see the correct absolute path for
   $ORACLE_HOME in the variable definitions.
 

[Step 5] For all Oracle Versions and UNIX Platforms:
===============================================================================
Verify umask is set correctly:

 % umask

This must return 022.  If it does not, set umask to 022.

 % umask 022
 % umask

[Step 6] Run the OS Commands to Relink Oracle:
===============================================================================
Important Note:  Before relinking Oracle, shut down both the database and the
                 listener.
Important Note:  The following commands will output a lot of text to your
                 session window.
Important Note:  If relinking a client installation, it's expected that some
                 aspects of the following commands will fail if the components
                 were not originally installed.

For all UNIX platforms:

Oracle 7.3.x
------------
 For executables:  oracle, exp, imp, sqlldr, tkprof

      % cd $ORACLE_HOME/rdbms/lib
      % make -f ins_rdbms.mk install

 For executables:  svrmgrl, svrmgrm

      % cd $ORACLE_HOME/svrmgr/lib
      % make -f ins_svrmgr.mk linstall minstall      <- linstall is for svrmgrl,
                                                        minstall is for svrmgrm

 For executables:  sqlplus

      % cd $ORACLE_HOME/sqlplus/lib
      % make -f ins_sqlplus.mk install

 For executables:  dbsnmp, oemevent, oratclsh

      % cd $ORACLE_HOME/network/lib
      % make -f ins_agent.mk install

 For executables:  names, namesctl

      % cd $ORACLE_HOME/network/lib
      % make -f ins_names.mk install

 For executables:  tnslsnr, lsnrctl, tnsping, csmnl, trceval, trcroute

      % cd $ORACLE_HOME/network/lib
      % make -f ins_network.mk install


Oracle 8.0.x
------------
 For executables:  oracle, exp, imp, sqlldr, tkprof, mig, dbv, orapwd, rman,
                   svrmgrl, ogms, ogmsctl

      % cd $ORACLE_HOME/rdbms/lib
      % make -f ins_rdbms.mk install

 For executables:  sqlplus

      % cd $ORACLE_HOME/sqlplus/lib
      % make -f ins_sqlplus.mk install

 For executables:  dbsnmp, oemevent, oratclsh, libosm.so

      % cd $ORACLE_HOME/network/lib
      % make -f ins_oemagent.mk install

 For executables:  tnslsnr, lsnrctl, namesctl, names, osslogin, trcasst,
                   trcroute

      % cd $ORACLE_HOME/network/lib
      % make -f ins_network.mk install


Oracle 8.1.X, 9.X.X or 10.X.X
------------------------------
  *** NEW IN 8i AND ABOVE ***

   A 'relink' script is provided in the $ORACLE_HOME/bin directory.
     % cd $ORACLE_HOME/bin
     % relink      ...this will display all of the command's options.
       usage: relink <parameter>
       accepted values for parameter: all, oracle, network, client,
       client_sharedlib, interMedia, precomp, utilities, oemagent, ldap
 
  Note: ldap option is available only from 9i. In 8i, you would have to manually relink
  ldap.

  You can relink most of the executables associated with an Oracle Server Installation
  by running the following command:
     % relink all   
  This will not relink every single executable Oracle provides(you can
  discern which executables were relinked by checking their timestamp with
  'ls -l' in the $ORACLE_HOME/bin directory).  However, 'relink all' will
  recreate the shared libraries that most executables rely on and thereby
  resolve most issues that require a proper relink.

 
 -or-

  Since the 'relink' command merely calls the traditional 'make' commands, you
  still have the option of running the 'make' commands independently:

 For executables:  oracle, exp, imp, sqlldr, tkprof, mig, dbv, orapwd, rman,
                   svrmgrl, ogms, ogmsctl

      % cd $ORACLE_HOME/rdbms/lib
      % make -f ins_rdbms.mk install

      NOTE: After relinking the oracle executable, make sure that the
      permissions on the executable are 6751 (-rwsr-s--x). If they are
      not, run the following command as the Oracle software owner:

      % cd $ORACLE_HOME/bin
      % chmod 6751 oracle

 For executables:  sqlplus

      % cd $ORACLE_HOME/sqlplus/lib
      % make -f ins_sqlplus.mk install

 For executables:  isqlplus

      % cd $ORACLE_HOME/sqlplus/lib
      % make -f ins_sqlplus install_isqlplus

 For executables:  dbsnmp, oemevent, oratclsh

      % cd $ORACLE_HOME/network/lib
      % make -f ins_oemagent.mk install

      NOTE: After relinking the dbsnmp executable, it is necessary to run
      the following commands as root (so that the ownership/permissions on
      the executable are correct):

      # cd $ORACLE_HOME/bin
      # chown root dbsnmp
      # chmod 6750 dbsnmp

      @ References: Note 233559.1 and Bug 2858326

 For executables:  names, namesctl

      % cd $ORACLE_HOME/network/lib
      % make -f ins_names.mk install

 For executables:  osslogin, trcasst, trcroute, onrsd, tnsping

      % cd $ORACLE_HOME/network/lib
      % make -f ins_net_client.mk install

 For executables:  tnslsnr, lsnrctl

      % cd $ORACLE_HOME/network/lib
      % make -f ins_net_server.mk install

 For executables related to ldap (for example Oracle Internet Directory):

      % cd $ORACLE_HOME/ldap/lib
      % make -f ins_ldap.mk install

How to Tell if Relinking Was Successful:
===============================================================================
If relinking was successful, the make command will eventually return to the OS
prompt without an error. There will NOT be a 'Relinking Successful' type
message.


If You Receive an Error Message During Relinking:
===============================================================================
Confirm that the message you received is an actual fatal error and not a
warning. Relinking errors usually terminate the relinking process and contain
verbage similar to the following:
'Fatal error', 'Ld: fatal', 'Exit Code 1'
While warnings will look similar to: 'ld: warning: option -YP appears more than
once, first setting taken' and can most often be ignored.

If you receive an error that terminates the relinking process, your first step
should be to extract the relevant information about the error from the make
output:

This can be broken down into three basic steps:
 1. Identify the OS utility that is returning the error.
    'ld', 'make', 'cc', 'mv', 'cp', 'ar' are common sources.
 2. Identify the type of error:
    'Permission Denied', 'Undefined Symbol', 'File Not Found' are common types.
 3. Identify the files or symbols involved.

Using the information from above as keywords, search Oracle's Metalink
repository (MetaLink.oracle.com) for previous occurrences of the same error. 
If no previous occurances are found or a solution is not provided, generate an
iTAR that includes the complete error text.

Help setting environment variables.
==============================================================================
See Note 131207.1 How to Set UNIX Environment Variables
for help with setting UNIX environment variables.


Relinking with Orainst:
===============================================================================
For Oracle7 & Oracle8 only, the following document illustrates how to relink
with the 'orainst' utility:
   Note 1032747.6 HOW TO RELINK ORACLE USING THE 7.3.X INSTALLER
While 'orainst' will run the same commands as [Step 4], performing [Step 4]
manually from a UNIX shell is the preferred approach.


RELATED DOCUMENTS
-----------------

Note 131207.1   How to Set UNIX Environment Variables
Note 109621.1   HP/UX: LD_LIBRARY_PATH and SHLIB_PATH
Note 1032747.6  HOW TO RELINK ORACLE USING THE 7.3.X INSTALLER
Bug 1337908     THE $ORACLE_HOME/BIN/RELINK SCRIPT DOES NOT RELINK EXP, IMP
                  SQLLOADER

 

반응형

'ORACLE > ADMIN' 카테고리의 다른 글

DATABASE LINK 사용법  (0) 2007.12.07
oracle lock  (0) 2007.08.14
Oradebug Command  (0) 2007.08.04
10g SYSAUX tablespace 줄이기  (0) 2007.08.02
RMAN  (0) 2007.07.24
Posted by [PineTree]