Introduction
In this article I will describe the steps used to identify which shared memory and semaphore segments are owned by a particular instance in Oracle V7, V8.0, V8i, and V9i. This can be helpful in recovery situations where the database instance has not released its shared memory and semaphores on database shutdown.Consider the situation where you have several instances running on one database server and one crashes leaving the "sgadef<SID>.dbf" file, shared memory and semaphore segments running. Given that you have many instances running, it becomes unclear which shared memory and semaphore sets to kill. The steps below will allow you to determine which shared memory and semaphore segments NOT to kill.Running "oradebug" in Oracle8
First, run "ipcs -b" on the database server. You will get out similar to table 1.
Table 1 - Example output from "ipcs -b"
QMSDEV on appdev: ipcs -b IPC status from <running system> as of Tue Sep 26 16:22:17 2000 Message Queue facility not in system. T ID KEY MODE OWNER GROUP SEGSZ Shared Memory: m 0 0x0fe2b384 --rw-r----- oracle dba63733760 m 1 0x0feaab41 --rw-r----- oracle dba63733760 m 353 0x0fc80ce5 --rw-r----- oracle dba55721984 m 154 0x0fe3a366 --rw-r----- oracle dba11059200 m 111 0x0fc78b7c --rw-r----- oracle dba57868288 T ID KEY MODE OWNER GROUP NSEMS Semaphores: s 0 00000000 --ra-r----- oracle dba 25 s 1 00000000 --ra-r----- oracle dba 25 s 2 00000000 --ra-r----- oracle dba 25 s 3 00000000 --ra-r----- oracle dba 25 s 458758 00000000 --ra-r----- oracle dba 25 s 458759 00000000 --ra-r----- oracle dba 25 s 196616 00000000 --ra-r----- oracle dba 25 s 196617 00000000 --ra-r----- oracle dba 25 s 196618 00000000 --ra-r----- oracle dba 25 s 196619 00000000 --ra-r----- oracle dba 25 s 19 0x00000078 --ra-ra-ra- root dba 1 s 131092 00000000 --ra-r----- oracle dba 25 s 131093 00000000 --ra-r----- oracle dba 25 s 131094 00000000 --ra-r----- oracle dba 25 s 131095 00000000 --ra-r----- oracle dba 25 s 131096 00000000 --ra-r----- oracle dba 25 s 131097 00000000 --ra-r----- oracle dba 25 s 131098 00000000 --ra-r----- oracle dba 25 s 131099 00000000 --ra-r----- oracle dba 25
Now log into each individual instance you have up and running by setting your "ORACLE_HOME" and "ORACLE_SID". Log into each instance using "svrmgrl" and use the following command:
svrmgr> connect internal Connected. SVRMGR> oradebug ipc -------------- Shared memory -------------- Seg Id Address Size 353 80000000 55721984 Total: # of segments = 1, size = 55721984 -------------- Semaphores ---------------- Total number of semaphores = 50 Number of semaphores per set = 25 Number of semaphore sets = 2 Semaphore identifiers: 458758 458759The above output shows that the particular database instance I was logged into, owned shared memory segment 353 while its semaphore identifiers where 458758 and 458759. You can verify that these are correct by looking them up in Table 1 above.
NOTE: The above "oradebug ipc" output is from a Version 7 database. See the notes at the bottom of this document for issues on running "oradebug" on Oracle8 and Oracle8i.After logging into each database instance and running "oradebug ipc", you will know which segments are valid on the running databases. Using this process of elimination you can identify the idle segments from a crashed instance. You can then kill them using "ipcrm -m" and "ipcrm -s" respectfully.
The command syntax to remove the shared memory segments or semaphores is as follows:
% ipcrm -m <shared memory id>% ipcrm -s <semaphore id>
When running "oradebug" in an Oracle8 environment, Oracle will write all shared memory information to a trace file in your "user_dump_dest" directory while writting semaphore informtion to your screen. Output from "oradebug ipc" in an Oracle8 environment would like the following:Running "oradebug" in Oracle8iSVRMGR> connect internal Connected. svrmgr> oradebug ipc Shared memory information written to trace file. -------------------- Semaphores -------------------- Total number of semaphores = 250 Number of semaphores per set = 25 Number of semaphore sets = 10 Semaphore identifiers: 0 65537 2 3 4 5 6 7 8 9To gather information about the shared memory in the trace file, navigate to your "user_dump_dest" directory and type in "ls -lt". This will order the files by modification date. Your trace file will be at the top of the file listing. Do a view on this file. Notice that the shared memory information is broken up into several areas. In the case of this example we have 5 areas. In each Area look up the "Shmid". In most cases, your SGA will all fit within one segment and therefore one Shmid.Table 2 - Example snip from oradebug trace file
...snipped... Dump of unix-generic realm handle `/u01/app/oracle/product/8.0.5DBADB', flags = 00000000 Area #0 `Fixed Size' containing Subareas 0-0 Total size 000000000000be10 Minimum Subarea size 00000000 Area Subarea Shmid Stable Addr Actual Addr 0 0 0 0000000080000000 0000000080000000 Subarea size Segment size 000000000000c000 00000000043d9000 00000000043d9000 Area #1 `Variable Size' containing Subareas 1-1 Total size 000000000330a000 Minimum Subarea size 00100000 Area Subarea Shmid Stable Addr Actual Addr 1 1 0 000000008000c000 000000008000c000 Subarea size Segment size 0000000003400000 00000000043d9000 00000000043d9000 Area #2 `Database Buffers 1 of 1' containing Subareas 2-2 Total size 0000000000fa0000 Minimum Subarea size 00002000 Area Subarea Shmid Stable Addr Actual Addr 2 2 0 000000008340c000 000000008340c000 Subarea size Segment size 0000000000fa0000 00000000043d9000 00000000043d9000 Area #3 `Redo Buffers' containing Subareas 3-3 Total size 000000000002a000 Minimum Subarea size 00000000 Area Subarea Shmid Stable Addr Actual Addr 3 3 0 00000000843ac000 00000000843ac000 Subarea size Segment size 000000000002a000 00000000043d9000 00000000043d9000 Area #4 `Lock Manager' containing Subareas 4-4 Total size 0000000000002000 Minimum Subarea size 00000000 Area Subarea Shmid Stable Addr Actual Addr 4 4 0 00000000843d6000 00000000843d6000 Subarea size Segment size 0000000000002000 00000000043d9000 00000000043d9000 Area #5 `skgm overhead' containing Subareas 5-5 Total size 0000000000001000 Minimum Subarea size 00000000 Area Subarea Shmid Stable Addr Actual Addr 5 5 0 00000000843d8000 00000000843d8000 Subarea size Segment size 0000000000001000 00000000043d9000 00000000043d9000 Dump of Solaris-specific skgm context ...snipped...
Running "oradebug ipc" in an Oracle8i environment is similar to Oracle8 with the exception that both the shared memory and semaphore information is written to the "user_dump_dest" trace file. See 'Running "oradebug" in Oracle8' above. Table 2 - Example snip from oradebug trace fileRunning "oradebug" in Oracle9i
In Oracle9i, is you were to attempt to simply use "oradebug ipc" at the SQL prompt, you will get the following:SQL> oradebug ipc ORA-00074: no process has been specifiedIn Oracle9i, this change was made to support dumping IPC information for Oracle Parallel Server (OPS) or RAC. Unlike semaphores and shared memory IPC information is different for every process when you run in an OPS environment rather than in a single mode environment.Here is the workaround I was able to use in obtaining shared memory and semaphore information in Oracle9i. In this example, you will need to have two telnet sessions open to the database server: One to login to SQL*Plus and (2) another to determine the background process (server processes) of the SQL*Plus session:
% sqlplus "/ as sysdba"Now in another shell session, look for the background (sever) process of the SQL*Plus session:% ps -ef | grep TARGDB | grep LOCAL oracle 4744 1 0 12:54:55 ? 0:00 oracleTARGDB (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
Now go back to your SQL*Plus session and issue the following:SQL> oradebug setospid 4744 Statement processed. SQL> oradebug ipc Information written to trace file.You can now exit your SQL*Plus and navigate to the user_dump_dest directory and locate the trace file just created:% cd /u01/app/oracle/admin/TARGDB/udump % ls -lt total 8 -rw-r--r-- 1 oracle dba 4025 Feb 4 13:00 targdb_ora_4744.trc % cat targdb_ora_4744.trc /u01/app/oracle/admin/TARGDB/udump/targdb_ora_4744.trc Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production With the Partitioning, OLAP and Oracle Data Mining options JServer Release 9.2.0.1.0 - Production ORACLE_HOME = /u01/app/oracle/product/9.2.0 System name: SunOS Node name: alex Release: 5.8 Version: Generic_108528-19 Machine: sun4u Instance name: TARGDB Redo thread mounted by this instance: 1 Oracle process number: 12 Unix process pid: 4744, image: oracle@alex (TNS V1-V3) *** 2004-02-04 13:00:48.767 *** SESSION ID:(11.46) 2004-02-04 13:00:48.766 Dump of unix-generic skgm context areaflags 00000037 realmflags 0000000f mapsize 00002000 protectsize 00002000 lcmsize 00002000 seglen 00400000 largestsize 00000000f8000000 smallestsize 0000000001000000 stacklimit ff46ec6f stackdir -1 mode 640 magic acc01ade Handle: 2ef40f8 `/u01/app/oracle/product/9.2.0TARGDB' Dump of unix-generic realm handle `/u01/app/oracle/product/9.2.0TARGDB', flags = 00000000 Area #0 `Fixed Size' containing Subareas 0-0 Total size 000000000006f1e0 Minimum Subarea size 00000000 Area Subarea Shmid Stable Addr Actual Addr 0 0 8903 0000000020000000 0000000020000000 Subarea size Segment size 0000000000070000 0000000020400000 Area #1 `Variable Size' containing Subareas 1-1 Total size 000000001f000000 Minimum Subarea size 01000000 Area Subarea Shmid Stable Addr Actual Addr 1 1 8903 0000000020070000 0000000020070000 Subarea size Segment size 000000001ff90000 0000000020400000 Area #2 `Redo Buffers' containing Subareas 2-2 Total size 00000000000a6000 Minimum Subarea size 00000000 Area Subarea Shmid Stable Addr Actual Addr 2 2 8903 0000000040000000 0000000040000000 Subarea size Segment size 00000000000a6000 0000000020400000 Area #3 `skgm overhead' containing Subareas 3-3 Total size 0000000000002000 Minimum Subarea size 00000000 Area Subarea Shmid Stable Addr Actual Addr 3 3 8903 00000000400a6000 00000000400a6000 Subarea size Segment size 0000000000002000 0000000020400000 Dump of Solaris-specific skgm context sharedmmu 00000001 shareddec 0 used region 0: start 0000000020000000 length 0000000021000000 Maximum processes: = 250 Number of semaphores per set: = 127 Semaphores key overhead per set: = 4 User Semaphores per set: = 123 Number of semaphore sets: = 3 Semaphore identifiers: = 3 Semaphore List= 11730950 -------------- system semaphore information ------------- IPC status from <running system> as of Wed Feb 4 13:00:48 EST 2004 T ID KEY MODE OWNER GROUP CREATOR CGROUP NSEMS OTIME CTIME Semaphores: s 458752 0xb748224 --ra-r----- oracle dba oracle dba 127 13:00:32 17:55:39 s 65537 0xb748225 --ra-r----- oracle dba oracle dba 127 no-entry 17:55:39 s 65538 0xb748226 --ra-r----- oracle dba oracle dba 127 17:55:40 17:55:39 s 458755 0xe150224 --ra-r----- oracle dba oracle dba 127 13:00:45 17:55:50 s 65540 0xe150225 --ra-r----- oracle dba oracle dba 127 no-entry 17:55:50 s 65541 0xe150226 --ra-r----- oracle dba oracle dba 127 17:55:51 17:55:50 s 11730950 0x9c5e0880 --ra-r----- oracle dba oracle dba 127 13:00:39 12:31:34 s 2818055 0x9c5e0881 --ra-r----- oracle dba oracle dba 127 no-entry 12:31:34 s 2818056 0x9c5e0882 --ra-r----- oracle dba oracle dba 127 12:31:36 12:31:34
No comments:
Post a Comment