ORACLE/ADMIN2011. 12. 8. 09:57
반응형

멀티 스레드 서버 개요

by Jeff Hunter, Sr. Database Administrator 제프 헌터, 미스터 데이터베이스 관리자에 의해

Contents 내용

  1. Overview 개요
  2. Benefits of MTS MTS의 장점
  3. The Trade-offs 무역 오프
  4. Implementing MTS 구현 MTS
  5. Bottom Line: Should I use MTS? 결론 : 저는 MTS를 사용해야합니까?
  6. Setting up your MTS environment 귀하의 MTS 환경 설정
  7. Changing Database Initialization Parameters 데이터베이스 초기화 매개 변수 변경
  8. Forcing a Dedicated Server Connection 전용 서버 연결을 강제
  9. Viewing MTS Statistics MTS 통계보기

Overview 개요

Many Oracle DBAs today are faced with the every growing number of connections to their databases. 대부분의 오라클 DBAs 오늘날들은 데이터베이스에 연결마다 증가에 직면하고 있습니다. When using the traditional method of connecting to the database (dedicated server) each client process is given a dedicated server process that runs on the database server. 데이터베이스에 연결하는 전통적인 방법을 사용하는 경우 (전용 서버) 각 클라이언트 프로세스는 데이터베이스 서버에서 실행되는 전용 서버 프로세스를 제공합니다. This server process is sometimes referred to as a "shadow process". 이 서버 프로세스는 때때로 "그림자 프로세스"라고합니다. This server process takes memory away from the system and as the number of connections increase, so does the demand for memory. 이 서버 프로세스 때문에 메모리에 대한 수요가 않으며, 시스템에서와 연결 증가의 번호로 떨어진 메모리를 소요됩니다. Not only is memory in demand for with these server processes, but so are CPU requirements. 뿐만 아니라 이러한 서버 프로세스에 대한 수요의 메모리, 근데 CPU 요구 사항이 있습니다. If you have many users connecting and disconnecting from the database server, a good amount of CPU will be required in building and destroying these dedicated server processes. 당신이 연결하고 데이터베이스 서버에서 분리 많은 사용자가있다면, CPU의 좋은 금액이 전용 ​​서버 프로세스를 구축하고 파괴해야합니다.

Oracle provides a solution that answers the above two issues called Multi-Threaded Server. 오라클은 멀티 스레드 서버라는 위의 두 가지 문제 답을 솔루션을 제공합니다. This article provides some insight into setting up Multi-Threaded Server (MTS) as well as several scripts that can be used to monitor your MTS environment. 이 문서는 멀티 스레드 서버 (MTS)뿐 아니라 MTS 환경을 모니터링하는 데 사용할 수있는 몇 가지 스크립트 설정에 몇 가지 통찰력을 제공합니다.

Benefits of MTS MTS의 장점

Think about a system in which only 4 client processes need access to the database. 겨우 4 클라이언트 프로세스가 데이터베이스에 액세스해야하는 시스템에 대해 생각합니다. With dedicated server, each client process requires one dedicated server processes. 전용 서버로, 각 클라이언트 프로세스 하나의 전용 서버 프로세스를 필요로합니다. If each server process consumes 8 megabytes of memory, you will need 32 megabytes to support this scenario. 각 서버 프로세스가 메모리 8메가바이트를 소비한다면, 당신은이 시나리오를 지원하기 위해 32메가바이트 필요합니다. Now consider 100 dedicated connections. 지금 100 전용 연결 고려하십시오. In this scenario, you would require 800 megabytes of memory! 이 시나리오에서는 메모리 800 메가가 필요 것입니다! Using MTS, you can see in Figure 1 that these same 4 client connections can be supported by only 2 shared server processes. MTS를 사용하여, 당신은에서 볼 수있는 그림 1 이 동일한 4 클라이언트 연결에만이 공유 서버 프로세스에서 지원 수 있습니다.


Figure 1: Dedicated Server vs. Shared Server 그림 1 : 전용 서버 대 공유 서버

Another thing to consider is OLTP environment where users are spending most of their time reading and editing data on their screens and very little time actively executing SQL statements against the database. 고려해야 할 또 한가지는 사용자가 적극적으로 데이터베이스에 대해 SQL 문을 실행하는 자신의 화면 데이터와 거의 시간을 읽고 편집 대부분의 시간을 소비 아르 OLTP 환경입니다. In this scenario, many of those dedicated server processes are sitting idle and needlessly consuming memory. 이 시나리오에서는 이러한 전용 서버 프로세스의 대부분은 유휴 상태 및 불필요한 소비 메모리 앉아있다. Because MTS allows the sharing of the server process between many client processes, the DBA can now make more efficient use of the server processes. MTS는 많은 클라이언트 프로세스간에 서버 프로세스의 공유를 허용하기 때문에, DBA는 이제 서버 프로세스를보다 효율적으로 사용할 수 있습니다.

Lastly, MTS can improve with environments where clients are constantly connecting and disconnecting from the database. 마지막으로, MTS는 클라이언트가 지속적으로 연결하고 데이터베이스에서 연결을 해제 아르 환경 향상시킬 수 있습니다. Since shared server processes are not tied directly to a client process, they are not built and destroyed each time a client connects or disconnects. 공유 서버 프로세스가 클라이언트 프로세스에 직접 연결되어 아니므로, 그들은 건설과 클라이언트가 연결하거나 연결을 끊으 때마다 파괴되지 않습니다. Oracle will maintain an active "pool" of shared server processes. 오라클은 공유 서버 프로세스의 적극적인 "풀"을 유지합니다. New shared server processes are only created when demand exceeds supply. 수요가 공급을 초과하면 새로운 공유 서버 프로세스는 만들어집니다. On the same note, shared server processes are only destroyed when demand drops off and those extra shared server processes are no longer needed. 같은 메모에서 수요가 떨어져 방울 때 공유 서버 프로세스는 파괴되고 그 여분의 공유 서버 프로세스는 더 이상 필요하지 않습니다.

The following list outlines the advantages of using MTS: 다음 목록은 MTS를 사용의 이점을 설명합니다 :

  • Reduced Demand for Memory : Since one server process can now handle many clients, you need fewer server processes, resulting in a reduced demand for overall memory. 메모리에 대한 수요를 감소 : 하나의 서버 프로세스가 현재 많은 클라이언트를 처리할 수 있기 때문에, 당신은 전체 메모리에 대한 수요 감소 결과, 적은 수의 서버 프로세스가 필요합니다.
  • More Efficiency : Since there is less idle time with each shared server process, you gain more efficiency within each server process. 더 많은 효율성 : 각 공유 서버 프로세스와 적은 유휴 시간이 있기 때문에, 당신이 각 서버 프로세스 내에서 더 많은 효율성을 습득합니다.
  • Fewer CPU Resources : Server processes are no longer being built and destroyed for each client connection and disconnect. 적은 CPU 리소스 : 서버 프로세스가 구축되지 않으며 파괴 각 클라이언트 연결과 분리되고 더 이상 없습니다. Fewer resources will now be required in the building and destroying of server processes. 적은 자원 이제 건물 및 서버 프로세스의 파괴 필요합니다.
  • Communicating Through a Firewall : TCP/IP port numbers can be explicitly specified for MTS dispatchers. 방화벽을 통해 통신 : TCP / IP 포트 번호는 명시적으로 MTS의 dispatchers에 대해 지정할 수 있습니다. Knowing in advance the port numbers that will be used, can sometimes help when dealing with communicating through a firewall. 방화벽을 통해 통신을 다루는 때 사용되는 포트 번호, 가끔은 도움이 사전에 알고.

The Trade-offs 무역 오프

MTS is not for everyone! MTS는 모든 사람이 아니야! Before implementing MTS in your environment, keep the following in mind: 사용자 환경에서 MTS를 구현하기 전에 다음 사항에 유의 :
  • Batch Jobs vs. Quick transactions : The use of MTS is predicated on the assumption that each client will use only a small fraction of its connect time to perform any work against the database. 일괄 채용 대 빠른 거래 : MTS의 사용은 각각의 클라이언트가 데이터베이스에 대해 어떤 작업을 수행하기 위해 연결하는 시간의 작은 파편만이를 사용하는 가정에 predicated입니다. The more active your clients are, the greater the number of shared server processes you will need to respond to their requests in a timely manner. 보다 적극적인 고객, 당신​​이 적시에 자신의 요청에 응답해야합니다 공유 서버 프로세스의 큰 수입니다. You may get to a point to where MTS ceases to make sense at all. MTS 전혀 이해하기 위해 중단 어디 지점에받을 수 있습니다. Batch jobs or clients that extract large amounts of data should not connect to the database through MTS. 대용량의 데이터를 추출 일괄 작업 또는 클라이언트가 MTS를 통해 데이터베이스에 연결해서는 안됩니다.
  • Latency with MTS : When clients submit SQL statements to be executed, it now has to wait until a shared server process is freed up and can take on the task of executing the statement. MTS와 지연 : 클라이언트가 실행하는 SQL 문을 제출할 때, 지금 공유 서버 프로세스가 최대 해제하고 구문을 실행할 작업에 걸릴 수있을 때까지 기다려야한다. The amount of time depends on the number of shared server processes currently running and how busy they are. 시간 금액은 공유 서버의 현재 실행중인 프로세스와 방법에 바쁜 그들의 숫자에 따라 달라집니다.
  • Client's Perspective : Even though the DBA may be reducing the demand for memory and/or CPU on the server, MTS will not result in better performance from the client's perspective. 고객의 관점 : DBA가 메모리 및 / 또는 서버에서 CPU에 대한 수요를 줄일 수있다하더라도, MTS는 고객의 관점에서 더 나은 성능의 결과되지 않습니다.

Implementing MTS 구현 MTS

After deciding MTS is right for your environment, it is now time to dig into the implementation details. MTS 바로 사용자 환경을위한 결정 후, 이제 구현 세부 사항에 팔 시간입니다. The DBA will need to consider the following two issues: User Session-Specific Data (UGA) and Routing Client Requests to Shared Server Processes . DBA는 다음과 같은 두 가지 문제를 고려하셔야합니다 : 사용자 세션 관련 데이터 (UGA)와 공유 서버 프로세스로 라우팅 클라이언트 요청합니다.

User Session-Specific Data (UGA) 사용자 세션 - 특정 데이터 (UGA)
Every connection to the Oracle database has a "session-specific" memory associated with it. Oracle 데이터베이스에 대한 모든 연결은 그것과 관련 "세션별로"메모리가 있습니다. This memory is referred to as the User Global Area (UGA) and is used to hold the values of PL/SQL variables, the values of bind variables and other items specific to a session. 이 메모리는 사용자 글로벌 영역 (UGA)이라고하고 PL / SQL 변수, 세션에 특정 바인딩 변수 및 기타 항목의 값을의 값을 보유하는 데 사용됩니다. The UGA also contains that part of the sort area specified by the SORT_AREA_RETAINED_SIZE initialization parameter. UGA는 또한 SORT_AREA_RETAINED_SIZE 초기화 매개 변수에 의해 지정된 정렬 영역의 일부를 포함하고 있습니다.

With a dedicated server connection, the UGA is stored within the dedicated server process's Program Global Area (PGA). 전용 서버 연결, UGA는 전용 서버 프로세스의 프로그램 글로벌 영역 (PGA) 내에 저장됩니다. When an MTS connection is made though, the UGA is stored in either the "LARGE POOL" or the "SHARED POOL". MTS 연결이 있지만 만든 경우, UGA는 중 "대형 수영장"또는 "공유 풀"에 저장됩니다. This difference is illustrated in Figure 2 . 이 차이는에있는 그림입니다 그림 2 .

In an MTS environment, the UGA needs to be moved into a common memory structure like the large pool or shared pool since it contains "session-specific" data. MTS 환경에서 UGA는 "세션 관련"데이터가 포함되어 있으므로 대형 풀 또는 공유 풀 같은 일반적인 메모리 구조로 이동해야합니다. Keep in mind that the use of MTS does not affect the overall "amount" of memory used for session specific data. MTS의 사용 세션이 특정 데이터에 사용되는 메모리의 전반적인 "금액을"에 영향을주지 않습니다 점에 유의하십시오. It is only moved from the memory space of the individual process into a common memory structure accessible by all processes. 그것은 모든 프로세스에 의해 액세스할 수있는 공통의 메모리 구조로 각 프로세스의 메모리 공간에서 이동됩니다.

Figure 2 shows the UGA located in the large pool. 그림 2는 대형 수영장에있는 UGA를 보여줍니다. If you do not have the large pool configured, then Oracle will place the UGA in the shared pool. 당신은 대형 수영장가 설정되지 않는 경우, 오라클은 공유 수영장에서 UGA를 배치합니다. Oracle does not recommend placing the UGA in the shared pool as this will cause fragmentation. 오라클은이 조각의 원인이되므로 공유 수영장에서 UGA를 배치하지 않는 것이 좋습니다.


Figure 2: MTS changes where session-specific information is stored 그림 2 : 세션과 관련된 정보가 저장되어있는 MTS 변경

Routing Client Requests to Shared Server Processes 공유 서버 프로세스로 클라이언트 요청을 라우팅
The second major issue of MTS is setting up the dispatcher. MTS의 두 번째 주요 문제는 배차를 설정입니다. When using a dedicate server connection, the client process simply passes the SQL statements to be executed to its dedicated server process. 헌정 서버 연결을 사용하면, 클라이언트 프로세스는 단순히 전용 서버 프로세스에 실행되도록 SQL 문을 전달합니다. What happens though when in an MTS environment the client process has no dedicated server process to send the SQL to? MTS 환경에서 클라이언트 프로세스가 SQL을 보낼 전용 서버 프로세스가없는 경우 어떻게 생각됩니까? The answer is that the request gets sent to a dispatcher process. 답변 요청 배차 프로세스로 전송된다는 점이다.

In an MTS environment, the dispatcher process assumes the role of communicating with the clients and routing your request. MTS 환경에서 배차 프로세스는 클라이언트와 통신하여 요청을 라우팅의 역할을 가정합니다. The listener no longer hands the client off to a dedicated server process, but rather gives each new client to the most lightly loaded dispatcher process. 리스너는 더 이상 손떼 전용 서버 프로세스는 클라이언트, 오히려 가장 가볍게로드 배차 프로세스에 각각의 새 클라이언트를 제공합니다. For the duration of the session, the dispatcher process will handle all communication with the client. 세션의 기간 동안, 배차 프로세스는 클라이언트의 모든 통신을 처리합니다.

The dispatcher processes will then take the requests (with are often SQL statements) from the client and place them into a request queue . 배차원 프로세스는 다음 클라이언트의 요청을 (종종 SQL 문을 아르와 함께) 가지고 요청 대기열에 넣어 것입니다. The request queue is located as a memory structure within the System Global Area (SGA) and is where all incoming requests are placed. 요청 대기열은 시스템 글로벌 영역 (SGA) 내의 메모리 구조로 위치하고 들어오는 모든 요청이 위치가 어디입니다. All shared servers you have setup within your instance will monitor the request queue. 귀하의 인스턴스 내에서 설정을 모든 공유 서버 요청 대기열을 모니터링합니다. When a request is entered into the request queue, the next available shared server process will pull it out of the queue and service it. 요청이 요청 대기열에 입력하면, 다음 사용 가능한 공유 서버 프로세스는 대기열의 그것을 꺼내 그것을 서비스합니다. All requests are handled in a first-in/first-out basis. 모든 요청은 first-in/first-out 기준으로 처리됩니다. This can be seen in Figure 3 . 이것은에서 볼 수있는 그림 3 .


Figure 3: Within an MTS setup, the dispatcher is responsible for all communication to and from the client 그림 3 : MTS 설정 내에서, 배차는 클라이언트와 모든 커뮤니케이 션에 대한 책임

When the shared server process completes the task, the results are placed into a response queue . 공유 서버 프로세스가 작업을 완료하면 그 결과는 응답 대기열에 배치됩니다. Like the request queue, the response queue is a memory structure located within the SGA. 요청 대기열과 마찬가지로, 응답 대기열은 SGA 내에있는 메모리 구조입니다. Response queues are directly tied to a specific dispatcher. 응답 대기열 직접 특정 배차에 묶여있다. While each dispatcher has its own response queue, each dispatcher on the other hand will have the same request queue. 각 배차 자체 응답 대기열을 가지고 있지만, 반면에 각각의 배차는 동일한 요청 대기열을해야합니다. When a dispatcher detects a response in its response queue, it will send that response back to the client that first initiated the request. 배차는 응답 대기열에 응답을 감지하면, 먼저 요청을 시작한 클라이언트에 다시 응답을 보내드립니다.

How many dispatchers should you use in your MTS environment? 당신의 MTS 환경에서 얼마나 많은 dispatchers를 사용해야합니까? Well, for one you will need at lease one dispatcher for each network protocol that you are supporting. 음, 한 당신은 임대에서이 지원하는 각 네트워크 프로토콜에 대해 하나 배차가 필요합니다. Like shown in Figure 3 , you created one dispatcher for TCP/IP and another for SPX. 표시와 마찬가지로 그림 3 , 당신은 SPX 한 TCP에 대한 배차 / IP와 다른 만들었습니다. Aside from the number of network protocols, you also need to decide on the number of connections you are planning to support. 외에 네트워크 프로토콜의 번호에서, 당신은 또한 지원을 계획하고 연결 수를 결정합니다. There is a limit as to how many connections that each dispatcher process can handle. 각 배차 프로세스가 처리할 수있는 얼마나 많은 연결로 제한이 있습니다. (This number is operating-system specific). (이 번호는 운영 체제에만 적용됩니다.)

Bottom Line: Should I use MTS? 결론 : 저는 MTS를 사용해야합니까?

Well, this depends on your environment. 음, 이것은 환경에 따라 다릅니다. If you are supporting a large number of client connections and where those connections are mostly inactive, then MTS would be ideal here. 당신은 클라이언트 연결의 많은 지원을하고 있으며 이러한 연결은 대부분 비활성 어디면 MTS는 여기에 이​​상적인 것입니다. MTS would not be a good setup if your environment does not involve much idle time with your client connections. 환경이 클라이언트 연결과 함께 많은 유휴 시간을 포함하지 않는 경우 MTS는 잘 설치되지 않을 것입니다. (ie batch jobs). (예 : 일괄 작업). Keep in mind that you setup an environment that allows for both MTS and dedicate server processes. 당신은 MTS 모두 수있는 환경을 설치 및 서버 프로세스를 바칩니다 점을 명심하십시오. Setup user connections who only sporadically accessing the database using MTS, while batch jobs and other data intensive connections can be made using dedicated server connections. 일괄 작업 및 기타 데이터 집약적인 연결이 전용 ​​서버 연결을 사용하여 만들 수있는 동안에만 간헐적으로, MTS를 사용하여 데이터베이스를 액세스하는 설치 사용자 연결. Lastly, remember that from the client's perspective, MTS does not enhance their performance, but rather reduces the CPU and memory overhead associated with supporting many client (mostly idle) connections. 마지막으로, 클라이언트의 관점에서, MTS는 자신의 성능을 향상하지 않는 기억, 오히려 많은 클라이언트 (대부분 유휴 상태) 연결 지원과 관련된 CPU 및 메모리 오버헤드를 줄일 수 있습니다.

Setting up your MTS environment 귀하의 MTS 환경 설정

How Many Dispatchers? 얼마나 많은 Dispatchers?
As discussed above, you will need to provide at lease one dispatcher process for each protocol you plan on supporting. 위에서 설명한대로, 당신은 지원 계획이 각 프로토콜에 대해 임대 하나 배차 과정을 제공해야합니다. Another factor that will affect your decision on the number of dispatcher processes is the operating system's limit on the number of connections that can be made to a single process. 배차원 프로세스의 수를 결정에 영향을줍니다 또 다른 요인은 단일 프로세스로 만들 수있는 연결의 수를 운영 체제의 한계입니다. If for example, your operating system allows a maximum of 972 connections to one process, and you want to support 3500 TCP/IP connections using MTS, then you will need a minimum of four (4) dispatcher processes for the TCP/IP network protocol. 예를 들어 경우, 운영 체제가 하나의 처리 972 연결의 최대 허용하고 3500 TCP / MTS를 사용하여 IP 연결을 지원하려면, 다음의 TCP / IP 네트워크 프로토콜에 대한 4 배차 프로세스의 최소 필요합니다 .

Determining OS Connection Limits OS 연결 제한을 결정
Determining the connection limit for your particular operating system is fairly easy. 특정 운영 체제에 대한 연결 제한을 결정하는 것은 매우 쉽습니다. You will need to use the "SERVICES" command within the Listener Control utility. 당신은 리스너 제어 유틸리티 내에서 "서비스"명령을 사용해야합니다. Simply perform the following tasks: 간단히 다음과 같은 작업을 수행합니다

  • Use the MTS_DISPATCHERS initialization parameter to configure a test database for one dispatcher. 한 배차를위한 테스트 데이터베이스를 구성 MTS_DISPATCHERS 초기화 매개 변수를 사용합니다.
  • Stop and restart your instance to read in the new value of MTS_DISPATHCERS. 중지하고 MTS_DISPATHCERS의 새로운 가치를 읽을 수 인스턴스를 다시 시작합니다.
  • Run the Listener Control utility and issue the SERVICES command. 리스너 제어 유틸리티를 실행하고 서비스 명령을 발행하고 있습니다. The output will include a list of dispatcher processes. 출력은 배차 프로세스의 목록을 포함합니다.
  • Now find the dispatcher process in the list of services and look at the value for max . 이제 서비스 목록에서 배차 과정을 찾아 최대의 값을보세요. This value indicates the maximum number of connections that your operating system allows for one process. 이 값은 운영 체제 하나의 프로세스에 대해 허용되는 연결의 최대 개수를 나타냅니다.

Here is a small sample. 여기에 작은 샘플입니다. Note that the value for max is 972. 최대 값은 972입니다.

  LSNRCTL> SERVICES LSNRCTL> 서비스
  Connecting to (ADDRESS=(PROTOCOL=IPC)(KEY=SOPDEV2.world)) 에 연결 (= (PROTOCOL = IPC) (KEY = SOPDEV2.world을 주소))
  Services Summary... 서비스 요약 ...
  Service "SOPDEV2" has 2 instance(s). 서비스 "SOPDEV2는"2 인스턴스 (들)을하고 있습니다.
  Instance "SOPDEV2", status UNKNOWN, has 1 handler(s) for this service... 예를 들어 "SOPDEV2"상태 알 수없는이 서비스에 대해 1 처리기 (들)을했습니다 ...
    Handler(s): 처리기 (들) :
      "DEDICATED" established:0 refused:0 "전용"설립 : 0 거절 : 0
         LOCAL SERVER 로컬 서버
  Instance "SOPDEV2", status READY, has 2 handler(s) for this service... 예를 들어 "SOPDEV2"상태가 준비,이 서비스 2 처리기 (들)을했습니다 ...
    Handler(s): 처리기 (들) :
      "DEDICATED" established:0 refused:0 state:ready "헌신"은 설립 : 0 거부 : 0 상태 : 준비
         LOCAL SERVER 로컬 서버
      "D000" established:0 refused:0 current:0 max:972 state:ready "D000"은 설립 : 0 거절 : 0 현재 : 0 최대 : 972 상태 : 준비
         DISPATCHER 배차원 
         (ADDRESS=(PROTOCOL=tcp)(HOST=appdev)(PORT=47594)) (주소 = (PROTOCOL = TCP) (HOST = appdev) (포트 = 47594)) 
NOTE : Do not attempt to perform the above test on a production database when users are trying to connect. 참고 : 사용자가 연결하려고하는 경우 프로덕션 데이터베이스에서 위의 테스트를 수행하지 마십시오. In fact, use a "testing" database to ensure that you will not create connection problems for people in your production environment. 사실, 당신이 프로덕션 환경에있는 사람에 대한 연결 문제를 생성하지 않도록하기 위해 "테스트"데이터베이스를 사용합니다.
Table 1: Determining OS Connection Limits 표 1 : OS 연결 제한을 결정

How Many Shared Server Processes? 얼마나 많은 공유 서버 프로세스?
Setting up the number of shared server processes requires the use of two initialization parameters: MTS_SERVERS and MTS_MAX_SERVERS. MTS_SERVERS 및 MTS_MAX_SERVERS : 공유 서버 프로세스의 수를 설정은 두 초기화 매개 변수를 사용해야합니다. They control both the minimum and maximum number of shared server processes that you want to create for your instance. 그들은 당신이 예를 들면 만들려는 공유 서버 프로세스의 모두 최소 및 최대 개수를 제어합니다.

  • MTS_MAX_SERVERS: Sets an upper limit on the number of shared server processes that can be created for the instance. MTS_MAX_SERVERS :이 인스턴스에 대해 만들 수있는 공유 서버 프로세스의 숫자에 상한선을 설정합니다. Ensure to choose a value for this parameter based on the total amount of resources you are willing to dedicate to all server processes. 당신은 모든 서버 프로세스에 헌정하고자하는 자원의 총액을 기준으로이 매개 변수에 대한 값을 선택할 수 있는지 확인하십시오.
  • MTS_SERVERS: Sets the number of shared servers to initially create. MTS_SERVERS이 : 처음 만들 공유 서버의 수를 설정합니다. The default value is 1. 기본값은 1입니다. You should set this value to one higher than what reflects the typical load on your system. 여러분의 시스템에 전형적인 부하를 반영하는보다 높은 하나에이 값을 설정해야합니다. Keep in mind that the goal here is to minimize the rate at which shared server processes are being built and destroyed. 여기서 목표는 공유 서버 프로세스 구축하고 파괴되는 속도를 최소화하는 것입니다 점에 유의하십시오.

How Much Memory? 메모리가 얼마나?
Before implementing MTS in your environment, you will need to decide how much shared pool or large pool memory is required for session-specific memory. 사용자 환경에서 MTS를 구현하기 전에 공유 수영장이나 대형 풀 메모리가 세션 특정 메모리가 필요합니다 어느 정도 결정이 필요합니다. An easy way to do this, is to gather the current amount of memory used by a representative session, and then extrapolate from that to cover the number of sessions you expect to have simultaneously. 이 작업을 수행하는 쉬운 방법은 대표적인 세션에 의해 사용된 메모리의 현재 금액을 모아 다음 동시에 가지고 있다고 기대 세션의 수를 커버 것과 추정하는 것입니다. Suppose I want to gather memory information from a user logged in as "JHUNTER". 난 "JHUNTER"로 로그 인한 사용자의 메모리 정보를 수집하려는 가정합시다. First you will need to get the "SID" for the "JHUNTER" user. 먼저 "JHUNTER"사용자에 대한 "SID"를 얻을해야합니다. After obtaining the proper SID, select the current "UGA memory" and "UGA memory max" from v$sesstat. 적절한 SID를 취득 후, 현재 "UGA 메모리"를 선택하고 V $ sesstat에서 "UGA 메모리 최대".

  SQL> SELECT sid FROM v$session WHERE username = 'JHUNTER'; SQL> SELECT 시드 V $ 세션에서 WHERE 이름 = 'JHUNTER';

         SID SID
  ---------- ----------
          15 15


  SQL> SELECT sn.name, ss.value SQL> SELECT sn.name, ss.value
    2 FROM v$sesstat ss, v$statname sn V $ sesstat SS, V $ statname SN에서 2
    3 WHERE ss.statistic# = sn.statistic# 3 WHERE ss.statistic # = sn.statistic #
    4 AND sn.name IN ('session uga memory', 'session uga memory max') 4 ( '세션 uga 메모리', '세션 uga 메모리 최대')에 sn.name
    5 AND ss.sid=15; 5 ss.sid = 15;

  NAME VALUE 이름 값
  ------------------------ ---------- ------------------------ ----------
  session uga memory 54364 세션 uga 메모리 54,364
  session uga memory max 57076 세션 uga 메모리 최대 57,076 
The session uga memory value represents the amount of memory that a user is currently using for session-specific information. 세션 uga 메모리 값은 사용자가 현재 세션 관련 정보를 사용하는 메모리의 양을 나타냅니다. The other value, session uga memory max represents the maximum amount of session-specific memory that has been used at any one time during the user's current session. 다른 값은 세션 uga 메모리 최대는 사용자의 현재 세션 동안 한 번에 사용되었습니다 세션 특정 메모리의 최대 크기를 나타냅니다. Lets say that the "JHUNTER" user (above) was representative of many of the other users in the database that are going to connect via MTS, and you expected 500 such connections concurrently, simply multiply both values ( session uga memory and session uga memory max ) by 500 to come up with an estimated range of 27,182,000 to 28,538,000 bytes. 하자가 "JHUNTER"사용자 (위) MTS를 통해 연결하려고하는 데이터베이스에있는 다른 사용자의 많은 대표라고 이야기하고 동시에 500과 같은 연결을 예상, 단순히 두 값 (세션 uga 메모리와 세션 uga 메모리 곱하면 최대) 500 27182000로 28,538,000 바이트의 예상 범위로 올라와 있습니다. This will be the amount of additional memory that you will need to allocate in the SGA for use by these 500 MTS sessions. 이것은 여러분이 이러한 500 MTS 세션에 의해 사용을 위해 SGA에 할당하는 번거로움이 따른다는 것을 추가 메모리의 양을 것입니다. Remember that MTS uses the shared pool for session memory, but Oracle recommends the use of the large pool. MTS는 세션 메모리 공유 풀을 사용하지만, 오라클은 대형 수영장의 사용을 권장 것을 기억하십시오. By using the large pool, you avoid fragmenting the shared pool. 큰 수영장을 사용하여 공유 수영장 fragmenting하지 마십시오. Given the above example, I would add the following to my init.ora file: 위의 예제 감안할 때, 내 init.ora 파일에 다음을 추가합니다 :

  large_pool = 32M large_pool = 32M 
The above allocates a large pool of 32 MB in size. 위의 크기는 32 MB 중 대형 수영장을 할당합니다. This is all you really have to do in order to have Oracle use it for MTS session memory. 이것은 당신이 정말로 오라클 MTS 세션 메모리를 사용할 권한을 부여하기 위해해야​​ 할 전부입니다.

Changing Database Initialization Parameters 데이터베이스 초기화 매개 변수 변경

When thinking about setting up your MTS environment, you might be tempted to think that this will require changes to your Net8 configuration files like the listener.ora. 귀하의 MTS 환경을 설정하는 방법에 대해 생각하면, 당신이이 listener.ora처럼 Net8 구성 파일의 변경 사항을 요구할 것입니다 생각하는 유혹 수도 있습니다. As you will see, this is not the case. 당신이 볼 수로서,이 사건 없습니다. All parameters for setting up your MTS environment are made to the instance and not any your Net8 config files. 귀하의 MTS 환경 설정에 대한 모든 매개 변수는 모든 사용자 Net8 설정 파일이 아닌 인스턴스로 만들어 있습니다. Remember that the dispatcher and shared processes are actually part of the instance, so it makes sense that you would configure them in the same place. 배차 및 공유 프로세스가 실제로 인스턴스의 일부하므로 그것은 당신이 같은 장소에서 그들을 구성하는 것이 의미가 있습니다.

This section of the article discusses the changes that will need to be made to the following parameters: 문서의이 섹션에는 다음과 같은 매개 변수를 만들해야합니다 변경 사항을 설명합니다 :

  • MTS_DISPATCHERS MTS_DISPATCHERS
  • MTS_MAX_DISPATCHERS MTS_MAX_DISPATCHERS
  • MTS_SERVERS MTS_SERVERS
  • MTS_MAX_SERVERS MTS_MAX_SERVERS
  • LOCAL_LISTENER LOCAL_LISTENER
  • LARGE_POOL LARGE_POOL

Setting up an MTS environment can be as simple as adding one or more MTS_DISPATCHERS parameters to your instance parameter file and then bouncing the database. MTS 환경을 설정하면 인스턴스 매개 변수 파일에 하나 이상의 MTS_DISPATCHERS 매개 변수를 추가하고 다음 데이터베이스를 수신 거부로 간단 수 있습니다. It's likely however, that you're going to want to tune some of the other parameters above. 그것은 당신이 위의 다른 매개 변수 중 일부를 조정하려는 거라고, 그러나 가능성이 높습니다.

MTS_DISPATCHERS MTS_DISPATCHERS

This is the key initialization parameter that needs to be set in order to implement MTS. 이것은 MTS를 구현하기 위해 설정하는 데 필요한 핵심 초기화 매개 변수입니다. The syntax here is very similar to what you would use in Net8 configuration files like the listener.ora file. 여기서 문법은 listener.ora 파일처럼 Net8 구성 파일에 사용할 것과 매우 유사합니다.

Here is an example of enabling MTS by only specifying the protocol to support. 여기에만 지원하는 프로토콜을 지정하여 MTS를 사용의 예입니다. This will accept default values for all other attributes: 이것은 다른 모든 속성에 대한 기본값을 수락합니다

  MTS_DISPATCHERS="(PROTOCOL=TCP)" MTS_DISPATCHERS = "(PROTOCOL = TCP)" 
If you want to support more than one protocol (TCP/IP and SPX for example), you would enter two MTS_DISPATCHERS parameter settings: 하나 이상의 프로토콜 (TCP / IP와 예를 들어, SPX)을 지원하려면 두 MTS_DISPATCHERS 매개 변수 설정을 입력합니다 :
  MTS_DISPATCHERS="(PROTOCOL=TCP)" MTS_DISPATCHERS = "(PROTOCOL = TCP)"
  MTS_DISPATCHERS="(PROTOCOL=SPX)" MTS_DISPATCHERS = "(프로토콜 = SPX)" 
NOTE : When declaring multiple MTS_DISPATCHERS parameters, they must be grouped together in the init.ora file. 참고 : 여러 MTS_DISPATCHERS 매개 변수를 선언하면, 그들은 init.ora 파일에 함께 그룹화해야합니다. Blank links are allowed, but do not place any other parameter settings between two MTS_DISPATCHERS settings. 빈 링크는 사용할 수 있습니다,하지만 아직 두 MTS_DISPATCHERS 설정 사이에 다른 매개 변수 설정을 올려 놓지 마십시오. Doing this will cause the instance to error when you try to start it. 이렇게하면 인스턴스가 당신이 그것을 시작하려고 할 때 오류가 발생할 것입니다.
Two other commonly used attributes in the MTS_DISPATCHERS are setting the "number of dispatchers" and maybe the "number of connections" each dispatcher is allowed to handle. MTS_DISPATCHERS에 두 기타 일반적으로 사용되는 속성은 "dispatchers의 개수"를 설정하고 아마 "연결 번호는"각 배차가 처리할 수 있습니다. The following example allocates four TCP/IP dispatchers and each of those dispatchers can handle up to 250 connections. 다음 예제에서는 네 개의 TCP / IP dispatchers 그 dispatchers 각각 최대 250 연결 처리할 수를 할당합니다.
  MTS_DISPATCHERS="(PROTOCOL=TCP)(DISPATCHERS=4)(CONNECTIONS=250)" MTS_DISPATCHERS = "(PROTOCOL = TCP) (DISPATCHERS = 4) (연결 = 250)" 
Another attribute that deserves attention for MTS_DISPATCHERS is the LISTENER attribute. MTS_DISPATCHERS에 대한 관심을받을 자격이 다른 속성은 리스너의 속성입니다. The LISTENER attribute allows you to specify the listener with which the dispatcher should register. 리스너 속성은 배차 등록해야되는 수신기를 지정할 수 있습니다. By default, the dispatcher will register with the listener that is monitoring port 1521 on the local database server. 기본적으로, 배차는 로컬 데이터베이스 서버에서 포트 1521를 감시하는 리스너로 등록합니다. Using the LISTENER attribute though, you can override this and have your dispatcher register with a listener assigned to either a different port or with a listener running on another database server. 수신기 속성을 사용하면 불구하고,이를 무시하고 배차가 다른 포트를 하나에 할당된 리스너 또는 다른 데이터베이스 서버에서 실행되는 리스너 등록을 할 수 있습니다. The following is an example of using the LISTENER attribute: 다음은 수신기 속성을 사용하는 예입니다 :
  MTS_DISPATCHERS="(PROTOCOL=TCP)(DISPATCHERS=4)(CONNECTIONS=250) \ MTS_DISPATCHERS = "(PROTOCOL = TCP) (DISPATCHERS = 4) (연결 = 250) \
                   (LISTENER=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(PORT=1526)(HOST=cartman))))" (리스너 = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP) (PORT = 1526) (HOST = cartman ))))" 
Here the LISTENER attribute defines an ADDRESS_LIST containing one or more listener addresses. 여기 리스너 특성은 하나 이상의 리스너 주소를 포함 ADDRESS_LIST을 정의합니다. The dispatchers will then register with each of those listeners. dispatchers 그러면 그 청취자의 각 등록합니다.
NOTE : There is also a LOCAL_LISTENER initialization parameter that provides the same functionality as the MTS_DISPATCHERS parameter's LISTENER attribute. 참고 : MTS_DISPATCHERS 매개 변수의 수신기 속성과 동일한 기능을 제공 LOCAL_LISTENER 초기화 매개 변수도 있습니다. The LISTENER attribute will override the LOCAL_LISTENER parameter and is the recommended by Oracle Corp. 리스너의 속성은 LOCAL_LISTENER 매개 변수를 무시하고 오라클 주식 회사에 의해 추천
One final note to make in reference to setting the MTS_DISPATCHERS is where you have the option of specifying the network address that it will monitor. MTS_DISPATCHERS 설정에 대한 참고 자료를 만들기 위해 마지막으로 참고 당신이 모니터링 네트워크 주소를 지정하는 옵션을 가지고있는 것입니다. (Similar to how you would set the listener process to listen on port 1521). (여러분이 포트 1521에서 수신 대기하는 리스너 프로세스를 설정해야하는 방법과 유사). One of the major reasons for forcing the port number for dispatchers is get around firewall issues. dispatchers에 대한 포트 번호를 강제의 주요 이유 중 하나는 방화벽 문제를 해결할 수 있습니다.

By default, whenever you specify the protocol to support, the dispatcher will decide on the address automatically. 기본적으로, 당신이 지원하는 프로토콜을 지정할 때마다 배차가 자동으로 주소를 결정합니다. You have the option though of specifying which address the dispatcher uses by replacing the PROTOCOL attribute with either the ADDRESS or DESCRIPTION attribute. 당신은 배차가 주소 또는 설명 속성 중 하나와 프로토콜 속성을 대체하여 사용하는 주소 지정지만 옵션이 있습니다. Below is an example that uses the ADDRESS attribute. 아래의 주소 속성을 사용하는 예제입니다. Also notice that in order to specify a port, that ALL dispatchers must be configured separately to ensure that no two dispatchers are sharing the same address: 또한 모든 dispatchers가 더이 dispatchers가 동일한 주소를 공유하지 않습니다 않도록 별도로 구성해야합니다 즉, 포트를 지정하기 위해서는 그 통지 :

  MTS_DISPATCHERS="(ADDRESS=(PARTIAL=TRUE)(PROTOCOL=TCP)(HOST=cartman)(PORT=1562)) \ MTS_DISPATCHERS은 = "(ADDRESS = (일부 = TRUE) (PROTOCOL = TCP) (HOST = cartman) (PORT = 1562)) \
                   (DISPATCHERS=1)(CONNECTIONS=250)" (DISPATCHERS = 1) (연결 = 250) "

  MTS_DISPATCHERS="(ADDRESS=(PARTIAL=TRUE)(PROTOCOL=TCP)(HOST=cartman)(PORT=1563)) \ MTS_DISPATCHERS은 = "(ADDRESS = (일부 = TRUE) (PROTOCOL = TCP) (HOST = cartman) (PORT = 1563)) \
                   (DISPATCHERS=1)(CONNECTIONS=250)" (DISPATCHERS = 1) (연결 = 250) "

  MTS_DISPATCHERS="(ADDRESS=(PARTIAL=TRUE)(PROTOCOL=TCP)(HOST=cartman)(PORT=1564)) \ MTS_DISPATCHERS은 = "(ADDRESS = (일부 = TRUE) (PROTOCOL = TCP) (HOST = cartman) (PORT = 1564)) \
                   (DISPATCHERS=1)(CONNECTIONS=250)" (DISPATCHERS = 1) (연결 = 250) "

  MTS_DISPATCHERS="(ADDRESS=(PARTIAL=TRUE)(PROTOCOL=TCP)(HOST=cartman)(PORT=1565)) \ MTS_DISPATCHERS은 = "(ADDRESS = (일부 = TRUE) (PROTOCOL = TCP) (HOST = cartman) (PORT = 1565)) \
                   (DISPATCHERS=1)(CONNECTIONS=250)" (DISPATCHERS = 1) (연결 = 250) " 

MTS_MAX_DISPATCHERS MTS_MAX_DISPATCHERS

The MTS_MAX_DISPATCHERS parameter defines an upper limit on the number of dispatchers that can be running at any one time. MTS_MAX_DISPATCHERS 매개 변수는 한 번에 실행할 수 dispatchers의 숫자에 상한선을 정의합니다. The default value for this parameter is 5. 이 매개 변수의 기본 값은 5가된다. Keep in mind that this value is subject to modification based on your values defined in MTS_DISPATCHERS. 이 값이 MTS_DISPATCHERS에 정의된 해당 값을 기준으로 변경 적용됩니다 점에 유의하십시오. Examine the following example. 다음 예제를 검사합니다.
  MTS_DISPATCHERS="(PROTOCOL=TCP)(DISPATCHERS=12)(CONNECTIONS=250)" MTS_DISPATCHERS = "(PROTOCOL = TCP) (DISPATCHERS = 12) (연결 = 250)"
  MTS_DISPATCHERS="(PROTOCOL=SPX)(DISPATCHERS=10)(CONNECTIONS=250)" MTS_DISPATCHERS = "(프로토콜 = SPX) (DISPATCHERS = 10) (연결 = 250)"
  MTS_MAX_DISPATCHERS=16 MTS_MAX_DISPATCHERS = 16 
Given the example above, the actuall value for MTS_MAX_DISPATCHERS would be adjusted upward to 22. 위의 예제 감안할 때, MTS_MAX_DISPATCHERS에 대한 actuall 값이 22 위를 조정 것입니다. (12 for TCP and 10 for SPX) (TCP 12 및 SPX에 대한 10)

MTS_SERVERS MTS_SERVERS

The MTS_SERVERS parameter controls the number of shared server processes that will be available to service MTS connections. MTS_SERVERS 매개 변수는 서비스 MTS 연결을 사용할 수 있습니다 공유 서버 프로세스의 수를 제어합니다. With this parameter, you are defining the number of shared server processes that will be created when the instance starts. 이 매개 변수를 사용하면 인스턴스가 시작될 때 생성됩니다 공유 서버 프로세스의 개수를 정의하고 있습니다. (This is also the minimum number of servers for the instance. Oracle will not reduce the number of server processes below this number). (이것은 또한 인스턴스에 대한 서버의 최소 횟수입니다. 오라클은이 번호를 아래의 서버 프로세스의 수를 감소되지 않습니다.)

MTS_MAX_SERVERS MTS_MAX_SERVERS

The MTS_MAX_SERVERS parameter puts in place an upper limit on the number of shared server processes that can be running at any given time. MTS_MAX_SERVERS 매개 변수는 장소에서 언제든지 실행할 수있는 공유 서버 프로세스의 숫자에 상한선을 저장합니다. While an instance is running, the number of shared server processes increases and decreases. 인스턴스가 실행되는 동안, 공유 서버의 수가 증가 및 감소를 처리합니다. However, the number of shared server processes will never exceed the limit placed by use of the MTS_MAX_SERVERS parameter. 그러나, 공유 서버 프로세스의 숫자는 MTS_MAX_SERVERS 매개 변수를 사용하여 배치 한도를 초과하지 않습니다.

LOCAL_LISTENER LOCAL_LISTENER

As mentioned above, the LOCAL_LISTENER parameter serves the same purpose of the LISTENER attribute of the MTS_DISPATCHERS parameter. 위에서 언급한 바와 같이, LOCAL_LISTENER 매개 변수는 MTS_DISPATCHERS 매개 변수의 수신기 속성의 동일한 목적을 제공합니다. It identifies the listener with which MTS dispatchers will register with. 그것은 MTS의 dispatchers 함께 등록됩니다있는 수신기를 나타냅니다. Below are two example of setting this parameter: 아래의이 매개 변수를 설정하는 두 가지 예를 들면 다음과 같습니다 :
  LOCAL_LISTENER="(ADDRESS_LIST= \ LOCAL_LISTENER = "(ADDRESS_LIST = \
                           (ADDRESS= \ (주소 = \
                             (PROTOCOL=TCP) \ (PROTOCOL = TCP) \
                             (HOST=cartman) \ (HOST = cartman) \
                             (PORT=1526) \ (포트 = 1526) \
                           ) \ ) \
                         )" ) " 
  LOCAL_LISTENER="(ADDRESS_LIST= \ LOCAL_LISTENER = "(ADDRESS_LIST = \
                           (ADDRESS= \ (주소 = \
                             (PROTOCOL=TCP) (PROTOCOL = TCP)
                             (HOST=localhost) (= localhost를 호스트)
                             (PORT=1521) (PORT = 1521)
                           ) )
                           (ADDRESS= (= 해결
                             (PROTOCOL=IPC) (PROTOCOL = IPC)
                             (KEY=O901DB) (KEY = O901DB)
                           ) )
                         )" ) " 
The first example specifies one listener address. 첫번째 예제 하나의 수신기의 주소를 지정합니다. Since the port for this listener is 1526, rather than the default of 1521, this is considered a non-default listener. 이 리스너에 대한 포트가 1526이기 때문에, 오히려 1521의 기본보다, 이것은 기본이 아닌이 리스너로 간주됩니다. The second example shows two addresses and also represents the default value for the LOCAL_LISTENER parameter. 두 번째 예제는 두 개의 주소를 보여줍니다 또한 LOCAL_LISTENER 매개 변수에 대해 기본값을 나타냅니다.

Consider the following when trying to decide on whether to use the LOCAL_LISTENER init.ora parameter or the LISTENER attribute of MTS_DISPATCHERS. LOCAL_LISTENER init.ora 매개 변수 또는 MTS_DISPATCHERS의 수신기 속성을 사용할지 여부를 결정하려고 할 때 다음을 고려하십시오. Using the LISTENER attribute gives you finer control; you can have different dispatchers register with different listeners. 수신기 속성을 사용하면 당신에게 미세한 제어 기능을 제공하며, 다른 dispatchers 다른 청취자가 등록을 할 수 있습니다. LOCAL_LISTENER on the other hand, provides global control. 반면에 LOCAL_LISTENER가 글로벌 제어를 제공합니다. Oracle still recommends the use of the LISTENER attributed defined in the MTS_DISPATCHERS parameter. 오라클은 여전히​​ MTS_DISPATCHERS 매개 변수에 정의된 리스너 귀속의 사용을 권장합니다.

LARGE_POOL LARGE_POOL

We have discussed the use of the LARGE_POOL several times in this article. 우리는이 문서에 나와있는 LARGE_POOL 여러 번의 사용을 논의했습니다. Although it is not and MTS specific parameter, it is something that needs strong consideration when implementing MTS. 그것이 MTS 특정 매개 변수가 아니므로이지만, MTS를 구현할 때 강한 배려를 필요로 무언가이다. If your instance does not have a large pool defined, the session specific memory for all MTS connections will be taken from the shared pool. 인스턴스는 정의된 대형 수영장이 없다면, 모든 MTS 연결 세션 특정 메모리는 공유 수영장에서 가져온 것입니다. Have MTS take from the shared pool causes fragmentation and is not the recommended configuration from Oracle. 공유 수영장 조각을 원인과 오라클의 권장 구성하지 않습니다에서 MTS를 취할 있습니다.

Forcing a Dedicated Server Connection 전용 서버 연결을 강제

Remember that when configuring MTS requires no changes being made to your Net8 config files. MTS를 구성할 때해도 Net8 설정 파일을 만들어도되고 변경이 필요 없다는 것을 기억하십시오. MTS configuration happens at the instance level, and when configured, new connections start using it. MTS 구성 인스턴스 수준에서 발생하고 구성할 때, 새로운 연결을 사용하여 시작합니다. One thing you can control though through the use of your Net8 config files, is forcing a dedicated connection. 귀하의 Net8 설정 파일의 사용을 통해 제어할 수 있지만 한 가지는 전용 연결을 강제합니다. (Overriding the MTS configuration at the instance). (인스턴스에 MTS 구성을 우선). There are basically two ways to force a dedicated server connection: tnsnames.ora and sqlnet.ora. tnsnames.ora와 sqlnet.ora : 전용 서버 연결을 강제하는 방법은 두 가지가 기본적으로 있습니다.

tnsnames.ora tnsnames.ora
Simply add the attribute (SERVER=DEDICATED) to the list of CONNECT_DATA attributes. 간단히 CONNECT_DATA 속성 목록에 속성 (서버 = 전용)을 추가합니다.

  O901DB_DEDICATED.world = O901DB_DEDICATED.world =
  (DESCRIPTION = (DESCRIPTION =
     (ADDRESS_LIST = (ADDRESS_LIST =
         (ADDRESS = (= 해결
            (PROTOCOL = TCP) (PROTOCOL = TCP)
            (Host = cartman) (호스트 = cartman)
            (Port = 1521) (포트 = 1521)
         ) )
     ) )
     (CONNECT_DATA = (CONNECT_DATA =
         (SID = O901DB) (SID = O901DB)
         (SERVER = DEDICATED) (서버 = 전용)
     ) )
  ) ) 

sqlnet.ora sqlnet.ora
Use the USE_DEDICATED_SERVER=ON in the sqlnet.ora file to force EVERY session that you initiate from your client to use dedicated server. 당신은 전용 서버를 사용하도록 클라이언트에서 시작하는 모든 세션을 강제로 sqlnet.ora 파일에 = ON USE_DEDICATED_SERVER을 사용합니다. As you can see, this is a much less flexible approach as it does not allow for specific connections to use dedicate server. 당신이 볼 수 있듯이, 이것은 서버를 바치고 사용하는 특정 연결을 허용하지 않는 등 훨씬 덜 유연한 접근 방식이다.

Viewing MTS Statistics MTS 통계보기

Operating-System Commands 운영 체제 명령

Within UNIX and Linux, each dispatcher and shared server process is a separate operating-system process. UNIX 및 Linux, 각 배차 및 공유 서버 프로세스 내에서 별도의 운영 체제 프로세스입니다. The exact naming format varies from platform to platform, but the dispatcher process will always have the format d xxx in their name, and the shared server process will always have s xxx in their name. 정확한 명명 형식은 플랫폼에서 플랫폼으로 다양하지만, 배차 프로세스는 항상 그들의 이름에서 형식 D의 XXX가되며, 공유 서버 프로세스는 항상 자신의 이름 님의 XXX를해야합니다. In almost all cases, the xxx will be a number starting at 000. 거의 모든 경우에, XXX는 000부터 시작 번호가됩니다. This number gets incremented sequentially for each new dispatcher and/or shared server process started. 이 번호는 각각의 새로운 배차 및 / 또는 공유 서버 프로세스 시작에 대해 순차적으로 증가된옵니다.

On most UNIX system, you can make use of the ps command to generate a list of these processes. 대부분의 UNIX 시스템에서는 PS 명령의 사용이 프로세스의 목록을 생성하실 수 있습니다. You would then pipe this output into the grep command to filter out the ones that you are interested in. The following is an example: 당신은 grep 명령으로 파이프이 출력을 다음 예입니다 인치 자네가 관심이되는 것들을 걸러 다음과 같습니다

  O901DB on cartman: ps -ef | grep ora_[ds][0123456789]*_O901DB cartman에 O901DB : PS - EF | grep ora_ [DS] [0123456789] * _O901DB
  oracle 8742 1 0 Feb 06 ? 오라클 8742 1 0 2월 6일? 0:00 ora_s013_O901DB 0시 ora_s013_O901DB
  oracle 8740 1 0 Feb 06 ? 오라클 8740 1 0 2월 6일? 0:00 ora_s012_O901DB 0시 ora_s012_O901DB
  oracle 8720 1 0 Feb 06 ? 오라클 8720 1 0 2월 6일? 0:00 ora_s002_O901DB 0시 ora_s002_O901DB
  oracle 8724 1 0 Feb 06 ? 오라클 8724 1 0 2월 6일? 0:00 ora_s004_O901DB 0시 ora_s004_O901DB
  oracle 8716 1 0 Feb 06 ? 오라클 8716 1 0 2월 6일? 0:08 ora_s000_O901DB 0시 8분 ora_s000_O901DB
  oracle 8738 1 0 Feb 06 ? 오라클 8738 1 0 2월 6일? 0:00 ora_s011_O901DB 0시 ora_s011_O901DB
  oracle 8718 1 0 Feb 06 ? 오라클 8718 1 0 2월 6일? 0:06 ora_s001_O901DB 0시 6분 ora_s001_O901DB
  oracle 8728 1 0 Feb 06 ? 오라클 8728 1 0 2월 6일? 0:00 ora_s006_O901DB 0시 ora_s006_O901DB
  oracle 8736 1 0 Feb 06 ? 오라클 8736 1 0 2월 6일? 0:00 ora_s010_O901DB 0시 ora_s010_O901DB
  oracle 8722 1 0 Feb 06 ? 오라클 8722 1 0 2월 6일? 0:00 ora_s003_O901DB 0시 ora_s003_O901DB
  oracle 8744 1 0 Feb 06 ? 오라클 8744 1 0 2월 6일? 0:00 ora_s014_O901DB 0시 ora_s014_O901DB
  oracle 8726 1 0 Feb 06 ? 오라클 8726 1 0 2월 6일? 0:00 ora_s005_O901DB 0시 ora_s005_O901DB
  oracle 8730 1 0 Feb 06 ? 오라클 8730 1 0 2월 6일? 0:00 ora_s007_O901DB 0시 ora_s007_O901DB
  oracle 8734 1 0 Feb 06 ? 오라클 8734 1 0 2월 6일? 0:00 ora_s009_O901DB 0시 ora_s009_O901DB
  oracle 8732 1 0 Feb 06 ? 오라클 8732 1 0 2월 6일? 0:00 ora_s008_O901DB 0시 ora_s008_O901DB
  oracle 8746 1 0 Feb 06 ? 오라클 8746 1 0 2월 6일? 0:00 ora_s015_O901DB 0시 ora_s015_O901DB
  oracle 8748 1 0 Feb 06 ? 오라클 8748 1 0 2월 6일? 0:00 ora_s016_O901DB 0시 ora_s016_O901DB
  oracle 8750 1 0 Feb 06 ? 오라클 8750 1 0 2월 6일? 0:00 ora_s017_O901DB 0시 ora_s017_O901DB
  oracle 8752 1 0 Feb 06 ? 오라클 8752 1 0 2월 6일? 0:00 ora_s018_O901DB 0시 ora_s018_O901DB
  oracle 8754 1 0 Feb 06 ? 오라클 8754 1 0 2월 6일? 0:00 ora_s019_O901DB 0시 ora_s019_O901DB
  oracle 8756 1 0 Feb 06 ? 오라클 8756 1 0 2월 6일? 0:00 ora_s020_O901DB 0시 ora_s020_O901DB
  oracle 8758 1 0 Feb 06 ? 오라클 8758 1 0 2월 6일? 0:00 ora_s021_O901DB 0시 ora_s021_O901DB
  oracle 8760 1 0 Feb 06 ? 오라클 8760 1 0 2월 6일? 0:00 ora_s022_O901DB 0시 ora_s022_O901DB
  oracle 8762 1 0 Feb 06 ? 오라클 8762 1 0 2월 6일? 0:00 ora_s023_O901DB 0시 ora_s023_O901DB
  oracle 8764 1 0 Feb 06 ? 오라클 8764 1 0 2월 6일? 0:00 ora_s024_O901DB 0시 ora_s024_O901DB
  oracle 8766 1 0 Feb 06 ? 오라클 8766 1 0 2월 6일? 0:01 ora_d000_O901DB 0시 1분 ora_d000_O901DB
  oracle 8768 1 0 Feb 06 ? 오라클 8768 1 0 2월 6일? 0:02 ora_d001_O901DB 0시 2분 ora_d001_O901DB 
The above example shows two dispatcher processes as well as 25 shared server processes. 위 예제는 두 배차 프로세스뿐만 아니라 25 공유 서버 프로세스를 보여줍니다.

Listener Control 리스너 제어

Using the SERVICES command within the Listener Control utility, you can get a listing of the dispatchers that have been registered with the listener. 리스너 제어 유틸리티 내에서 서비스 명령을 사용하면 리스너에 등록되어있는 dispatchers의 목록을 얻을 수 있습니다. Here is a sample out of the SERVICES command: 여기 서비스 명령의 한 예제입니다 :
  LSNRCTL> SERVICES listener LSNRCTL> 서비스 청취자
  Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=cartman)(PORT=1526))) (= (ADDRESS = (PROTOCOL = TCP) (HOST = cartman) (PORT = 1526가)) 설명)은 연결
  Services Summary... 서비스 요약 ...
  Service "O901DB" has 1 instance(s). 서비스 "O901DB는"1 인스턴스 (들)을하고 있습니다.
    Instance "O901DB", status UNKNOWN, has 4 handler(s) for this service... 예를 들어 "O901DB"상태 알 수없는이 서비스에 대한 네 처리기 (들)을했습니다 ...
      Handler(s): 처리기 (들) :
        "DEDICATED" established:194 refused:0 "전용"설립 : 194 거절 : 0
           LOCAL SERVER 로컬 서버
        "DEDICATED" established:0 refused:0 state:ready "헌신"은 설립 : 0 거부 : 0 상태 : 준비
           LOCAL SERVER 로컬 서버
        "DISPATCHER" established:96 refused:23 current:38 max:250 state:ready 설립 "배차원"96 거부 : 23 현재 : 38 최대 : 250 상태 : 준비
           D000 D000 
           (ADDRESS=(PROTOCOL=tcp)(HOST=cartman)(PORT=1219)) () = (PROTOCOL = TCP) (HOST = cartman) (포트 = 1219을 주소)
  Service "PLSExtProc" has 1 instance(s). 서비스 "PLSExtProc"1 인스턴스 (들)을하고 있습니다.
    Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service... 예를 들어 "PLSExtProc"상태 알 수없는이 서비스에 대해 1 처리기 (들)을했습니다 ...
      Handler(s): 처리기 (들) :
        "DEDICATED" established:0 refused:0 "전용"설립 : 0 거절 : 0
           LOCAL SERVER 로컬 서버
  The command completed successfully 명령이 성공적으로 완료 
Figure 4 (below) gives a short overview of the different parameters in the SERVICES output command. 그림 4는 (아래) 서비스 출력 명령에 다른 매개 변수의 짧은 개요를 제공합니다.

Figure 4: Output from the Listener Control's SERVICES command 그림 4 : 리스너 제어의 서비스 명령에서 출력

Dynamic Performance Views 동적 성능보기


Dynamic Performance View relevant to MTS MTS와 관련된 동적 성능보기
View name 이름보기 Description 설명
V$CIRCUIT V $ 회로 Returns one row to the instance for each MTS connection. 각각의 MTS 연결 인스턴스에 행 하나를 반환합니다. A circuit is a connection through a specific dispatcher and shared server process. 회로는 특정 배차 및 공유 서버 프로세스를 통해 연결됩니다. Columns in this view relate each MTS circuit to a specific dispatcher, shared server process and session. 이보기에서 열은 특정 배차, 공유 서버 프로세스와 세션에 각각의 MTS 회로 관련.
V$DISPATCHER V $의 배차 Returns one row for each dispatcher process associated with the instance. 인스턴스와 연관된 각 배차 프로세스를 하나의 행을 반환합니다. This view returns information such as the dispatcher's name, network address, process address and status. 이보기에는 배차의 이름, 네트워크 주소, 프로세스 주소 및 상태 등의 정보를 제공합니다.
V$DISPATCHER_RATE V $ DISPATCHER_RATE Returns one row for each dispatcher process, and returns rate statistics for each dispatcher. 각 배차원 공정 한 행을 반환하고, 각각의 배차에 대한 비율 통계를 반환합니다.
V$MTS V $ MTS Returns only one row. 하나의 행을 반환합니다. This view provides some statistics that you can use to determine whether or not you have the MTS_SERVERS parameter set to a reasonable value. 이보기는 당신이 적당한 값으로 MTS_SERVERS 매개 변수 집합이 있는지 여부를 확인하는 데 사용할 수있는 몇 가지 통계를 제공합니다.
V$QUEUE V $ 대기열 Returns one row for MTS queue in the instance. 인스턴스에 MTS 대기열에 대해 행 하나를 반환합니다. Each dispatcher will have one response queue associated with it, and their will always be one common request queue for the instance. 각 배차원는과 관련된 한 응답 대기열을 것입니다, 그들은 항상 인스턴스에 대해 하나 일반적인 요청 대기열 것입니다. The number of rows returned by V$QUEUE is always equal to the number of dispatchers plus one. V $ 대기열에 의해 반환된 행 수를 항상 dispatchers 더하기 하나의 숫자와 동일한 것입니다.
V$SHARED_SERVER V $ SHARED_SERVER Returns one row for each shared server process that is currently running as part of the instance. 현재 인스턴스의 일부로 실행되는 각 공유 서버 프로세스에 대해 행 하나를 반환합니다. This view returns the process name, process address, status and other useful statistics. 이보기는 프로세스 이름, 프로세스 주소, 상태 및 기타 유용한 통계를 반환합니다.
Table 2: Dynamic Performance View relevant to MTS 표 2 : MTS와 관련된 동적 성능보기

Dispatcher Process Status 배차원 프로세스 상태

  SQL> SELECT name, status, accept, created, conf_indx, network SQL> SELECT 이름, 상태, 수락, 만든, conf_indx, 네트워크
    2 FROM v$dispatcher; V $ 배차원에서 2;

  NAME STATUS ACCEPT CREATED CONF_INDX NETWORK NAME 상태 만든 CON​​F_INDX 네트워크에 동의
  ---- ------ ------ ------- --------- -------------------------------------------------- ---- ------ ------ ------- --------- ------------------ --------------------------------
  D000 WAIT YES 56 0 (ADDRESS=(PROTOCOL=tcp)(HOST=cartman)(PORT=38793)) D000은 예 56 0 (= (PROTOCOL = TCP) (HOST = cartman) (포트 = 38793을 주소)) 기다려요
  D001 WAIT YES 78 1 (ADDRESS=(PROTOCOL=tcp)(HOST=cartman)(PORT=38794)) D001은 (주소 = (PROTOCOL = TCP) (HOST = cartman) (포트 = 38794)) YES 78 일 잠깐 
  • NAME : Returns the dispatcher's name. 이름 : 배차의 이름을 반환합니다. This forms part of the operating system process name. 이것은 운영 체제 프로세스 이름의 일부를 형성합니다.

  • NAME : Returns the dispatcher's current status. 이름 : 배차의 현재 상태를 반환합니다. Valid values are: 유효한 값은 다음과 같습니다

    • WAIT : The dispatcher is idle and waiting for work. WAIT : 배차원는 유휴 상태이고 일을 기다리고 있습니다.
    • SEND : The dispatcher is sending a message. 보내기 : 배차원는 메시지를 보내는 것입니다.
    • RECEIVE : The dispatcher is receiving a message. 수신 : 배차원는 메시지를 받고 있습니다.
    • CONNECT : The dispatcher is establishing a new connection from a client. 연결 : 배차원는 클라이언트에서 새 연결을 설정합니다.
    • DISCONNECT : A client is disconnecting from the dispatcher. 분리 : 클라이언트는 배차에서 분리됩니다.
    • BREAK : The dispatcher is handling a break. BREAK : 배차원는 휴식을 처리합니다.
    • OUTBOUND : The dispatcher is establishing an outbound connection. 아웃 바운드 : 배차원는 아웃 바운드 연결을 설정합니다.

  • ACCEPT : Tells you whether or not the dispatcher is accepting new connections. 동의 : 배차가 새로운 연결을 수락할지 여부를 알려줍니다. Valid values are YES and NO. 유효한 값은 그렇기도하고 아니기도하지 않습니다.

  • CREATED : Returns the number of virtual circuits currently associated with this dispatcher. 만든 : 현재이 배차와 관련된 가상 회로의 개수를 반환합니다.

  • CONFIG IDX : Indicates the specific MTS_DISPATCHERS initialization parameter on which this dispatcher is based. CONFIG IDX :이 배차의 기반이되는 특정 MTS_DISPATCHERS 초기화 매개 변수를 나타냅니다. Dispatchers created from the first MTS_DISPATCHERS parameter in your instance's parameter file will have a CONF_INDX value of 0. 인스턴스의 매개 변수 파일의 첫 번째 MTS_DISPATCHERS 매개 변수에서 생성된 Dispatchers 0의 CONF_INDX 값이됩니다. Dispatcher's created from the second MTS_DISPATCHERS parameter will have a value of 1, and so on. 배차는 두 번째 MTS_DISPATCHERS 매개 변수에서 이렇게 1의 값을 가지고 있고, 만들어지는 것입니다.

  • NETWORK : Returns the dispatcher's network address. 네트워크 : 배차의 네트워크 주소를 반환합니다.

Dispatcher Process Utilization 배차원 프로세스 활용

  SQL> SELECT name, busy / (busy + idle) * 100 SQL> SELECT 이름, (바쁜 + 유휴) / 바쁜 * 100
    2 FROM v$dispatcher; V $ 배차원에서 2;

  NAME BUSY/(BUSY+IDLE)*100 이름 (바쁜 + 유휴) / 바쁜 * 100
  ---- -------------------- ---- --------------------
  D000 .000359889 D000 0.000359889
  D001 .000405469 D001 0.000405469 
Doesn't look like these dispatchers are very busy! 이러한 dispatchers 매우 바쁘다처럼 보이지 않는다! Keep in mind that the BUSY and IDLE values are reported in hundredths of a second. 바쁜와 유휴 값이 두 번째의 hundredths에서보고 있음을 유념하시기 바랍니다. If the BUSY value for a dispatcher is 100, that means the dispatcher had been busy for 1 second. 배차에 대한 약속 값이 100면, 그것은 배차 1 초 동안 바쁜 있었다는 것이죠.

If dispatcher utilization is very high, you should consider creating more dispatcher processes. 배차 사용률이 매우 높은 경우 더 배차 프로세스를 만드는 것이 좋습니다. If dispatcher utilization is very low, you should consider deleting some dispatcher processes. 배차 사용률이 매우 낮은 경우, 일부 배차 프로세스를 삭제 고려해야합니다. In the above example, I would consider only running one dispatcher process to support this instance. 위의 예제에서, 난 단지이 인스턴스를 지원하는 하나의 배차 프로세스를 실행이라고 생각한다.

Queue Size and Wait Time 대기열 크기와 대기 시간

  SQL> SELECT paddr, type, queued, DECODE(totalq,0,0,wait/totalq) SQL> SELECT paddr, 종류, 대기열, 디코딩 (totalq, 0,0, 잠깐 만요 / totalq)
    2 FROM v$queue; V $ 대기열에서 2;

  PADDR TYPE QUEUED DECODE(TOTALQ,0,0,WAIT/TOTALQ) PADDR 종류 대기열 해독 (TOTALQ, 0,0, 기다려 / TOTALQ)
  -------- ---------- -------- ------------------------------ -------- ---------- -------- ------------------------ ------
  00 COMMON 0 .009878904 00 공통 0 0.009878904
  8008AC54 DISPATCHER 0 3.38482683 8008AC54 배차원 0 3.38482683
  8008AF70 DISPATCHER 0 .009591116 8008AF70 배차원 0 0.009591116 
You can get an idea of how well work is flowing through the request and response queues by using v$queue. 이 작품은 V $ 대기열을 사용하여 요청 및 응답 대기열을 통해 흐르는 얼마나 잘의 아이디어를 얻을 수 있습니다.

The DECODE in the query handles the case where the TOTALQ column, which is the divisor, happens to be zero. 검색어에 디코딩은 제수입니다 TOTALQ 열에, 제로에서 일어나는 사건을 처리합니다. The average wait time is reported in hundredths of a second. 평균 대기 시간은 초 hundredths에보고됩니다. (ie If the average wait time of a dispatcher is 37, works out to 0.37 seconds.) (즉 배차의 평균 대기 시간은 37 경우 0.37 초로 사용할 수 있습니다.)

The COMMON queue is where requests are placed so that they can be picked up and executed by a shared server process. 요청들이 데리러와 공유 서버 프로세스에 의해 실행될 수 있도록 배치 어디 공통 대기열입니다. If you average wait time is high, you might be able to lower it by creating more shared server processes. 기다리는 시간 높은 평균되면 더 많은 공유 서버 프로세스를 생성하여 그것을 낮출 수 있습니다.

Users and Dispatchers 사용자 및 Dispatchers

  SQL> SELECT d.name, s.username, c.status, c.queue SQL> SELECT d.name, s.username, c.status, c.queue
    2 FROM v$circuit c, v$dispatcher d, v$session s
    3 WHERE c.dispatcher = d.paddr AND c.saddr = s.saddr;

  NAME USERNAME STATUS QUEUE
  ---- ------------------ ---------------- ----------------
  D000 JHUNTER NORMAL NONE
  D001 AHUNTER NORMAL NONE 
  • NAME : Returns the dispatcher's name. This forms part of the operating system process name.

  • USERNAME : Oracle username.

  • STATUS : Reports the status of the circuit, and may take one of the following values:

    • BREAK : The circuit had been interrupted due to a break.
    • EOF : The connection is terminating, and teh circuit is about to be deleted.
    • OUTBOUND : The circuit represents an outbound connection to another database.
    • NORMAL : The circuit represents a normal client connection.

  • QUEUE : Reports on the work currently being done. One the following values will be returned:

    • COMMON : A request has been placed into the common request queue, and the circuit is waiting for it to be picked up be a shared server process.
    • DISPATCHER : Results from a request are being returned to the client by the dispatcher.
    • SERVER : A request is currently being acted upon by a shared server process.
    • NONE : A circuit (or connection) is idle. Nothing is happening.

Shared Server Utilization

 SQL> SELECT name, busy / (busy + idle) * 100
    2 FROM v$shared_server;

  NAME BUSY/(BUSY+IDLE)*100
  ---- -------------------- ---- --------------------
  S000 .00155527
  S001 .000669656
  S002 .000012313
  S003 0
  S004 0
  S005 0
  S006 0
  S007 0
  S008 0
  S009 0
  S010 0
  S011 0
  S012 0
  S013 0
  S014 0
  S015 0
  S016 0
  S017 0
  S018 0
  S019 0
  S020 0
  S021 0
  S022 0
  S023 0
  S024 0 

Other Shared Server Statistics

The v$mts view is useful when trying to tune both the MTS_SERVERS and MTS_MAX_SERVERS initialization parameters. Here is an example output from v$mts:

 SQL> SELECT servers_started, servers_terminated, servers_highwater
    2 FROM v$mts;

  SERVERS_STARTED SERVERS_TERMINATED SERVERS_HIGHWATER
  --------------- ------------------ -----------------
               94 18 25 
  • SERVERS_STARTED : The number of shared server processes started as the instance adjusts the number of shared processes up and down from the initial value specified by the MTS_SERVERS parameter. When the instance starts, and after the initial number of shared server processes specified by MTS_SERVERS has been started, this value is set to 0. From that point on, this value is incremented whenever a new shared server process is started.

  • SERVERS_TERMINATED : A count of the total number of shared server processes that have been terminated since the instance was started.

  • NOTES : If the SERVERS_HIGHWATER value matches, the instance's MTS_MAX_SERVERS value, then you might realize a performance benefit from increasing MTS_MAX_SERVERS. If the counts for SERVERS_STARTED and SERVERS_TERMINATED keep climbing, then you should consider raising MTS_SERVERS. Raising the minimum number of shared server processes should reduce the number that are deleted only to be recreated later.

반응형
Posted by [PineTree]
ORACLE/ADMIN2011. 12. 8. 09:27
반응형

[CRS, DB PATCHSET 한 후  DB만 원래대로 복원하기 위해 downgrade를 해줌]

전제조건
   1. 10.2.0.5 patchset으로 설치된 crs 와 db 설치됨
   2. 10.2.0.4 버전이었을때 백업을 해놓아야하는 부분(oraInventory, ORACLE_HOME폴더)
      2-1. /etc/oraInst.loc에 내용에 있는 oraInventory 폴더
      2-2. ORACLE_HOME 폴더

1. crs_stat -t   RAC상태가 online인지 확인한다.

2. alter system set cluster_database=FALSE scope=spfile;

3. srvctl stop database -d DB명 후
   
   $ORACLE_HOME/rdbms/admin/catrelod.sql
   $ORACLE_HOME/network/admin/tnsnames.ora
  
   위 두개 파일을 백업 해놓는다.

4.
   4-1. sqlplus 접속후
   4-2. startup downgrade
   4-3. spool downgrade.out
   4-4. @?/rdbms/admin/catdwgrd.sql
   4-5. spool off
   4-6. shutdown immediate

5. 10.2.0.4버전이었을때 백업했던 oraInventory폴더를   /etc/oraInst.loc 파일에서 가르키고 있는 곳에 복원 시킴

6. 10.2.0.4버전이었을때 백업했던 것을 다시 복원시켜야함
   6-1. 위에서 백업했던 10.2.0.5용 catrelod.sql와 tnsnames.ora를  10.2.0.4폴더 자리에 넣어놓는다.

7. 한쪽노드에서
   7-1. sqlplus 접속후
   7-2. startup downgrade
   7-3. spool catrelod.out
   7-4. @?/rdbms/admin/catrelod.sql
   7-5. spool off
   7-6. select comp_name, version, status from dba_registry;
        COMP_NAME                           VERSION                        STATUS
        ----------------------------------- ------------------------------ ----------------------
        Oracle Enterprise Manager           10.2.0.4.0                     VALID
        Spatial                             10.2.0.4.0                     INVALID
        Oracle interMedia                   10.2.0.4.0                     VALID
        OLAP Catalog                        10.2.0.4.0                     VALID
        Oracle XML Database                 10.2.0.4.0                     VALID
        Oracle Text                         10.2.0.4.0                     VALID
        Oracle Expression Filter            10.2.0.4.0                     VALID
        Oracle Rule Manager                 10.2.0.4.0                     VALID
        Oracle Workspace Manager            10.2.0.4.3                     VALID
        Oracle Data Mining                  10.2.0.4.0                     VALID
        Oracle Database Catalog Views       10.2.0.4.0                     VALID
        Oracle Database Packages and Types  10.2.0.4.0                     VALID
        JServer JAVA Virtual Machine        10.2.0.4.0                     VALID
        Oracle XDK                          10.2.0.4.0                     VALID
        Oracle Database Java Packages       10.2.0.4.0                     VALID
        OLAP Analytic Workspace             10.2.0.4.0                     VALID
        Oracle OLAP API                     10.2.0.4.0                     INVALID
        Oracle Real Application Clusters    10.2.0.4.0                     VALID

   7-7. shutdown immediate
   7-8. startup
   7-9. @?/rdbms/admin/utlrp.sql
  
8. select comp_name, version, status from dba_registry;
   COMP_NAME                           VERSION                        STATUS
   ----------------------------------- ------------------------------ ----------------------
   Oracle Enterprise Manager           10.2.0.4.0                     VALID
   Spatial                             10.2.0.4.0                     VALID
   Oracle interMedia                   10.2.0.4.0                     VALID
   OLAP Catalog                        10.2.0.4.0                     VALID
   Oracle XML Database                 10.2.0.4.0                     VALID
   Oracle Text                         10.2.0.4.0                     VALID
   Oracle Expression Filter            10.2.0.4.0                     VALID
   Oracle Rule Manager                 10.2.0.4.0                     VALID
   Oracle Workspace Manager            10.2.0.4.3                     VALID
   Oracle Data Mining                  10.2.0.4.0                     VALID
   Oracle Database Catalog Views       10.2.0.4.0                     VALID
   Oracle Database Packages and Types  10.2.0.4.0                     VALID
   JServer JAVA Virtual Machine        10.2.0.4.0                     VALID
   Oracle XDK                          10.2.0.4.0                     VALID
   Oracle Database Java Packages       10.2.0.4.0                     VALID
   OLAP Analytic Workspace             10.2.0.4.0                     VALID
   Oracle OLAP API                     10.2.0.4.0                     VALID
   Oracle Real Application Clusters    10.2.0.4.0                     VALID

9. alter system set cluster_database=TRUE scope=spfile;
10. shutdown
11. srvctl start database -d 데이터베이스명

반응형
Posted by [PineTree]
ORACLE/ADMIN2011. 11. 22. 23:54
반응형
oracle shared pool size얼마나 남았나?
 
select to_number(v$parameter.value) value, v$sgastat.bytes,
(v$sgastat.bytes/v$parameter.value)*100 "Percent Free"
from v$sgastat, v$parameter
where v$sgastat.name = 'free memory'
and v$parameter.name = 'shared_pool_size';

=============================================================
DB shared pool flush시키는 명령어
alter system flush shared_pool;

반응형
Posted by [PineTree]
ORACLE/ADMIN2011. 11. 22. 23:48
반응형

(Oracle 10g) MMAN 백그라운드 프로세스를 통한 자동 공유 메모리 관리
========================================

PURPOSE



이 문서에서는 Oracle database 10g의 Self Managing 기능 중의 하나인
자동 공유 메모리 관리 기능에 대하여 알아보고 SGA_TARGET 이라는
새로운 파라미터와 MMAN이라는 새로운 백그라운드 프로세스에 대하여
소개하기로 한다.

Explanation


1. 개요

SGA_TARGET 파라미터를 이용한 자동 SGA 튜닝이 어떻게 이루어지는지
그 원리를 알아보도록 한다.
자동 SGA 튜닝은 Oracle database 10g의 ADDM을 가능하게 하는 요소인
메모리 advisor가 그 기능을 수행한다.

자동 공유 메모리 관리 기능이 갖는 장점은 다음과 같은 몇 가지가 있다.
첫째, workload가 변함에 따라 자동으로 공유 메모리가 적용이 된다.
둘째, 메모리의 활용률을 극대화한다.
세째, out-of-memory라는 메모리 부족 발생으로 인한 에러를 예방할 수 있다.

즉, 오라클의 공유 메모리 영역 중 Shared pool size, Buffer cache size,
Large pool size, Java pool size를 매뉴얼하게 셋팅할 필요가 없다.
가용한 메모리의 사용을 보다 효과적으로 해주는 것 뿐만 아니라,
메모리 자원을 얻는 데 필요한 비용을 줄여줄 수 있다.
무엇보다 dynamic하고 flexible한 메모리 관리 구조를 통하여
오라클 데이타베이스 관리를 단순화시켜 준다.

2. MMAN 백그라운드 프로세스

공유 메모리의 자동 튜닝을 위하여 MMAN이라는 백그라운드 프로세스가
새로이 등장하였다.
MMAN이라는 백그라운드 프로세스가 5분 마다 주기적으로 수집한
작업 부하(Workload) 정보를 바탕으로 동적으로 구성이 된다.
메모리는 가장 필요한 곳으로 동적으로 할당이 된다.

SPFILE을 사용하면 MMAN이 변경한 파라미터들의 정보가 자동으로
SPFILE에 저장이 된다.
그러므로, 가능한 Oracle 9i 이상부터는 SPFILE 의 사용을 권장한다.
왜냐 하면 다음과 같은 세 가지 장점이 있기 때문이다.

첫째, 각 부분 크기의 권장안을 인스턴스 종료 후에도 보관할 수 있다.
둘째, 저장되어진 각 파라미터들의 사이즈는 데이타베이스 기동 시 할당이 된다.
세째, 각 파라미터들의 최적의 값을 찾는 데 드는 비용을 줄일 수 있다.

이렇게 MMAN 이라는 프로세스에 의해서 자동 공유 메모리 관리 기능이
구현이 되는 것이다.


3. SGA_TARGET 파라미터를 통한 자동 공유 메모리 관리

자동 공유 메모리 관리 기능을 사용하게 되면 오라클 SGA 관련 네 가지
파라미터들을 DBA가 일일이 셋팅할 필요가 없다.
오라클의 공유 메모리 크기는 SGA_TARGET 이라는 파라미터 하나로 다 조절이 된다.
SHARED_POOL_SIZE, DB_CACHE_SIZE, LARGE_POOL_SIZE, JAVA_POOL_SIZE 라는
파라미터들을 구성하는 데 관여하지 않아도 된다는 뜻이다.
과거에는 이러한 파라미터들을 너무 낮게 잡게 되면 성능도 저하될 뿐만 아니라
out-of-memory error인 ORA-4031 ERROR를 자주 만나게 되었고 메모리 낭비도 있었다.

그러나, Oracle database 10g의 New Feature는 SGA_TARGET이라는 새로운
파라미터만 셋팅하여도 되게 설계되었다.
SGA_TARGET이라는 파라미터는 해당 인스턴스에 필요한 SGA의 최대 크기를 나타낸다.
이 파라미터는 SGA 내의 모든 메모리들을 포함한다.
즉, Automatic하게 사이즈가 결정되는 파라미터, 매뉴얼하게 결정되는 파라미터,
startup 시에 할당되는 internal metadata 할당을 다 포함한다.
10g 이전 버젼처럼 SGA의 TOTAL 크기를 정확히 컨트롤하는 것이 어렵지가 않다는 뜻이다.

SGA_TARGET 파라미터를 셋팅할 때에는 다음을 염두에 두어야 한다.

1) SGA 영역 중 자동 구성으로 조절되지 않는 영역이 있는데
Redo Log buffer 와 Fixed SGA 영역, BUFFER KEEP, RECYCLE과 관련된 파라미터,
STREAMS POOL 관련 파라미터들이다.

2) SGA_TARGET 파라미터가 0으로 셋팅되면 자동 공유 메모리 기능은 DISABLE된다.
SGA_TARGET 파라미터의 DEFAULT 값은 0이다.
SGA_TARGET 파라미터가 0이 아닌 어떤 값으로 셋팅이 되어 있어도
SHARED_POOL_SIZE 또는 DB_BLOCK_BUFFERS 와 같은 파라미터들은 여전히
셋팅할 수는 있다.

3) SGA_TARGET 파라미터가 설정되어 있지 않거나 0 으로 셋팅되어 있을 경우,
자동 튜닝 파라미터들은 10g 이전 버젼에서와 같이 관리된다.
단, 예외는 있다. SHARED_POOL_SIZE가 그 경우인데, 내부적인 STARTUP 시
소모되는 오버헤드는 포함이 된다. 이 부분이 SHARED_POOL_SIZE에 포함이 된다.
Oracle 10g 이전 버젼에서는 이 부분이 SHARED_POOL_SIZE에 포함되지 않았으나
10g부터는 포함되게 되어 SHARED_POOL_SIZE를 좀 더 크게 잡아야 한다.
구체적으로 10g에서는 SHARED_POOL_SIZE를 32m 정도 더 크게 잡아야 한다.
예를 들어, Oracle 9i에서 SHARED_POOL_SIZE를 256M를 사용했었다면,
Oracle 10g에서는 같은 효과를 얻으려면 288M 정도로 잡아야 한다.

4) SGA_TARGET 파라미터가 0이 아닌 값으로 셋팅이 되어 있는 경우
자동으로 튜닝되는 SGA 파라미터들은 모두 기본적으로 0으로 셋팅이 된다.
이러한 파라미터들은 자동 공유 메모리 관리 알고리즘에 의하여 자동으로
사이즈가 결정이 된다.
그러나, 만약 이러한 자동 튜닝 파라미터들이 0이 아닌 어떤 값으로
셋팅이 되어 있다면 명시한 값은 자동 튜닝 알고리즘에 의해 최저값을
나타낸다.
예를 들어, SGA_TARGET 파라미터가 8G로 셋팅되어 있고, SHARED_POOL_SIZE가
1G로 셋팅되어 있다면 SHARED_POOL_SIZE는 절대 1G 아래로 떨어지지
않음을 뜻한다.

V$SGA_Dynamic_components 뷰를 조회하면 자동 튜닝 component들의
실제 사이즈를 확인할 수 있다.

SELECT component, current_size/1024/1024
FROM v$sga_dynamic_components;

4. 수동으로 튜닝되는 SGA 파라미터 설정

SGA의 몇몇 구성 파라미터들은 자동으로 튜닝되지 않아서 매뉴얼하게 튜닝을 해야 한다.
다음은 수동으로 튜닝되는 SGA 파라미터들이다.

- KEEP 및 RECYCLE 버퍼 캐시
- 멀티 블록 사이즈 캐시(DB_nK_cache_size)
- 로그 버퍼
- 스트림즈 POOL

수동으로 튜닝되는 파라미터들은 반드시 사용자에 의해 명시되어져야 한다.
이런 파라미터들은 10g 이전 버젼에서와 같이 정밀하게 크기가 제어되어야 한다.
매뉴얼하게 튜닝되는 이러한 파라미터들은 SGA_TARGET에는 포함되지만,
자동으로 튜닝되지는 않는다.
예를 들어, SGA_TARGET 이 8G이면 MANUAL하게 수동으로 조절되는 파라미터들의
사이즈의 합을 1G로 잡으면 7G는 자동으로 오라클이 알아서 설정한다.


5. SGA_TARGET 파라미터의 설정 변경

SGA_TARGET 파라미터의 RESIZING이란 SGA_TARGET 파라미터의
설정 변경을 의미한다.
SGA_TARGET 초기화 파라미터의 특징은 다음과 같다.

첫째, 운영 중에 동적으로 변경이 가능하다.
둘째, SGA_MAX_SIZE 내에서 크기를 증가시킬 수 있다.
세째, 모든 구성 요소의 최저값의 합까지 크기를 감소시키는 것이 가능하다.
또한, SGA_TARGET 파라미터의 설정은 오직 자동으로 튜닝할 수 있는
파라미터들에만 영향을 준다.

예를 들어, SGA_MAX_SIZE가 10G이고, SGA_TARGET이 8G로 가정을 한다.
만약, DB_KEEP_CACHE_SIZE가 1G로 셋팅이 된다고 하면 SGA_TARGET 을
최대 9G까지 늘릴 수 있다.
추가적인 1G는 SGA_TARGET에 의해 조절되는 자동 튜닝 파라미터들에게 분배가 된다.
DB_KEEP_CACHE_SIZE 는 영향을 받지 않는다는 뜻이다.
이것은 SGA_TARGET 파라미터를 줄일 때에도 해당된다.

6. 자동 공유 메모리 관리 비활성화

이 기능을 비활성화하려면 SGA_TARGET 파라미터를 0으로 설정하면 된다.
이렇게 SGA_TARGET 파라미터를 0으로 설정하게 되면 자동 튜닝 파라미터들은
그 당시의 값으로 설정된다.
그리고, 전체 SGA 크기에는 영향을 미치지 않는다.

예) 변경 전 값
SGA_TARGET=8G
SHARED_POOL_SIZE=1G

변경 후 값
SGA_TARGET=0
SHARED_POOL_SIZE=2G
DB_CACHE_SIZE=4G
LARGE_POOL_SIZE=512M
JAVA_POOL_SIZE=512M


SGA_TARGET이 8G로 셋팅되어 있고, SHARED_POOL_SIZE 파라미터가 1G로
설정되어 있다가 SGA_TARGET을 0으로 변경하면 자동 튜닝 파라미터들은
그 당시의 값으로 셋팅되고 전체 SGA 크기는 이전 SGA 크기를 초과하지 않는다.
SHARED_POOL_SIZE가 2G로 셋팅이 된 것은 내부적으로 측정하여 결정된 수치이다.

7. 동적 SGA 파라미터의 수동 변경

자동 튜닝되는 파라미터를 수동으로 변경할 경우 다음과 같은 영향을 가진다.

1) 만약 파라미터의 새로이 반영되는 값이 현재의 값보다 클 경우에는 즉시 반영이 된다.
그러나, 새로이 반영되는 값이 현재의 값보다 작을 경우에는 현재의 값에는
즉시 변화가 없고 최저값으로 셋팅이 된다.

2) 자동으로 튜닝되는 파라미터들을 수동으로 변경하였을 경우에는
SGA의 자동 튜닝 부분에 영향을 준다.
RESIZE 수행 시에 사용되는 메모리는 자동 튜닝 파라미터들로부터
더해지거나 감해질 뿐 매뉴얼하게 조절되는 파라미터들에는 영향을 주지 않는다.

Example


다음은 자동 튜닝 파라미터 설정 시 V$PARAMETER 조회 결과 예이다.

SGA_TARGET=8G
DB_CACHE_SIZE=0
JAVA_POOL_SIZE=0
LARGE_POOL_SIZE=0
SHARED_POOL_SIZE=0

SELECT name, value, isdefault
FROM V$PARAMETER
WHERE name LIKE '%size%';

만약 SGA_TARGET 파라미터가 0이 아닌 값으로 셋팅이 되어 있는 경우
자동 튜닝되는 파라미터들은 값을 명시하지 말라는 뜻이다.
V$PARAMETER 뷰를 조회하였을 때 자동으로 튜닝되는 이러한 SGA 파라미터들의
값은 모두 0이다.
이것이 정상이고, isdefault 컬럼 값은 TRUE 이다.

즉, 자동 공유 메모리 관리 기능을 구현할 때에는 이 파라미터들은
매뉴얼하게 설정을 하지 않으면 된다.

Reference Documents


Oracle Database 10g New Features
반응형
Posted by [PineTree]
ORACLE/ADMIN2011. 7. 4. 09:38
반응형

=== ODM Action Plan ===
안녕하세요.
일반 PERMANENT TABLESPACE 에 과거에 생성된 TEMPORARY SEGMENT가 정리되어야 하는데 정리되지 못한 상태로 남아 있는것으로 보여집니다.
운영 및 재배치에는 문제가 없습니다만, 재배치 이전에 정리를 하고 싶으시면 아래 문서를 참고 하셔서 해당 Tablespace에 있는 TEMP SEGMENT를 삭제 하실 수 있습니다.
EVENT: DROP_SEGMENTS - Forcing cleanup of TEMPORARY segments (Doc ID 47400.1)
-----------------------------------------------------------------------------------------------------------
위 문서를 요약하면 아래와 같습니다.
select ts# from v$tablespace where name = '<Tablespace name>';
If ts# is 5, an example of dropping the temporary segments in that tablespace would be:
alter session set events 'immediate trace name DROP_SEGMENTS level 6';

노트를 한번 읽어보신 후에 위 command로 정리 작업을 해주시기 바랍니다.
====================================================================================
EVENT: DROP_SEGMENTS - Forcing cleanup of TEMPORARY segments [ID 47400.1]
--------------------------------------------------------------------------------
 
  수정 날짜 22-OCT-2010     유형 REFERENCE     상태 PUBLISHED  
 
The DROP_SEGMENTS event
~~~~~~~~~~~~~~~~~~~~~~~
 Available from 8.0 onwards.
 
   DESCRIPTION
     Finds all the temporary segments in a tablespace which are not
     currently locked and drops them.
     For the purpose of this event a "temp" segment is defined as a
     segment (seg$ entry) with TYPE#=3. Sort space in a TEMPORARY
     tablespace does not qualify under this definition as such
     space is managed independently of SEG$ entries.

   PARAMETERS
     level - tablespace number+1. If the value is 2147483647 then
             temp segments in ALL tablespaces are dropped, otherwise, only
             segments in a tablespace whose number is equal to the LEVEL
             specification are dropped.

   NOTES
     This routine does what SMON does in the background, i.e. drops
     temporary segments. It is provided as a manual intervention tool which
     the user may invoke if SMON misses the post and does not get to
     clean the temp segments for another 2 hours. We do not know whether
     missed post is a real possibility or more theoretical situation, so
     we provide this event as an insurance against SMON misbehaviour.

     Under normal operation there is no need to use this event.

     It may be a good idea to
        alter tablespace <tablespace> coalesce;
     after dropping lots of extents to tidy things up.

 *SQL Session (if you can connect to the database):     
    alter session set events 'immediate trace name DROP_SEGMENTS level TS#+1';

     The TS# can be obtained from v$tablespace view:
     select ts# from v$tablespace where name = '<Tablespace name>';

     Or from SYS.TS$:

     select ts# from sys.ts$ where name = '<Tablespace name>' and online$ != 3;
    
     If ts# is 5, an example of dropping the temporary segments in that tablespace
     would be:

    alter session set events 'immediate trace name DROP_SEGMENTS level 6';

반응형
Posted by [PineTree]
ORACLE/ADMIN2011. 5. 2. 22:35
반응형

SQL*NET DCD(DEAD CONNECTION DETECTION)과 KEEPALIVE의 관계
========================================================


PURPOSE 
---------

Client PC의 process가 사라지고 난 후 server에서 접속이 close가 안 되었을 경우
문제가 발생할 수 있다. 전형적인 예로는 Oracle에 접속되어 있는 상황에서 
사용자가 기계를 reboot 하거나 전원을 끊거나 할 경우 client process는 정확히
종료되었을 지 모르나 서버상의 background process는 client가 아직까지 접속
되어 있는것으로 생각하고 처리를 계속 수행하고 있으므로 이 결과로 인하여 서버
상에서는 많은 자원을 낭비할 수 있다.

이는 Oracle의 문제가 아니며 TCP/IP의 제한에 따른 것이다.

Dead Conection을 발견하여 보다 빠르게 close시키고 server상에서 사용하고 
있는resource를 보다 빠르게 free시키기 위해서는 keepalive를 정확하게 설정
하여야 한다.

Problem Description 
-------------------

** KEEPALIVE **

TCP/IP접속을 하고 있는 양측에서 접속을 하고 있는 동안 정해진 시간내에 
다른 반대편으로 부터 아무런 데이터를 받지 못했음을 감지하는 경우 
그것으로 인하여 transparent layer에서 "dummy(test)" packet을 application 
layer로 보내고 응답(acknowledgement)가 올 때가지 다른 한쪽에서는 기다리게
된다.
만일 접속된 process에서 응답(acknowledgement)를 기다리는 중에 timeout이 되는
경우 TCP/IP에서는 접속을 포기하기전에 보내진 "dummy(test)" packet에 대한 
응답(acknowledgement)를 기다리는 일련의 일들을 몇번이고 재시도 할 수 있도록
 구현되어 있다.

즉 keepalive가 설정되어 있을 경우에는 client process들이 실제로 connection을
유지하고 있는 지 확인하기 위해 모든 비활성 TCP/IP 접속을 주기적으로 조사
(Polling)한다. 접속이 되어 있는 process들은 정해진 비활성 주기 이후에 서버의
TCP/IP s/w에 의해 "dummy(test)"을 보내기 시작하며 반대편으로 부터 반드시 
응답(acknowledgement)을 받아야 한다. 만일 보낸 시도 packet들이  client에서 
무시되어 버린다면  서버는 접속이 최악의 상태인것으로 간주하고 접속을 
close한다. 그런 다음 ORACLE에서는 connection과 관련된 shadow process를 안전
하게 제거한다.

SQL*NET의 TCP/IP level에서는 listener가 startup될때 setsockopt()라는 함수를
호출함으로서 listener에서는 keepalive가 구현되어 있다.


* Dead mans Handle *

 일반적으로 네트워크를  이용하여 양쪽에 도달하기까지에 대한 algorithm의
 이름이며 keepalive와 매우 동일하고 이는 TCP/IP에서 사용하는 전문용어는 
 아니다. 
 SQL*NET에서 사용하는 용어로서 SQL*NET v2.1이상에 포함되어 있는 dead man's
 handle에 근간을 둔 algorithm으로 모든 platforms들과 protocol들에서 일반적
 으로 사용하고 있으며 이를 DCD(DEAD CONNECTION DECTION)라고도 부른다.
 SQL*NET V2.1.3 이상 (RDBMS V7.1.3이상)에서 사용할 수 있다.

* Timeout *

 Timeout은 orasrv의 기능으로 client가 connection handhake (client가 요청한 
 break-mode, buffersize, SID에 관한 정보를 어디로 전달할 것이지를 찾는 
 일련의 작업)를 하는 동안 응답이 올때까지 계속 기다리는 것을 방지하기 
 위해  orasrv에 추가된 기능이다.
 이 기능은 SQL*NET V1.2.7.2.3이상에서 가능하며 다음의 명령어를 수행하여 
 사용할 수 있다. (Default = 0)

 $ tcpctl timeout 5


만일 사용자가 application에서 정상적으로 종료하지 않고 전원을 끄는 경우
process들은 "Clean-up"되지 않고 이러한 shadow process들은 고아(oraphaned)
process가 될것이다. 
만일 수많은 사용자들이 이렇게 비정상 종료를 할 경우 서버에서는 이러한 defunct 
process들로 인하여 과부하가 걸리게 될 것이며 이때 이들 process들은 parent 
process id (PPID)를 1로 갖는 daemon 또는 init 소유의 process들이다.

이러한 상황을 해결하기 위해, 사용자는 TCP/IP level에서 KEEPALIVE option을 
설정할 수 있으며 이 parameter는
/usr/include/netinet디렉토리내의 tcp_timer.h
참조 할 수 있다.

일반적으로 Keepalive는 다음에서 보는 parameters에 의해 제어 할 수 있으며 
물론 system마다 parameters이름은 약간의 차이가 있을 수 있다.
                              
        tcp_keepidle       :  time before keepalive probes begin 
        tcp_keepintvl      :  time between keepalive probes 
        tcp_maxidle        :  time to drop (after probes)
        tcp_ttl            :  time to live for TCP segs 
        PR_SLOWHZ          :  usually 2 times per second


KEEPALIVE의 기존 interval은 다음과 같이 정의 되어 있다.

#define TCPTV_KEEP_IDLE (120*60*PR_SLOWHZ)  /* dflt time before probing */

여기서 PR_SLOWHZ을 1초로 정의되어 있다고 가정하면 (120*60*PR_SLOWHZ)은 
2시간을 나타내는 것이다. KEEPALIVE가 시작되면 "dummy" packet을 connection
들에 보내어 만일 connection이 active상태라면 KEEPALIVE가 작동하지 않을 
것이고 만일 더 이상 active상태가 아니라면 KEEPALIVE에 의해 connection이 
close될것 이다. 그런 다음Dedicated server process(shadow process)는 kill 
signal을 받는 것과 동시에 종료될 것이다.

주의 : KEEPALIVE의 특징을 모든 TCP/IP Verdor에서 제공하는 것은 아니며,
        이는 TCP/IP level에서 설정하는 것으로 Oracle의 기능은 아니다.
       이 기능은 vendor마다 다를 수 있으므로 만일 값을 설정하려면 TCP/IP 
        vendor로 문의하기 바란다. 
       이 기능은 문제를 피해갈 수 있는 하나의 방법일뿐 문제해결을 위한
       해결책이 아니므로 이로 인해 생기는 문제에 대해 는 보장하지 않는다.

SQL*NET V2.1이상의 서버와 SQL*NET V2.0.14이상의 client에서 제공하는 DCD
(Dead Connection Detection) 기능
은 TCP/IP의 KEEPALIVE 특징처럼 동일한 
기능을 수행한다.

DCD는 서버의 $ORACLE_HOME/network/admin/sqlnet.ora파일내에 있는 parameter인 
sqlnet.expire_time에 정의할 수 있으며 단위는 분이며 1 ~ 무한대까지 가능하다.

만일 sqlnet.ora에 정의되어 있지 않았다면 DCD의 기능은 사용되지 않는 다 
이 parameter는 client와 server사이에서 connection을 통하여 연속되는 시도
packet들을 전달하는 시간 주기를 결졍한다.


Workaround 
-----------

지금까지 설명한 keepalive에 대한 기능을 각 H/W에서는 어떻게 
설정하는 지 알아 보도록 한다. (일반적으로 만이 사용하는 H/W를 기준)
그리고 다음의 OS parameter를 수정시에는 반드시 OS engineer와 상의는 
하는 것이 바람직 하겠다.


< Windows NT >

 1. Regedt32를 수행한다.

 2. HKEY_LOCAL_MACHINE -> SYSTEM -> CurrentControlSet -> Services -> 
    
       Tcpip -> Parameters으로 간다.

 3. 편집메뉴 -> 값추가를 선택하면 값추가 윈도우가 나타난다.

 4. 값이름을 KeepAliveTime으로 넣고 데이타 형식을 REG_DWORD로 선택한후 
    확인버튼을 누르게 되면 DWORD편집기 윈도우가 나타나며 여기서 기수
    (이진, 십진, 16진)를 선택하는 데 십진을 선택하고 난후 데이타 값을
    180000 (3분) 설정한 후 확인 버튼을 누른다. 


< Netware >

   Netware에서는 DCD기능이 적용 안됨


< SunOS, Sun Solaris >

 # ndd /dev/tcp \?                      ----->  parameter 확인하는 방법 
 # ndd /dev/tcp tcp_keepalive_interval  ----->  설정된 값 확인 
 7200000     (기본값 :  7200000 ms)
 # ndd /dev/tcp
 tcp_keepalive_interval 10000
 # ndd /dev/tcp tcp_keepalive_interval 
 10000


< Digital Unix >

 # dbx -k /vmunix

 (dbx) p tcp_maxidle
 1200
 (dbx) p tcp_keepidle                ------> print value
 14400         ------> 설정된 값 확인 
 (dbx) assign tcp_keepidle = 1200    ------> new value assign 
 1200
 (dbx) assign tcp_maxidle = 600      ------> new value assign 
 600
 (dbx) quit

 두 parameter의 단위는 0.5초 입니다. tcp_keepidle의 기본값은 2시간이며 
 tcp_maxidle의 기본값은 20분입니다.
 tcp_keepidle은 keepalive code가 적용되기 전까지의 시간이며, tcp_maxidle은 
 connection이 drop될때까지 keepalive가 적용되는 시간과의  사이를 정해놓은
 시간입니다.
 즉 예를 들자면 tcp_keepidle을 10분으로, tcp_maxidle을 5분으로 설정하여 
 놓았다면 defaunct connection들은 15분후애 종료됩니다.

< IBM AIX >

 # no -a       ------->  설정된 값 확인
   .....         (units of half seconds)
   tcp_keepidle  = 14400       (2  hours)
   tcp_keepintvl = 150         (75 seconds)
   .....
 # no -o tcp_keepidle=1200
 # no -o tcp_keepintvl=40


  tcp_keepidle는 keepalive 메세지를 보내기 전에 활동하고 있지 않은 시간을 
  결정하는 parameter이고 tcp_keepintvl은 keepalive시도 메세지를 얼마나 자주 
  보내는지를 결정하는 parameter이다. 
  접속은 8회의 비응답 시도후에 broken이 고려된다.

  이러한 parameter의 값을 설정하는 것은 어려운 부분으로 불필요한 traffic을 
  감소시키기 위해 적은 값으로 설정하는 게 일반적이다. 실제로 이러한 
  parameter들은 시스템에 상당히 의존적이다. 
  아무튼 IBM AIX에서 oracle을 사용하는 경우 1200(10분)과 400(20초)으로 설정
  하여 사용하기를 추천한다.

  이 parameter의 값을 영구보존하기 위해서는 /etc/rc.tcpip에 두개의 명령어를 
  추가한다.


 < HP-UX  HP9000 Ver 10.01  I70 series >

  조정 할 수 있는 parameter를 확인한다.
 
  # nettune -h

  조정 할 수 있는 TCP parameter의 이름들을 확인한다.

  #  nettune -h tcp | grep


     tcp_localsubnets:
     tcp_receive:
     tcp_send:
     tcp_defaultttl:
     tcp_keepstart:
     tcp_keepfreq:
     tcp_keepstop:
     tcp_maxretrans:
     tcp_urgent_data_ptr:
     tcp_pmtu:
     tcp_random_seq:

  TCP에서 keepalives의 전송을 시작하기 전에 idle time을 변경하기위해 
  tcp_keepstart를 설정한다 
  그리고 keepalives사이의 시간을 변경하기 위해 tcp_keepfreq를 설정한다.


  # nettune tcp_keepfreq    --> This shows the current value: 75.

  # nettune -l tcp_keepfreq --> This shows the range of values.

    tcp_keepfreq = 75 default = 75 min = 5 max = 2000 units = seconds
    
  # nettune -s tcp_keepfreq 1000  -->    set it to 1000

  # nettune tcp_keepfreq          -->    verify it as 1000


  keepalive를 수정하기 위하여

   # adb -w /ph-ux /dev/kmem

    0d10$d              (Change to base 10)
    tcp_keepidle?D      (Display value of keepidle - 14400 = 2 hours)
    tcp_keepidle?W 1200 (This command updates the HP-UX kernel on disk)
    tcp_keepidle/W 1200 (This command updates the HP-UX kernel in
                         memory)
    tcp_keepidle?D      (This will display the value used for the next
                         boot)
    tcp_keepidle/D      (This will display the value used for future
                         connections)
    ^d                  (CRTL-D to exit adb)

    Again, this will modify the HP-UX kernel on disk and in memory.

    사용자의 시스템을 위해 PHNE_8420=Nettune Cumulative Patch 와
    PHNE_11758=FDDI cumulative patch를 찾아보기 바란다.


 < HP-UX  HP9000 Ver 10.10  K210 series >

  TCP에서 keepalives의 전송을 시작하기 전에 idle time을 변경하기위해 
  tcp_keepstart를 설정한다 
  그리고 keepalives사이의 시간을 변경하기 위해 tcp_keepfreq를 설정한다.


  # nettune tcp_keepfreq              # what's the current value?
    75

  # nettune -l tcp_keepfreq           # what are the range of values?
    tcp_keepfreq = 75 default = 75 min = 5 max = 2000 units = seconds

  # nettune -s tcp_keepfreq 1000      # set it to 1000

  # nettune tcp_keepfreq              # verify it
    1000

  변경할 수 있는 모든 값들은 help를 이용하여 얻을 수 있다.

  # nettune -h                # what can I tune?
  # nettune -h tcp            # what TCP variables can I tune?
  # nettune -h tcp | grep :   # what are the TCP tunables named?

  # adb -w /ph-ux /dev/kmem
    0d10$d              (Change to base 10)
    tcp_keepidle?D      (Display value of keepidle - 14400 = 2 hours)
    tcp_keepidle?W 1200 (This command updates the HP-UX kernel on disk)
    tcp_keepidle/W 1200 (This command updates the HP-UX kernel in
                         memory)
    tcp_keepidle?D      (This will display the value used for the next
                         boot)
    tcp_keepidle/D      (This will display the value used for future
                        connections)
    ^d                  (CRTL-D to exit adb)


이외의 H/W에 대해서는 OS verdor로 문의하여 알아 보시기 바랍니다.

반응형
Posted by [PineTree]
ORACLE/ADMIN2011. 5. 2. 22:32
반응형
KeepAlive 란 Idle TCP/IP Connection 의 Time out 기능을 말한다.

TCP/IP 기반으로 remote 로 연결된 상태에서 클라이언트의 갑작스런 리부팅이나
스위치 Off 의 경우 해당 연결을 서버에서 Closing 하지 못하게 된다.
이것은 TCP/IP의 제한인 것이지 오라클의 문제가 아니다.
이 때 KeepAlive가 정확하게 configure되어 있다면 좀 더 빨리 Dead connection
을 발견하고 빨리 Closing할 것이다.
TCP/IP 에 관련된 것이므로 KeepAlive를 각 플랫폼 별로 지정하는 방법이 모두
틀리다.

예를들면 유저가 PC 에서 Unix Oracle Server로 연결 후 실수로 다음 쿼리 문을
실행했다.

SQL> select * from bigtable, hugetable, massivetable;

적게는 수십분, 많게는 몇시간이 걸릴 작업이라면 유저는 쿼리를 인터럽트하기
보다 reset 버튼을 누르게 될 것이다. 이때 클라이언트 프로세스는 없어졌지만
백그라운드 서버 프로세스는 계속 running 중일것이다.
이런 현상은 수시로 일어날 수 있다. 또한 당연한 것이다.
유저가 사용을 잘못하는 것이기 때문이다.

하지만 SQL*NET 2.1 이상에서 Dead-Connection-Detection 이라 불리는 기능을
지원한다. 이것은 곧 KeepAlive 를 지정할 수 있는 기능이다.
반드시 서버 사이드의 $ORACLE_HOME/network/admin/sqlnet.ora 파일에 다음의
파라미터를 지정해야 한다. 클라이언트에는 지정해봐야 전혀 소용이 없다.

sqlnet.expire_time = 1 (단위는 분)

Netware를 제외한 모든 Platform, Protocol에서 지원이 된다.

# Windows NT 에서 KeepAlive 를 지정하는 방법.
(타 플랫폼은 제외)

Regedt32 를 실행한다.

레지스트리에서

HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters

까지 이동한다.
여기서 키 추가가 아닌 값 추가를 한다.

파라미터는 KeepAliveTime (REG_DWORD) 로 입력한다.

값은 Decimal -> 180000 (for example = 3 minutes)

으로 지정한다.
반응형
Posted by [PineTree]
ORACLE/ADMIN2011. 5. 2. 21:42
반응형

1.서버/클라이언트 로그기록

2.테스트 프로그램 로그기록(truss)

3.DB login/logout 로그기록(audit)

-client 요청에 의한 logout 인지 pmon에 의한 logout 인지 확인가능

4.event trace

 

1.trace 및 로그기록

 

Client | sqlnet.ora
----------------------------------

TRACE_LEVEL_CLIENT=ADMIN
TRACE_FILE_CLIENT=client.trc
TRACE_DIRECTORY_CLIENT=/user1/ora9i/dbConn
TRACE_UNIQUE_CLIENT=on

 

Server | sqlnet.ora
----------------------------------

TRACE_LEVEL_SERVER=ADMIN
TRACE_FILE_SERVER=server.trc
TRACE_DIRECTORY_SERVER =/data1/oracle/app/oracle/product/817/network/log/200710
LOG_FILE_SERVER=server.log
LOG_DIRECTORY_SERVER = /data1/oracle/app/oracle/product/817/network/log 

 

# listener.ora
----------------------------------

TRACE_LEVEL_mercury=support
TRACE_DIRECTORY_mercury=/data1/oracle/app/oracle/product/817/network/log/200710
TRACE_FILE_mercury=dbSrv
TRACE_TIMESTAMP_mercury=ON
TRACE_FILENO_mercury=3
TRACE_FILELEN_mercury=1024768

 

2.Client

$>truss -aeof <output> <execute>

 

3.audit

sql>audit create session username by access;

 

4.event trace(서버 alert.log에는 아무것도 안남습니다만 혹시나해서~)
alter system set event="3113 trace name errorstack level 3"
alter system set max_dump_file_size=unlimited;
alter system set events '3113 trace name errorstack level 3';

->'3113 trace name errorstack level 3'; => '03113 trace name ...  이렇게 해야되는가요? '0' 없어도 되죠?

반응형
Posted by [PineTree]
ORACLE/ADMIN2011. 5. 2. 21:38
반응형
TECH: SQL*Net V2 on Unix - A Quick Guide to Setting Up Client Side Tracing [ID 16564.1]


Modified 20-OCT-2005 Type REFERENCE Status PUBLISHED

( For a more detailed discussion of SQL*Net V2 tracing see Note:16658.1 )

Client Tracing
~~~~~~~~~~~~~~
1) Set the environment variable TNS_ADMIN to the directory where the 
   tnsnames.ora and listener.ora files exist.

   The default location is $ORACLE_HOME/network/admin. Set $TNS_ADMIN to this
   if it is not set. This ENSURES you know which files you are using.

2) Start the listener:          lsnrctl
                                > set password <password>
                                > start

   Note any errors. If you do not have a password set then ignore the 
   set password command.

3) If the listener started, start the database.

4) Create a file in $HOME called .sqlnet.ora and add the lines:

        trace_level_client= 16
        trace_file_client=client
        trace_directory_client= /tmp            (or similar)
        trace_unique_client=true

5) Try to connect from SQL*Plus thus:

        sqlplus username/password@alias

   or
        sqlplus username/password

   substituting a suitable alias.

6) If you get an error we may need to see the client trace file
   /tmp/client_<PID>.trc where <PID> is the process ID of the 
   client process (*1).
   This will be quite large so it is best to FAX or EMAIL it.

*1 Note: On earlier versions of SQL*Net the filename may NOT have
         the process ID appended to it.


Listener Tracing:
~~~~~~~~~~~~~~~~~

1) Edit your $TNS_ADMIN/listener.ora file and add the lines:

        TRACE_LEVEL_LISTENER     = 16    
        TRACE_DIRECTORY_LISTENER = /tmp
        TRACE_FILE_LISTENER      = "listener"   

2) Stop and restart the listener:

        lsnrctl stop
        lsnrctl start

   Output should go to /tmp/listener.trc


반응형
Posted by [PineTree]
ORACLE/ADMIN2011. 5. 2. 21:36
반응형

In this Document
  Goal
  Solution
     Launch the Net Manager utility
     Enabling Oracle Net Client / Server tracing (or both).
      Enabling Oracle SQLNet Listener tracing.
     Cyclic Tracing
     Tracing Kerberos
     Tracing Externel Procedures (Extproc)
     Tnsping Trace
     Enabling Dynamic Listener Tracing
     Only for 11g
  References


Applies to:

Oracle Net Services - Version: 9.2.0.1.0 to 10.2.0.2.0
Information in this document applies to any platform.

Goal

This document covers how to use Oracle Net Manager tool to enable Oracle SQLNet Client, Server, Listener, Kerberos and External Procedure tracing.  It also includes how to control the size and amount of trace files produced and steps to start dynamic listener tracing.

Solution

Launch the Net Manager utility

 

Windows : Go to Start button, select the Oracle Home on which we are going to generate the tracing for. Net Manager is located under 'Configuration and Migration Tools' of the Oracle Home menu.

Unix : The tool can also be started remotely from a Microsoft Windows system with the help a terminal emulation software. You need to ensure this software is up and running first.  Ensure that the $DISPLAY, $ORACLE_HOME, and $PATH environment variables are properly set. The Net Manager tool is started by the command "netmgr".

[oracle@testnet ~]$ export DISPLAY=152.69.172.167:0.0
[oracle@testnet ~]$ . ora10gr2.env
The environment settings are performed for 10gr2 home
[oracle@testnet bin]$ pwd
/u01/ora10gr2/bin
[oracle@testnet ~]$ netmgr

 

After launching the Net Manager, the location of the network configuration files shown in the top of the Net Manager window.  Ensure this is the expected location. If it is not, you have TNS_ADMIN environment variable set, which is pointing the session towards a different location.

 

Enabling Oracle Net Client / Server tracing (or both).

 

A. Click on Profiles in the left panel. The right panel of Net Manager will now show more details.

B. Select General from drop down menu on the right panel of the Net Manager.

C. Select Tracing tab in the right panel. Client Information and Server Information is now seen.

D. Select the required Trace Level. Oracle Support usually requests level SUPPORT (also known as level 16). It is optional to provide a value for the Trace Directory and Trace File. If you do,  ensure that the directory exists and that the owner of the Oracle software is able to write to that directory. The default location for the trace files is the $ORACLE_HOME/network/trace directory. Default name is CLI.TRC

The Unique Trace File Name option for the Client Information section, will make unique trace files for every connection. Without this option selected, all client tracing goes into the one file.  If running Microsoft Windows, always set this parameter or there is the potential that the trace file with the error will be overwritten.  The Server does not have this parameter available.

E. If tracing is to be done on the Server and the connection model is Shared Server, then the Instance will have to be restarted for the Dispatchers to pick up the changes to the SQLNET.ORA file.

The SQLNET.ORA will now look like the following :

TRACE_LEVEL_CLIENT = SUPPORT
TRACE_UNIQUE_CLIENT = on
TRACE_LEVEL_SERVER = SUPPORT
TRACE_DIRECTORY_CLIENT = C:\TEMP
TRACE_FILE_CLIENT = CLIENT
TRACE_DIRECTORY_SERVER = C:\TEMP
TRACE_FILE_SERVER = SERVER
TRACE_TIMESTAMP_ CLIENT = ON
Note:If tracing is to be done on the Server and the connection model is Shared Server(MTS), then the Instance will have to be restarted for the Dispatchers to pick up the changes to the SQLNET.ORA file.

 Enabling Oracle SQLNet Listener tracing.

A. In the left panel of the Net Manager, select Listeners view.

B. Select the Listener you want to trace. Once selected the right hand panel will show more details.

C. Select General Parameters from the drop down button, in the right hand panel.

D. Select Logging & Tracing tab.

E. Click the Tracing Enabled radio button and select Trace Level. SUPPORT level is normally requested by Oracle Support.

Select a directory for the trace to be generated.

G. Listener will need to be restarted or reloaded to enable or disable tracing.
 

Note: Stopping a Listener does not effect existing connections.

 

The LISTENER.ORA will now have the following lines.

TRACE_FILE_LISTENER = LISTENER.TRC
TRACE_DIRECTORY_LISTENER = C:\TEMP
TRACE_LEVEL_LISTENER = SUPPORT

Cyclic Tracing

Adding parameters TRACE_FILENO_ and TRACE_FILELEN_ to the SQLNET.ORA or LISTENER.ORA files enables Oracle Net trace files to be limited a certain size and a certain number of files. Following example is for Listener traces of 10 MB, with a maximum of 10 files for a maximum of 100 Mb of trace files. Cyclic tracing can be configured for the Client, Server and Listener

TRACE_FILELEN_LISTENER=10240
TRACE_FILENO_LISTENER=10

TRACE_FILENO_{CLIENT/SERVER/listener_name}: When this parameter is set it will determine the maximum number of trace files that will be generated. Trace data will continue to generate but in a cyclic fashion. The maximum size of each file is set by configuring the appropriate TRACE_FILELEN parameter.

TRACE_FILELEN_{CLIENT/SERVER/listener_name}: When set determines the maximum size of each trace file before either starting a new trace file (if the TRACE_FILENO parameter is set) or will overwrites an existing file (cyclic tracing). Once the last trace file has been written, up to the size specified by TRACE_FILELEN_<CLIENT/SERVER/listener_name>, tracing will continue by overwriting the first trace file in the cycle.

Tracing Kerberos

Kerberos can be traced using the following parameters in the SQLNET.ORA file.
See Note 185897.1 Kerberos Troubleshooting Guide for more details.

TRACE_LEVEL_OKINIT=SUPPORT
TRACE_DIRECTORY_OKINIT=<VALID_DIRECTORY>
TRACE_FILE_OKINIT=<VALID_FILE_NAME>

 

Tracing Externel Procedures (Extproc)

External procedure can be traced using the following parameter in the SQLNET.ORA file, where extproc is setup.

TRACE_LEVEL_AGENT= SUPPORT
TRACE_DIRECTORY_AGENT = <VALID_DIRECTORY_PATH>
TRACE_TIMESTAMP_AGENT =ON

 

Tnsping Trace

TNSPING.TRACE_LEVEL = SUPPORT
TNSPING.TRACE_DIRECTORY = <path where tnsping.trc will go>

 

Enabling Dynamic Listener Tracing

There might be situations when you cannot reload or restart the listener to enable the traces.Such times, you can fmake use of the dynamic tracing for the listener .

LSNRCTL> set current_listener listener
Current Listener is listener
LSNRCTL> set trc_level 16
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
LISTENER parameter "trc_level" set to support
The command completed successfully
LSNRCTL> set trc_directory /home/oracle
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
LISTENER parameter "trc_directory" set to /home/oracle
The command completed successfully
LSNRCTL> exit

This would create sqlnet support level tracing on the listener under directory /home/oracle with name listener.trc

Only for 11g

11g has new method of tracing Automatic Diagnostic Repository(ADR)  which will create the trace to the ADR directories
Reference
Note 454927.1Using and Disabling the Automatic Diagnostic Repository (ADR) with Oracle Net for 11g

To create the trace files to the desired directory,
For client tracing & server tracing add:
DIAG_ADR_ENABLED= OFF


For listener tracing:
DIAG_ADR_ENABLED_<listener name> = OFF


Unable to start Net Manager

If Net Manager is unable to start, check that you are able to launch other GUI tools from the same server, where Net Manager is failing. For example the X-Window utility "xclock". If you are not able to launch xclock, you need to address this problem, before attempting to start Oracle GUI tools. If xclock works, check other Oracle GUI tools, like DBCA before reporting the issue to Oracle Support.

References

NOTE:374116.1 - How to Match Oracle Net Client and Server Trace Files
NOTE:454927.1 - Using and Disabling the Automatic Diagnostic Repository (ADR) with Oracle Net for 11g


반응형
Posted by [PineTree]