Oracle 이 XA 를 위한 구성이 되어있지 않을 경우 다음과 같은 오류가 발생할 수 있다.

error
WARN[12-11-09 16:09:38]-Error in recovery (com.atomikos.logging.Slf4jLogger.logWarning(Slf4jLogger.java:24))
javax.transaction.xa.XAException
    at oracle.jdbc.xa.OracleXAResource.recover(OracleXAResource.java:709)
    at com.atomikos.datasource.xa.XATransactionalResource.recover(XATransactionalResource.java:579)
    at com.atomikos.datasource.xa.XATransactionalResource.endRecovery(XATransactionalResource.java:669)
    at com.atomikos.icatch.imp.TransactionServiceImp.recover(TransactionServiceImp.java:604)
    at com.atomikos.datasource.xa.XATransactionalResource.setRecoveryService(XATransactionalResource.java:495)
    at com.atomikos.icatch.system.Configuration.installRecoveryService(Configuration.java:252)
    at com.atomikos.icatch.standalone.UserTransactionServiceImp.init(UserTransactionServiceImp.java:269)
    at com.atomikos.icatch.config.UserTransactionServiceImp.init(UserTransactionServiceImp.java:405)
    at com.atomikos.icatch.config.UserTransactionServiceImp.init(UserTransactionServiceImp.java:569)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1546)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1487)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1419)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:518)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:455)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:290)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:192)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:283)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:192)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
    at org.springframework.test.AbstractSingleSpringContextTests.createApplicationContext(AbstractSingleSpringContextTests.java:216)
    at org.springframework.test.AbstractSingleSpringContextTests.loadContextLocations(AbstractSingleSpringContextTests.java:192)
    at org.springframework.test.AbstractSingleSpringContextTests.loadContext(AbstractSingleSpringContextTests.java:172)
    at org.springframework.test.AbstractSpringContextTests.getContext(AbstractSpringContextTests.java:133)
    at org.springframework.test.AbstractSingleSpringContextTests.setUp(AbstractSingleSpringContextTests.java:101)
    at junit.framework.TestCase.runBare(TestCase.java:132)
    at org.springframework.test.ConditionalTestCase.runBare(ConditionalTestCase.java:79)
    at junit.framework.TestResult$1.protect(TestResult.java:110)
    at junit.framework.TestResult.runProtected(TestResult.java:128)
    at junit.framework.TestResult.run(TestResult.java:113)
    at junit.framework.TestCase.run(TestCase.java:124)
    at junit.framework.TestSuite.runTest(TestSuite.java:243)
    at junit.framework.TestSuite.run(TestSuite.java:238)
    at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
 WARN[12-11-09 16:09:38]-ERROR IN RECOVERY (com.atomikos.logging.Slf4jLogger.logWarning(Slf4jLogger.java:24))
com.atomikos.datasource.ResourceException: Error in recovery
    at com.atomikos.datasource.xa.XATransactionalResource.recover(XATransactionalResource.java:590)
    at com.atomikos.datasource.xa.XATransactionalResource.endRecovery(XATransactionalResource.java:669)
    at com.atomikos.icatch.imp.TransactionServiceImp.recover(TransactionServiceImp.java:604)
    at com.atomikos.datasource.xa.XATransactionalResource.setRecoveryService(XATransactionalResource.java:495)
    at com.atomikos.icatch.system.Configuration.installRecoveryService(Configuration.java:252)
    at com.atomikos.icatch.standalone.UserTransactionServiceImp.init(UserTransactionServiceImp.java:269)
    at com.atomikos.icatch.config.UserTransactionServiceImp.init(UserTransactionServiceImp.java:405)
    at com.atomikos.icatch.config.UserTransactionServiceImp.init(UserTransactionServiceImp.java:569)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1546)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1487)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1419)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:518)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:455)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:290)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:192)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:283)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:192)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
    at org.springframework.test.AbstractSingleSpringContextTests.createApplicationContext(AbstractSingleSpringContextTests.java:216)
    at org.springframework.test.AbstractSingleSpringContextTests.loadContextLocations(AbstractSingleSpringContextTests.java:192)
    at org.springframework.test.AbstractSingleSpringContextTests.loadContext(AbstractSingleSpringContextTests.java:172)
    at org.springframework.test.AbstractSpringContextTests.getContext(AbstractSpringContextTests.java:133)
    at org.springframework.test.AbstractSingleSpringContextTests.setUp(AbstractSingleSpringContextTests.java:101)
    at junit.framework.TestCase.runBare(TestCase.java:132)
    at org.springframework.test.ConditionalTestCase.runBare(ConditionalTestCase.java:79)
    at junit.framework.TestResult$1.protect(TestResult.java:110)
    at junit.framework.TestResult.runProtected(TestResult.java:128)
    at junit.framework.TestResult.run(TestResult.java:113)
    at junit.framework.TestCase.run(TestCase.java:124)
    at junit.framework.TestSuite.runTest(TestSuite.java:243)
    at junit.framework.TestSuite.run(TestSuite.java:238)
    at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

또한 오라클 최신 드라이버를 항상 사용할 것을 권장한다. (오라클 9에 접속할 때도 마찬가지)

pom.xml
<dependency>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc6</artifactId>
    <version>11.2.0.3</version>
</dependency>
...
<repositories>
    <repository>
      <id>codelds</id>
    </repository>
  </repositories>

 

그리고 XA 를 위한 오라클 설정은 다음과 같다.

grant.sql
grant select on sys.dba_pending_transactions to <user name>;
grant select on sys.pending_trans$ to <user name>;
grant select on sys.dba_2pc_pending to <user name>;
grant execute on sys.dbms_system to <user name>;

 

참조 문서

hibernate3:hbm2doc 를 실행하던 중

[org.hibernate.connection.DriverManagerConnectionProvider]
problem closing pooled connection java.sql.SQLException: Io exception: Socket closed


와 같은 오류가 났다.

하이버네이트 JIRA(http://opensource.atlassian.com/projects/hibernate/browse/HBX-948) 에 의하면 오라클 서버 버젼과 jdbc 버젼이 다를 경우에 저런 메세지가 떨어진다고 한다.


나의 경우는 오라클 11g 버젼을 사용하고 있었는데, 예전 버젼을 사용하고 있어서 그랬다.

<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc14</artifactId>
<version>10.2.0.3.0</version>
</dependency>


다음의 최신 버젼을 사용하면 문제가 해결된다.
다음 버젼은 JDK 1.5 이상에서만 동작하며, JDBC 3.0 과 Oracle 9, 10, 그리고 11 을 지원한다. 올레!

<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc5</artifactId>
<version>11.1.0.7.0</version>
</dependency>

expdp 나 impdp 툴을 이용해 pump 작업을 할 때 다음과 같은 오류가 발생할 경우

ORA-39002: invalid operation

ORA-39070: Unable to open the log file.

ORA-39087: directory name DATA_PUMP_DIR is invalid

 

오라클 디렉토리는 생성되었으나, 실제 물리적인 경로가 생성되지 않아서 그렇다.

즉, sqlplus 에서 

create directory oradir as 'd:\oradir'

라고  했다면, d:\oradir 디렉토리를 물리적으로 별도로 만들어줘야한다.

초기 설치시에 디렉토리 만드는걸 깜빡하곤 한다.  잘 해주자.

#사용자 삭제하기
SQL>drop user slothink cascade;

#사용자 생성하기
SQL>create user slothink identified by 1234 default tablespace SLOTHINK_TB temporar
y tablespace temp quota 100m on users;

#사용자에게 권한 할당하기
SQl>grant connect,resource to slothink;
10g 부터는 pump 기능이 제공된다.
기존까지 사용하던 exp, imp 는 클라이언트에서 실행하지만 pump 는 서버에서만 실행가능하다.

백업하기(expdp)
순서는 다음과 같다.
  1. expdp 실행을 위한 ORACLE_HOME 환경변수 설정(필요하다면)
  2. sysdba 권한으로 펌프할 디렉토리 생성하기
  3. 사용자에게 디렉토리에 대한 접근/작성 권한 할당하기
  4. pump export 하기
다음은 예제다. 진한 글씨를 임의의 설정에 맞추면 된다.

1. ORACLE_HOME 환경변수 설정

ORACLE_HOME 환경변수가 맞추어져있다면 다음 과정은 생략 가능하다. 다음은 AIX 의 경우 샘플이다.
$>export ORACLE_HOME=/app/oracle/product/102/db


관리자 계정으로 접속
SQL> conn /as sysdba
또는
$>sqlplus sys/11234@ORCL as sysdba

Connected.


2. pump 를 위한 directory 생성

SQL> create  directory pump_dir as '/tmp/backup/oracle';
Directory created.


3. pump 를 위한 권한 설정

SQL> grant read,write on directory pump_dir to slothink;

Grant succeeded.

SQL> exit

$ mkdir /tmp/backup/oracle

4. 펌프 export

$ expdp slothink/1234@ORCL directory=pump_dir dumpfile=exp.`date "+%Y-%m-%d"`.pump.dmp job_name=backup_job 


만약 하위버젼이나 특정버젼으로 import 를 시킬 계획이라면 버젼을 명시해줘야한다.
다음은 11g 에서 10g 버젼으로 export 하는 샘플이다.
$ expdp slothink/1234@ORCL directory=pump_dir dumpfile=exp.`date "+%Y-%m-%d"`.pump.dmp job_name=backup_job version=10.2.0.4

만약, 특정한 테이블을 export 시킬 계획이라면 테이블을 입력한다.
$ expdp slothink/1234@ORCL tables=MY_LOVE_SLOTHINK directory=pump_dir dumpfile=exp.`date "+%Y-%m-%d"`.pump.dmp job_name=backup_job version=10.2.0.4


5. 복구하기(impdp)

복구 과정 또한 1,2,3 과정을 거치는 것은 동일하다. 동일 머신에서 복구한다면 바로 impdp 를 사용해도 되겠지만, 다른 머신이라면 해당 머신에 맞는 디렉토리 생성이 필요하다.

$ impdp slothink/1234 directory=pump_dir dumpfile=exp.2009-11-04.dmp job_name=backup_job
머리가 나쁘긴 한가보다. 한번 경함한 에러가 아니었는데, 기억이 안나서 한동안 삽질 했다.
이제 별걸 다 기록해둬야겠다. 벌써 별게 아닌게 수두룩하긴 하다만;;

오래전에 가빈킹은 이런 경우 첨이라서 어쩌구 하는걸 구글링해서 봤다만, 만약 하이버네이트를 사용하고 오라클을 사용하고 있는데, 오류코드(ORA-01453:SET TRANSACTION 사용 시에는 트랜잭션의 최초문장 이어야 합니다) 가 나타났다면 다음 상황인지 아닌지 체크해볼만하다.

만하이버네이트는 ddl 자동 생성 기능이 있는데, 이걸 활성화시켰을 경우 ddl 코드 생성 후 트랜잭션을 시작하는 경우가 있다. 그러할 때에 이런 오류가 발생한다.

즉, 세션 팩토리 설정 중

<prop key="hibernate.hbm2ddl.auto">update</prop>

에서 update 를 validate 로 변경하면 문제없이 작동할 것이다. 하이버네이트가 좋긴 하다만, ddl 까지 맡기기엔 당신의 실력이 너무 좋지 않을까나? ^^

+ Recent posts