반응형

Security Group (보안 그룹) 설정을 내 IP로 하면

당연히 EC2 인스턴트에 무리없이 연결 될 줄 알았는데...

 

웹 상에서 인스턴스에 연결은 안되었다....

 

친절한 오류메시지 내역

We were unable to connect to your instance. Make sure that your instance’s network settings are configured correctly for EC2 Instance Connect. For more information, see Task 1: Configure network access to an instance.

 

당연하게도

 

Security Group에서 22(SSH)를 0.0.0.0/0 으로 설정하면 된다...

 

하지만 이것은 치명적인 보안 문제가 있기 때문에 권장하지 않습니다.

 

해결방법

 

1. 우선 보안 그룹(Security Group)에서 22포트에 대해 0.0.0.0/0으로 설정 뒤 웹으로 연결 한다.

2. 다음 명령어를 사용하여 내가 접속하는 웹의 접근 IP 대역을 체크한다. (서울 리전 기준!)
  curl -s https://ip-ranges.amazonaws.com/ip-ranges.json| jq -r '.prefixes[] | select(.region=="ap-northeast-2") | select(.service=="EC2_INSTANCE_CONNECT") | .ip_prefix'

13.209.1.56/29

 

  ※ Amazone Linux 2 AMI 설치 내역임 

  ※ 설치된 명령어(curl, jd )

      * 없을 경우 #> yum install jd 와 같은 명령어로 설치함.

 

3. 위의 설정 값을 기준으로 다시 보안 그룹 (Security Group)을 재 설정한다.

   * xxx.xxx.xxx.130 은 내 IP로 설정한 고정 IP 주소

   * 위의 웹 접근시 나온 정보 (13.209.1.26/29)를 SSH 접근하도록 설정하면 EC2를 웹에서 연결 가능함.

 

   

 

참고 URL : https://stackoverflow.com/questions/66884055/elastic-beanstalk-ec2-instance-connect-cant-connect

 

Elastic Beanstalk & EC2 Instance Connect: Can't connect

I created an Elastic Beanstalk environment from Visual Studio and need to login to service the underlying ec2 vm. I don't have an credentials for the server, so I wanted to use EC2 Instance Connect...

stackoverflow.com

참고 URL : https://aws.amazon.com/ko/premiumsupport/knowledge-center/ec2-instance-connect-troubleshooting/

 

EC2 Instance Connect를 사용한 연결 문제 해결

Amazon EC2 Instance Connect를 사용하여 Amazon EC2(Amazon Elastic Compute Cloud) 인스턴스에 연결하려고 할 때 다음 오류가 표시됩니다. “ 인스턴스 연결을 설정하는 동안 문제가 발생했습니다. 로그인하지 못

aws.amazon.com

 

반응형
반응형

무료 DB 접근툴로 역 ERD도 정상적으로 잘 그려지는것을 확인하였습니다.

 

아무래도 한국어가 지원하다보니 뭔가 보여지는 모습도

 

산출물 형태를 띄고 있어 맘에 듭니다.

 

특징

 

1. 역 ERD 아주 잘 그려짐

2. 여러가지 DB를 웹 상에서 가능

3. 웹 상으로 띄우기 때문에 여러사람이 사용 가능

 

라이선스 : 일반버전 LGPL 라이선스 

 

소스 및 컴파일 다운로드 주소

https://sourceforge.net/projects/tadpoledbhub/

 

Tadpole DB Hub

Download Tadpole DB Hub for free. Web based Database collboration tools. Original home : https://github.com/hangum/TadpoleForDBTools It is a tool to manage Altibase, Amazon RDS, Apache Hive, Apache Tajo, MongoDB, CUBRID, MariaDB, MySQL, Oracle, MSSQL, SQLi

sourceforge.net

 

https://www.tadpolehub.com/tadpole

 

TadpoleHub | tadpolehub

라이브러리 aws-java-sdk-1.4.7 입니다. 작성되는 시점에서 최신 버전입니다. 

www.tadpolehub.com

 

 

 

오픈소프 버전 vs 엔터프라이즈 버전 차이

https://www.oss.kr/oss_case/show/2b6ac347-f8d4-4fc0-9c5c-33d56745f377

 

[공개SW 스타트업/테드폴허브]올챙이가 대왕개구리 되는 그날까지 - 공개SW 포털

올챙이가 대왕개구리 되는 그날까지 백지영/디지털데일리 엔터프라이즈 솔루션부 팀장/jyp@ddaily.co.kr 시높시스와 가트너 등 시장조사기관의 조사에 따르면 상용 소프트웨어(S...

www.oss.kr

 

 

반응형

'Database' 카테고리의 다른 글

「SQLP 핵심노트」 Ⅰ & Ⅱ 출간  (0) 2021.09.08
무료 ERD 툴 ERMASTER  (0) 2019.08.08
damo 암호화 컬럼 복원시 주의사항  (0) 2017.08.20
Sybase IQ Administrator 사용 Script  (0) 2012.10.18
JNDI Log4SQL 적용 예...  (0) 2011.04.21
반응형

 

XRDP란 오픈소스인 Remote Desktop Protocol Server를 말합니다.

 

즉, 윈도우즈 머신로부터 당신의 리눅스 서버까지 RDP를 통해 접속가능합니다.

=> MSTSC를 통한 접속이 가능합니다.

 

 

CENTOS 7로 XRDP를 통한 접속을 위한 설치 방식을 설명합니다.

 

사전 준비 :

 

1. 사전에 CENTOS 7에 GNOME를 설치하세요

 

(관련 URL : http://www.itzgeek.com/how-tos/linux/centos-how-tos/install-gnome-gui-on-centos-7-rhel-7.html)

 

 

설정:

 

1. 저장소를 신규로 설정합니다.

 

# vi /etc/yum.repos.d/xrdp.repo 

 

위의 파일 안에 다음의 내용을 입력합니다.

[xrdp]
name=xrdp
baseurl=http://li.nux.ro/download/nux/dextop/el7/x86_64/
enabled=1
gpgcheck=0 

 

 

설치:

1. 다음의 명령을 실행하여 위의 선언한 xrdp 저장소로부터 읽어들여 설치합니다.

 

# yum -y install xrdp tigervnc-server

 

 

다음과 같은 결과가 나오면서 새로 생성된 저장소로 부터 패키지를 가지고 오고 있는지 확인하십시오

 

 --> Running transaction check
---> Package xrdp.x86_64 0:0.6.1-2.el7.nux will be installed
--> Finished Dependency Resolution
 
Dependencies Resolved
 
================================================================================
Package        Arch             Version                   Repository      Size
================================================================================
Installing:
xrdp           x86_64           0.6.1-2.el7.nux           xrdp           271 k
 
Transaction Summary
================================================================================
Install  1 Package
 
Total download size: 271 k
Installed size: 1.5 M
Is this ok [y/d/N]
Downloading packages:
xrdp-0.6.1-2.el7.nux.x86_64.rpm                            | 271 kB   00:05
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : xrdp-0.6.1-2.el7.nux.x86_64                                  1/1
Verifying  : xrdp-0.6.1-2.el7.nux.x86_64                                  1/1
 
Installed:
xrdp.x86_64 0:0.6.1-2.el7.nux

 

 

설치가 완료되면 XRDP 서비스를 시작합니다

# systemctl start xrdp.service 

 

 

xrdp는 기본 3389 포트를 사용합니다.

※ 만약 변경하고자 할때는 /etc/xrdp/xrdp.ini의 port의 값을 변경하면 됩니다.

 

서비스가 동작중인지 확인합니다.(아래는 3389로 동작하고 있음)

 

 # netstat -antup | grep xrdp
tcp 0 0 0.0.0.0:3389 0.0.0.0:* LISTEN 1508 / xrdp
tcp 0 0 127.0.0.1:3350 0.0.0.0:* LISTEN 1507 / xrdp-sesman

 

CENTOS 7에서는 기본적으로 재부팅후에 자동으로 서비스가 시작되지 않습니다.

따라서 아래와 같은 명령을 통해 자동 시작기능을 설정합니다.

# systemctl enable xrdp.service 

 

외부 기기에서 rdp 연결을 허용하는 iptables 규칙을 작성하는 것입니다. (tcp 3389 포트를 예외로 설정함)

# firewall-cmd --permanent --zone=public --add-port=3389/tcp
# firewall-cmd --reload 

 

SELinux 구성

# chcon --type=bin_t /usr/sbin/xrdp
# chcon --type=bin_t /usr/sbin/xrdp-sesman 

 

 

테스트 :

 

아래와 같이 mstsc를 통한 대상 서버 접속을 합니다.

 

CentOS 7 - xrdp MSTSC

 

 

사용자 이름과 암호를 입력하라는 메시지가 표시됩니다. root 또는 시스템에있는 사용자를 사용할 수 있습니다. "sesman-Xvnc"모듈을 사용해야합니다.

 

CentOS 7 - xrdp 로그인 페이지

 

확인을 클릭하면 처리가 표시됩니다. 30 분 안에 데스크 탑을 연결을 얻게 됩니다.

 

CentOS 7 - xrdp 데스크탑

 

 

 

 

출처 : http://www.itzgeek.com/how-tos/linux/centos-how-tos/install-xrdp-on-centos-7-rhel-7.html

반응형

'OS > Linux' 카테고리의 다른 글

Centos 7 SAMBA 설정  (1) 2019.09.05
vi 색상 표기  (0) 2019.05.08
리눅스 백업 및 복구  (0) 2013.01.25
삼성 컴퓨터 유분투 설치기.  (0) 2012.02.06
rkhunter (리눅스 침입 탐지 사용하기)  (1) 2010.10.14
반응형



Connection 실패!

e : java.sql.SQLException: Listener refused the connection with the following error:

ORA-12505, TNS:listener does not currently know of SID given in connect descriptor

The Connection descriptor used by the client was:

100.100.1.1:1521:HHHAAA


원인

SID 와 ServiceName이 상이할 경우 발생


해결 방안


SID일 경우                - "jdbc:oracle:thin:@" + dbip + ":" + dbport + ":" + dbsid;
ServiceName일 경우 - "jdbc:oracle:thin:@" + dbip + ":" + dbport + "/" + dbsid;   


JSP 상에서는 안될 경우
connectInfo = "jdbc:oracle:thin:@//" + dbip + ":" + dbport + "/" + dbsid;

참고 사이트 : 
http://stillrabbit.blogspot.com/2009/01/jdbc-config-oracle-resource.html
 

후후... 일반적으로 SID와 Service Name이 동일하나... 이 사이트와 같은 경우도 존재했음...

샘플 JDBCTest.java

컴파일 : javac JDBCTest.java
실행 : java -cp /xxx/xxx/ojdbc.jar:. JDBCTest

 import java.sql.*; 


public class JDBCTest { 

 private static Connection con; 1

 private static Statement stmt; 

 private static ResultSet rs;   

  

 public static void main(String[] ar){ 

  try{ 

   // 1. Driver를 로딩한다. 

   Class.forName("oracle.jdbc.driver.OracleDriver"); 

   System.out.println("OracleDriver의 로딩이 정상적으로 이뤄졌습니다."); 

    


   String url = "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=100.100.1.1)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=HHHAAA)))";

   // 2. Connection 얻어오기 

   con  = DriverManager.getConnection("jdbc:oracle:thin:@100.100.1.1:1521/HHHAAA" , "HHHH_WEBS", "123456");

   System.out.println("데이터베이스의 연결에 성공하였습니다."); 

    

   // 3. Statement 얻기 --> 쿼리문 작성하여 적용하기 위한 용도 

   stmt = con.createStatement(); 

    

   String sql ="";

    

   // 7. Select문 실행하여 데이터베이스 내용 출력하기 

   sql = "select count(*) from admin.tablesAN20"; 

   

   rs = stmt.executeQuery(sql); 

   

   while(rs.next()){ 

    System.out.println("count : " + rs.getString(1)); 

   } 

   

   // 7. Select문 실행하여 데이터베이스 내용 출력하기 

   sql = "select count(*) from admin.tablesXA01"; 

   

   rs = stmt.executeQuery(sql); 

   

   while(rs.next()){ 

    System.out.println("count : " + rs.getString(1)); 

   } 

   

   // 7. Select문 실행하여 데이터베이스 내용 출력하기 

   sql = "select count(*) from admin.tablesXA02"; 

   

   rs = stmt.executeQuery(sql); 

   

   while(rs.next()){ 

    System.out.println("count : " + rs.getString(1)); 

   }       

   

   rs.close(); 

   stmt.close(); 

   con.close(); 

  }catch(ClassNotFoundException cnfe){ 

   System.out.println("oracle.jdbc.driver.OracleDriver를 찾을 수 없습니다."); 

  }catch(SQLException  sql){ 

   System.out.println("Connection 실패!"); 

   System.out.println("e : " + sql.toString()); 

  }catch(Exception e){ 

   System.out.println(e.toString()); 

  }finally{ 

   System.out.println("성공!!"); 

  } 

 } 








반응형

'Private' 카테고리의 다른 글

node-red oracledb  (0) 2018.06.25
서버 용량 산정 / 성능 측정 / tpmc / bops / tpc / tpc-h  (0) 2013.05.10
Magicar AF BRONZE (매직카 브론즈)  (0) 2011.11.30
압력 밥솥 구매 ... 예정  (0) 2011.11.26
아놔 가습기  (3) 2011.11.22
반응형

어느날 갑자기... PUTTY로 접속을 하려는데

다음과 같은 에러를 발생하며 접속이 안된다...

물론 id / password를 다 넣었다.

Server unexpectedly closed network connection

서버로 네트워크 연결이 예상지 못하게 종료되었습니다.

라는 뜻인데...

우선 로그를 살펴보았다.

/var/log/secure

 pam_unix(sshd:session): session opened for user test01 by test01(uid=100)
 pam_loginuid(sshd:session): set_loginuid failed opening loginuid
 pam_loginuid(sshd:session): set_loginuid failed

로그를보면 test01이라는 계정이 set_loginuid 의 열기 실패했다고 볼수 있다.

관련 내용을 구글링을 통해 검색해 보았다.

Server unexpectedly closed network connection

-> 즉 2가지 수정안인데... 나와 같이 특정계정만 막힌 경우는 해결되지 않았다.

 Server unexpectedly closed network connection"

라는 에러 메시지와 함께 접속 안 되는 경우가 생깁니다

그럴 경우에는 /etc/ssh/sshd_config 에서 UseDNS no 라고 추가 시켜 준 다음에

ssh 데몬(sshd)를 재시작(하거나 kill 로 죽인 다음에 다시 실행)하면 됩니다

추가
이전 키는 삭제 해야 합니다

리눅스에서는 ~계졍명/.ssh/known_hosts 에 해당하는 주소에 키를 삭제 하면 되고

윈도우에서 putty를 쓸 경우에는 레지스트리에서
HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys
에 해당하는 키를 삭제하면 됩니다--moon.ft.co.kr

출처 : http://www.hostingland.co.kr/service/memo_view.htm?mode=view&code=memo&kind=h_qna&num=140448&idx_num=198

그러다가 로그의 내용을 중심으로 다시 구글링을 해보았다.

그랬더니 centos의 일종의 버그였다.

# grep pam_loginuid.so /etc/pam.d/*

/etc/pam.d/crond:session required pam_loginuid.so
/etc/pam.d/login:session required pam_loginuid.so
/etc/pam.d/remote:session required pam_loginuid.so
/etc/pam.d/sshd:session required pam_loginuid.so

위의 내용중 제일 하단에 결과를 보면 /etc/pam.d/sshd 파일의 세션 정보에서 pam_loguid.so를 사용함을 알수 있다.

즉, ssh를 통한 접속시 pam_loginuid를 이용하는 것을 알수 있다.

이부분을 # 처리하고

# service restart sshd

명령을 통해 sshd를 재시작하면 정상적으로 접속이 된다.

출처 : http://forums.powervps.com/showthread.php?p=19872

위의 출처를 통해 가보면 로그인을 통한 메모리 이득을 취할 수 있다고 하는데...

더 분석을 해봐야 겠다...
반응형
반응형

이클립스를 사용하던중 FTP 나 ssh 로그인 기능을 조금더 쉽게 쓸수 없을까라는 고민을 하던중

그러한 기능을 지원하는 RSE라는 기능의 Plug-in을 알게되었다...

RSE 기능 관련 동영상

출처 : http://mytory.co.kr/412


이 동영상을 보고 설치를 시작하였다...

나의 이클립스 버젼 : 3.4.1

1. 이클립스 update 기능을 사용하여 RSE Client 설치...

이클립스 실행 -> Help -> Software Updates... -> Available Software 탭 -> Ganymede Update Site ->
Remote Access and Device Development -> Remote System Explorer End-User Runtime & Target Management Terminal 설치

이것을 이용하여 이클립스상에 설치를 하고 재시작을 하면

open Perspective -> Other -> Remote System Explorer perspective 가 선택가능함.

Local -> New을 선택해 연결한 서버 정보를 등록하는 것은 쉽다...(동영상 참조)

그러나... 반드시 먼저 해야할 것은 서버를 설치하는 것이였다... ㄷㄷㄷ;

서버 버젼 및 최신의 다운로드 정보를 제공해주는 이클립스 사이트 주소

http://download.eclipse.org/dsdp/tm/downloads/drops/L20100616-0300/index.php

에 들어가면 DStore Server Runtime 에서 플랫폼에 맞춰서 다운로드 받으면 된다.

다운받은 tar 파일을 /opt/rseserver/(경로는 자기 맘대로 정보에 풀고


root 권한으로 /opt/rseserver/ 디렉토리로 이동하여 daemon.pl을 실행하면

이클립스에서 연결이 가능함. (Remote daemon -> 4075 포트로...)

필수 사항 : root 권한에 java와 perl이 실행 가능하여야 함.

확인방법 : java -version
               perl -V
반응형
반응형


- 이클립스 상에서 오라클 DATABASE를 바로 연결하여 사용하는 방법을 기술한다.

설치에 사용된 이클립스...




Help -> SoftWare Update를 클릭


1. Add Site를 누름 

2.http://quantum.sourceforge.net/update-site/ (Location) 부분에 입력

3. OK를 클릭

4. Quantum 을 검색 한뒤

5. Install 버튼 클릭



6. NEXT를 클릭


7. 사용 조건에 승인하고 Finish 를 클릭 -> 설치 완료
  
    - 아래와 같이 설치가 완료되어 다시 시작한다는 메시지가 뜨면 YES를 누르고 이클립스를 다시 시작함.
  


8. 이클립스 상에서 Quantum 플러그인 추가

window -> open Perspective -> other



9. Other open Perspective 화면에서 Quantum DB를 선택함.


10. 정상적으로 설치되었음을 확인할 수 있다.(연결정보 설정은 당연히 현재는 안되어 있음)

11. 연결 정보를 다음과 같이 추가함.
Database Bookmarks 탭상에서 빈공간에서 마우스 우클릭 -> New Bookmark... 클릭


12.  ADD driver을 눌러 추가하자 ! (우리는 오라클을 추가할 것이다.)



13. Add External Jar.. 늘 눌러 ojbc14.jar를 추가함.


14. 아래와 같이 정보를 설정하고 Finish를 누름



15. 입력한 Oracle 드라이버를 선택후 Next> 를 클릭


16. 다음과 같이 DB 연결 정보를 입력
     userid : 연결ID
     passwd : 연결ID의 암호
     HOSTNAME : DB서버 주소
     PORT : 오라클 리스너 포트(일반적으로 1521)
     DATABASE NAME : SID NAME


17. 북마크에서 사용할 이름을 지정함


18. 17번까지의 설정을 모두 마치면 자동으로 연결되고(정보가 틀리지 않았다면)
     Quantum SQL Queries View상에서 쿼리를 입력후 초록색 ▶ 버튼을 누르면 하단의 Quantum Table View 상에서 데이터가 조회됨.





P.$ :
1. MySql 연결시에는 mysql-connector-java-5.1.6-bin.jar 파일을 다운받음
2. 드라이버 선택 -> com.mysql.jdbc.Driver
3. 연결 포트는 3306임.
반응형
반응형

--- Arup Nanda 의 사이트에 자주 들어가봅니다. DBA 로서의 장애 Case 를 대응하는 절차가 비교적 자세히 나와있더군요. 요즘 일이 많아서 빠르게 쓰다보니 오역과 중간중간 빼먹는게 많은건 이해해주시길...아래는 실제로 DMA (direct memory access)를 사용해서 처리한 사례더군요..

  

Diagnosing Library Cache Latch Contention: A Real Case Study

 

어느날 DW 서버가 갑자기 다운됐다. 그래서 데이타베이스를 올리고 다시 구동했지만 모든 접속을 시도하면
hang 이 걸리는 것이였다. 따라서 접속은 실패하고 DBA는 접속된 세션들이 구동되고 있는지 어떤지를 확인할 수 조차도
없었다. DBA 는 WAIT 이벤트를 체크했다 (그러나 로긴조차도 안되기 때문에 실행할수 없었다)
흥미롭게도 CPU는 70% 정도의 수준이였고 이는 낮시간대의 일반적인 수치이다. 그리고 I/O또한 약 90%로서 이또한
일반적인 수치였다.

따라서 전형적인 방법인 system 관리자에게 보고하고 재부팅을 하는 방법을 사용했다. 재부팅은 30분정도
소요되었고 그 후로 10여분간은 모든것이 정상적으로 보였다. 그러나 얼마되지 않아 아까와같은 똑같은 문제에 부딪쳤다- 데이타베이스가 먹통이 되어버린 것이였다.

이것 때문에 DBA가 나에게 도움을 요청하였다. 이 블로그에서는 내가 이후의 30분동안에 어떻게 수행했고 문제를
해결했는지에 대해서 기술해보도록 하겠다.

 

증상


(1) 데이타베이스 접속 Hanging
(2) SQL*PLUS AS SYSDBA 로 접속해도 동일한 HANGING 현상: 증상을 확인할 수도 없는 상태
(3) 시스템은 아무때나 리부팅할 수 없는 상태

 

Action

 

여기서 접속이 불가능할 때 데이타베이스 인스턴스에서 바로 써먹을 수 있는 꼼수가 존재한다.
대부분의 사람들은 SQL*Plus 에서 "prelim" 이라고 불리는 옵션을 잘알지 못한다. 이 옵션은 세션을 열지 않고
SGA에 바로 접속한수 있는 옵션이다. (10g 이상에서만 가능) 

 

(1) 먼저 SQL*plus 를 실행시키고 아래의 명령문을 실행했다.

 

$ sqlplus -prelim / AS SYSDBA
SQL>

 

명심하라. "Oracle Database 10.2.0.3 에 접속" 과 다르다. 지금 보이는 SQL> 프롬프트는 실제로는
데이타베이스에 접속한 상태가 아니다.

 

(2) 그다음 SGA 를 분석하기 위한 "oradebug" 를 사용하였다.

 

SQL> oradebug setmypid
SQL> oradebug hanganalyze 12

 

이 명령은 USER_DUMP_DEST 에 trace파일을 생성한다. 이 파일을 가장 최근에 생겨났기 때문에
쉽게 찾을 수 있다. 심지어는 내가 파일을 찾지 못해도 process ID를 사용해서 파일을 찾을 수 있다.
내가 찾은 파일은 프로세스ID 가 13392인 crmprd1_ora_13392.trc 였다.

(3) 파일을 조사하니 다음과 같았다.

 

*** 2008-08-23 01:21:44.200
==============
HANG ANALYSIS:
==============
Found 163 objects waiting for
<0/226/17/0x1502dab8/16108/no>
Open chains found:
Chain 1 : :
<0/226/17/0x1502dab8/16108/no>
<0/146/1/0x1503e898/19923/latch:>

이 파일을 많은 것을 말해준다. SID 146 에 Serial# 1 이 library cache latch 를 대기하고 있는 것을 보여준다.(맨마지막줄)
그리고 blocking 세션은 SID 226 Serial# 17 로 나와있다. 

나는 일단 이 OS process ID 인 16108 과 19923 을 기록해두었다.

 

(4) 다음으로 위의 두개의 OS PID 명으로 되어 있는 TRACE 파일을 체크했다.

 

crmprd1_ora_16108.trc
crmprd1_ora_19923.trc

 

(5) 먼저 BLOCKER인 첫번째 파일을 열었다. 다음 몇줄의 예이다.

 

*** 2008-08-23 01:08:18.840
*** SERVICE NAME:(SYS$USERS) 2008-08-23 01:08:18.781
*** SESSION ID:(226.17) 2008-08-23 01:08:18.781
LIBRARY OBJECT HANDLE: handle=c0000008dc703810 mtx=c0000008dc703940(8000) cdp=32737
name=UPDATE DW_ETL.FRRS_PROFILER SET CONSUMER_LINK = :"SYS_B_0", ADDRESS_LINK = :"SYS_B_1", ADDRESS_MATCH = :"SYS_B_2", PROC
ESSED=:"SYS_B_3" WHERE RNUM = :"SYS_B_4"
hash=a029fce7bb89655493e7e51a544592a4 timestamp=08-23-2008 00:10:23
namespace=CRSR flags=RON/KGHP/TIM/OBS/PN0/MED/KST/DBN/MTX/[504100d0]
kkkk-dddd-llll=0000-0001-0001 lock=N pin=0 latch#=10 hpc=0058 hlc=0058
lwt=c0000008dc7038b8[c0000008dc7038b8,c0000008dc7038b8] ltm=c0000008dc7038c8[c0000008dc7038c8,c0000008dc7038c8]
pwt=c0000008dc703880[c0000008dc703880,c0000008dc703880] ptm=c0000008dc703890[c0000008dc703890,c0000008dc703890]
ref=c0000008dc7038e8[c0000008dc7038e8,c0000008dc7038e8] lnd=c0000008dc703900[c0000008dc703900,c0000008dc703900]
LOCK OWNERS:
lock user session count mode flags
---------------- ---------------- ---------------- ----- ---- ------------------------
c0000008d079f1b8 c0000006151744d8 c0000006151744d8 16 N [00]
c0000008d4e90c40 c0000006151bcb58 c0000006151bcb58 16 N [00]
c0000008d0812c40 c0000008151a0438 c0000008151a0438 16 N [00]

 
(6) 이것은 디버깅을 위해 보물과 같았다. 첫번째에 SID와 Serial#(226,17) 를 확인할수 있다.
이를 사용해서 정확한 SQL문장을 볼수 있다. 또한 락에 대한 전체적인 상황을 볼 수 있다. 락의 자세한 사항은 신경쓰지 않아도 되지만 SID 226 이 전체 세션의 대기를 유발시키는 것이라는 충분한 정보를 제공해주었다.

 

(7) 나의 조사는 여기서 그치지 않고  이 대기를 유발하는 세션을 찾기를 시도했다. 따라서 나는 파일의 "PROCESS STATE" 이라는 섹션을 조사했다. 다음은 이 파일의 일부분이다.

 

PROCESS STATE
-------------
Process global information:
process: c00000081502dab8, call: c000000817167890, xact: 0000000000000000, curses: c00000081519ef88, usrses: c000000815
19ef88
----------------------------------------
SO: c00000081502dab8, type: 2, owner: 0000000000000000, flag: INIT/-/-/0x00
(process) Oracle pid=370, calls cur/top: c000000817167890/c000000817167890, flag: (0) -
int error: 0, call error: 0, sess error: 0, txn error 0
(post info) last post received: 115 0 4
last post received-location: kslpsr
last process to post me: c000000615002038 1 6
last post sent: 0 0 24
last post sent-location: ksasnd
last process posted by me: c000000615002038 1 6
(latch info) wait_event=0 bits=20
holding (efd=4) c0000008d7b69598 Child library cache level=5 child#=10
Location from where latch is held: kglhdgc: child:: latch
Context saved from call: 13
state=busy, wlstate=free
waiters [orapid (seconds since: put on list, posted, alive check)]:
291 (197, 1219468295, 197)
279 (197, 1219468295, 197)
374 (197, 1219468295, 197)
267 (197, 1219468295, 197)
372 (197, 1219468295, 197)
... several lines sniped ...
307 (15, 1219468295, 15)
181 (6, 1219468295, 6)
waiter count=58
Process Group: DEFAULT, pseudo proc: c0000008e03150d8
O/S info: user: oracrmp, term: UNKNOWN, ospid: 16108
OSD pid info: Unix process pid: 16108, image: oracle@sdwhpdb1


 

 

(8) 이파일은 내가 알기를 원하는 것을 모두 말해준다. 여기에 SID 226 에 의해서 발생하는 CACHE LATCH
로 인해서 대기하는 58 session들이 있다. 여기서 OS PROCESS ID 와 BLOCKING 세션의 SQL 문장을 알 수 있다.

 

 

(9) 나는 application 사용자가 어떠한 것을 실행했는지를 조사해봤더니 사용자는 loop를 돌면서 처리하는
update 문장을 실행시킨 것이였다. 그리고 그게 다가 아니라 다른 8개의 thread 에서 실행을 하였다.(역: 아마도 화면상에서 처리 가 되지 않으니 화면을 새로고쳐서 계속해서 8번을 처리 버튼을 누른것으로 생각됨)
의심할 여지가 없이 library cache latch 경합에 걸렸다. 모든 세션은 각각의 덤프 정보를 남겼다.
그리고 나는 같은 문장을 실행한 파일을 디렉토리에서 조사해보기로 했다.

 

$ grep “UPDATE DW_ETL” *.trc

 

(10) 나는 9개 이상의 세션(프로세스) 파일을 찾았다. 이중 한개의 파일의 일부분이다.

 

350 (167, 1219470122, 167)
197 (167, 1219470122, 167)
waiter count=185
Process Group: DEFAULT, pseudo proc: c0000008e03150d8
O/S info: user: oracrmp, term: UNKNOWN, ospid: 16114

 

이 프로세스 한개가 185개 waiter 를 가졌다!!!


 

$ kill -9

 

(12) 위의 명령으로 몇개의 프로세스를 죽인 후에야 데이타베이스는 응답하기 시작했다. 모든 프로세스를 죽인 후에는 데이타베이스 wait event 가 완벽히 정상적으로 돌아왔다.

 

참고사항


(1) Hang 이라고 생각되면 너무 그것에 대해 불안해하지 마라. 세션은 언제나 어떤것을 대기한다. 드물게 행을 만날 뿐이다.

v$session (10g) 이나  v$session_wait 의 EVENT 컬럼을 조회해서 대기하는 것이 무엇인지를 먼저 체크하라.

(2) 데이타베이스에 로긴하지 못해 정보를 얻을 수 없을 때는 oradebug 명령을 사용한다.

(3) oradebug 를 사용할때 SQL*Plus 를 이용한다. 로긴하지 못할때 "sqlplus -prelim " 로 SQL prompt 를 얻을 수 있을 것이다.

(4) oradebug setmypid  이용해서 oradebug 세션을 시작하고 oradebug hanganalyze  로 모든 hang 과 관련되어 있는

문제에 대한 덤프를 생성한다.

(5) oradebug help 를 사용해서 oradebug 커맨드의 모든것을 볼 수 있다.

 

 

반응형

+ Recent posts