2014년 11월 27일 목요일

DDB 기본기능 및 분산 트랜잭션 문제의 해결[오라클개발자교육/오라클/ORACLE강좌/오라클교육잘하는곳/오라클교육추천/ORACLE실무교육/ORACLE/ORACLE교육/ORACLE학원/오라클실무교육]

  BULLETIN CATEGORY  
BULLETIN TOPIC : RDBMS   
: DDB 기본기능 및 분산 트랜잭션 문제의 해결 

-------------------------------------------------------------------------------- 
   여기서는 DDB(분산 데이타베이스)의 기능과 역할 및 사용 시에 발생하는 문제점들에 대해서 알아보기로 한다.  분산 DB 환경과 관련된 init<SID>.ora 화일의 파라미터는 다음과 같은 것들이 있다.     
DB_NAME      
DB_DOMAIN      
GLOBAL_NAME      
DISTRIBUTED_RECOVER_CONNECTION_HOLD_TIME      
DISTRIBUTED_TRANSACTIONS      
DISTRIBUTED_LOCK_TIMEOUT      
COMMIT_POINT_STRENGTH      
OPEN_LINKS  
    분산 DB와 관련된 VIEW와 TABLE은 다음과 같다.     
GLOBAL_NAME      
DBA_DB_LINKS, ALL_DB_LINKS, USER_DB_LINKS      
DBA_2PC_PENDING      
DBA_2PC_NEIGHBORS  
     
  RECO:Recoverer Process     

  분산 트랜잭션의 Failure를 해결하는 Process로 RECO는 In-doubt 분산 트랜잭션을 가지고 있는 다른 DB에 자동적으로 Connect 하여 모든 In-doubt 트랜잭션을 해결한다.     
 만일 RECO가 Remote Server에 Connection을 시도했는데 Remote Server가 사용 가능하지 않거나 Network가 복구 되어 있지 않을 경우 RECO는 일정한 시간 후에 다시 Connect를 시도한다.     
     

  DATABASE LINK     

1. Database Link에는 Private Database Link와 Public Database Link의 두 종류가 있는데 일반적으로 Public Database Link로 정의하여 사용한다.      
2. Public Database Link     
  Local 데이타베이스의 모든 사용자가 Remote 데이타베이스의 데이타를 사용 할 수 있다. 이 경우 Remote Database에 대해서 필요한 권한을 가지고 있어야 한다.      

3. Public Database Link Creation     
EX ) CREATE PUBLIC DATABASE LINK sales.acme.com USING 'dbstring';     

4. Dropping Databsae Link     
EX ) DROP PUBLIC DATABASE LINK sales.acme.com;     
     

  Two-Phase Commit의 구성     

   Two-Phase Commit은 Prepare Phase와 Commit Phase로 나누어 진다.     

 1. Prepare Phase      
  Global Coordinator(분산 Transaction을 일으킨 Node)가 분산 Transaction에 참석한 Node들에 대해 Commit이나 Rollback을 수행해도 되는가를 확인하는 단계이다.     

 2. Commit Phase     
 분산 Transaction에 참여한 Node가 Global Coordinator에게 분산 Commit해도 좋다는Response(즉 Prepare 되었음)를 받고 Transaction을 Commit한다. 어떠한 Node라도 Prepare가 안되었다는 Response가 있으면 Transaction을 Rollback한다.     

  Two-Phase Commit의 수행     

 1. Prepare Phase에 대한 Response는 Prepared, Read-Only, Abort가 있다.     
    A. Prepared는 Data가 정상적으로 수정되었으며 Prepare되었음을 의미한다.     
    B. Read-Only 는 해당Node에서 Data의 수정이 없었다는 의미이다.     
    C. Abort는 Prepare되지 않았음을 의미한다.     

 2. 모든 Node에서 Prepared가 되면 Commit Phase가 수행된다.     
   그러나 한 Node라도 Abort되면 Commit Phase에서 전 Node에 Rollback을 수행한다.     

  Two-Phase Commit 메카니즘     

 예를 들어 다음과 같은 경우를 가정해 보자     

SQL> update 부서@Pusan     
        set 부서이름 = 기술연구소     
     where 부서코드 = 40;     

SQL> update 사원@Seoul     
        set 부서코드 = 40;     
     where 사번 = 777;     

SQL> commit;    <-- 현재 시점에서 부서@Pusan 테이블은 변경이 됐지만, 사원     
           @Seoul 테이블을 변경하다가 네트웍 장애로 인해 변경이 안됐을 경우. 

이런 경우에 오라클은 Two-Phase commit 알고리즘에 따라 자동으로 모두 롤백시킨다. 한 트랜잭션안에 remote update나 distributed update등이 있을때, commit이나 rollback을 실행하는 시점에서 트랜잭션의 모든 변경된 내용이 동시에 commit되거나 rollback된다.      
     

    분산처리 문제와 해결 방법     

1. Two-Phase Commit을 인터럽트하는 Failures     

[ 현상 ]     
ORA-02050: Transaction ID rolled back, some remote dbs may be in-doubt     
ORA-02051: Transaction ID committed, some remote dbs may be in-doubt     
ORA-02054: Transaction ID in-doubt     

  만일 프로그램이 사용 중 위의 에러 가운데 하나가 발생한다면 그 트랜잭션에 대한 정보가 자동적으로 저장되며 이 정보는 후에  분산 트랜잭션에 대한 Manual Recovery 시에 사용될 수 있다.      

[ 조치 방법 ]     
  DBA는 특별한 Action을 취할 필요가 없다. RECO Process가 Session Tree의 모든 노드에서 같은 결과가 발생되도록 (즉 모두 Commit 혹은 모두 Rollback) In-doubt 트랜잭션을 자동적으로 Recovery 한다. 그러나 장기적인 Power Failure인 경우 Lock된 리소스를 Release 하기 위해 강제적으로 Commit나 Rollback을 시켜준다.      

2. 데이타의 Access를 금지시키는 Failure     

[ 현상1. ]     
Transaction Time-out     
ORA-02049: time-out : distributed transaction waiting for lock     
      
  Local의 DML 문장이 Remote의 다른 Transaction에 의해 Lock 되어 있는 데이타를 수정 및 삭제 하려고 할 때 Time-out이 발생하고 그 명령은 Rollback 된다.      

(Scenario)     
 [ in REMOTE ]     
SQL>update dept set deptno=10;     
 [ in LOCAL ]     
SQL>update dept set deptno=10;     
SQL>update dept@ORA7 set deptno=10;     

ORA-02049 : time-out     

[ 조치 방법 ]     
   Local DB에는 Update가 발생하므로 항상 Rollback을 시켜야 한다. Remote DB는 변경되지 않으므로 Time-out의 결과로 다른 조치는 필요 없다. 위 상황에서 Time-Out Interval 은 DISTRIBUTED_LOCK_TIMEOUT 파라미터로 Time Out 시간을 조정할 수 있다.      

 [ 현상2. ]     
Lock from In-doubt Transaction     
ORA-01591 : Lock held by in-doubt distributed transaction ID     

  Local DB에 Lock을 발생시키는 DML 문장을 In-doubt 분산 트랜잭션에 의해     
Lock된 Resource에 계속해서 실행할 경우 발생하는 에러     

(Scenario)     
(1) update dept@ORA7 set dname='AA';     
(2) Remote DB down     
(3) Commit     
     ORA-02054 : transaction 2.1.207 is in-doubt transaction     
(4) select * from dept;     
    ORA-01591 : Lock held by in-doubt distributed transaction id 2.1.207 
  Local에서 dba_2pc_pending으로부터 In-doubt 트랜잭션 정보를 확인할 수있다. 

 [ 조치 방법 ]     
 이 경우 SQL 문장은 즉시 Rollback 되 만일 Lock이 계속해서 걸려있으면      
DBA에게 알리도록 한다. 이런 현상은 드물게 발생하며 Network나 System      
Failure가 빠르게 복구되면 문제는 자동적으로 해결된다.     

3. 두개 NODE 사이에 Connection이 만들어진 이후에  Network Failure가 발생한 경우     

(Scenario)     
(1) Forms 화면에서 Data Update     
(2) Commit - DB Trigger에 의해서 Server Machine에 Server process가 생기며 Network 와 
    Remote DB 가 정상적인 경우 Commit 된다.      
(3) Network Fail(Line 을 Disconnect)     
(4) Forms 화면에서 Update     
(5) Commit     
(6) Forms Screen이 Holding 상태로 됨     
     

[ 조치 방법 ]      
  Network이 복구되면 자동적으로 Commit 되지만 Network Failure가 장기화될 경우 강제로 Abort 시키는 조치가 필요하다. 강제로 Abort 이후 자동적으로 Rollback 되므로 더이상 조치가 필요하지 않다.      

4. Network이 Down된 상태에서 Connection을 시도하려는 경우     

(Scenario)     
(1) Network Down     
(2) Forms 화면에서 Data 수정     
(3) Commit     

[조치 방법]     
  모든 Transaction이 Rollback 되므로 더 이상 조치가 필요하지 않으나 다만 Network이 Down된 상태에서 Connect를 시도하려고 하는 시간을 줄여서 곧바로 Error가 발생되도록 해야 한다. 

5. Server Machine의 orasrv가 Down된 상태에서 Connect를 하려고 하는 경우      
      : ORA-06108 error 발생     

6. In-doubt 트랜잭션을 Manually Overriding     
   ORA-01591 Message가 발생하여 User가 조치를  요구하는 경우      
   In-doubt 트랜잭션이 Rollback Segment의 Extension를 막는 경우     
   Network 및 System Failure가 장기화 될 경우     

  In-doubt 트랜잭션에 대한 정보를 얻는 방법     
        a.User Feedback을 기록     
        b.Local dba_2pc_pending View를 조회     
        c.Local dba_2pc_neighbors View를 조회     
        d.정상적으로 통신이 복구된 후에 Mixed Outcome Flag를 Check     

  Record User Feedback     

ORA-01591: Lock held by in-doubt distributed transaction 1.21.17     
1.21.17 : local transaction id     

  Query dba_2pc_pending     
        < global_db_name format >     
        global_database_name.hhhhhhhh.local_transaction_id     
        cf ) global_database_name=global coordinator db name     
             hhhhhhhh=internal db id     

  Query dba_2pc_neighbors     
  In-doubt 트랜잭션이 관련되어 있는 Connection에 대한 정보를 조회한다. 각 Connection에 대한 정보는 Connection이 Inbound, Outbound 이냐에 따라 다르다.      

   만일 Connection이 Inbound이면 그 Node는 다른 Node 의 Server이다. 만일 Connection이 Outbound이면 그 Node는 다른 Server의 Client이다. Interface Column 은 Local Node 혹은 Subordinate Node가 Commit Point Site 인지를 알려준다.      
만일 Local Transaction id와 Global Transaction id가 일치하면 그 Node 는 Global Coordinator이다.      

  Check for Mixed Outcome     
  트랜잭션이 Manual로 Commit 혹은 Rollback된 후에 해당 Row가 Pending 트랜잭션 테이블에 남아있다. 그 트랜잭션의 상태는 "forced commit" or "forced abort" 로 변경되어지고 Instance 사이에 Connection이 복구되면 RECO는 트랜잭션의 Global Outcome을 Check하여 정상적인 경우 Row를 삭제하지만 틀린 방법으로 트랜잭션을 Force 시키면 삭제되지 않고 Mixed Column이 "Yes" 로 변경된다.      

7. Manual Commiting In-Doubt Transaction     

        COMMIT FORCE 'SALES.ACME.COM.55dic563.193.29';     
        COMMIT FORCE 'global_id', 829381993 (system commit number)     

8. Manually Rolling Back In-Doubt Transaction     
        ROLLBACK FORCE '2.9.4';     

9. Disabling and Enabling RECO     

        ALTER SYSTEM DISABLE DISTRIBUTED RECOVERY;     
        ALTER SYSTEM ENABLE DISTRIBUTED RECOVERY;     

10. Commit Point Site 결정     
        첫번째 Commit하는 Node     
        In-Doubt Data를 가질 수 없다.      
        Prepared 상태로 될 수 없다.      
       분산 데이타베이스에 참여하는 시스템 중 가장 안정된 시스템에 가장 높은 값을 
       준다.     

   

 [100%환급,개발자전문]빅데이터/SQL/자바/스프링/안드로이드/닷…오라클자바…12-272641
 [채용확정무료교육]오라클자바개발잘하는신입뽑기2개월과정,교육…오라클자바…12-111909
53 [평일100%환급7건]Spring,자바&JSP,안드로이드,웹퍼블리싱,C#닷… 오라클자바…03-151723
52 [주말]C#,ASP.NET마스터 오라클자바…01-311847
51 [기업100%환급,평일주간]SQL기초에서스키마오브젝트,PLSQL,힌트… 오라클자바…01-312684
50 [평일주간야간,주말]C기본&자료구조,알고리즘 오라클자바…01-311437
49 [평일주간,평일야간,주말]Spring,MyBatis,Hibernate개발자과정-… 오라클자바…01-191759
48 [평일야간,주말]안드로이드개발자과정(Android기초실무) 오라클자바…01-111645
47 [평일야간,주말주간야간]JAVA,Network&JSP&Spring,MyBatis,Hiber… 오라클자바…01-032163
46 [100%환급,개발자전문]빅데이터/SQL/자바/스프링/안드로이드/닷… 오라클자바…12-272641
45 [평일주간]NoSQL,MongoDB,빅데이터기초과정 오라클자바…12-191868
44 [평일주간야간, 주말]웹퍼블리싱 마스터(HTML5,CSS3,jQUERY,AJAX… 오라클자바…12-141838
43 [채용확정무료교육]오라클자바개발잘하는신입뽑기2개월과정,교육… 오라클자바…12-111909
42 [평일주간]빅데이터하둡기초과정(BigData Hadoop) 오라클자바…12-091499
41 [평일야간]닷넷(C#,Network,ADO.NET,ASP.NET)마스터 오라클자바…12-011730
40 [기업100%환급]오라클&자바웹스프링신입과정3주(SQL,JAVA,JSP,Se… 오라클자바…12-011907
39 [평일야간,주말]SQL기초에서실무까지(SQL기초,PLSQL,힌트,튜닝) 오라클자바…12-011373

댓글 없음:

댓글 쓰기