MySQL 에서 Select 질의시에는 잘 읽어들이나, inser, update 시에는 깨질 경우이다.

MySQL 서버 설정에 다음과 같은 설정이 필요하다.


#/etc/my.cnf

[mysqld]
...
default-character-set=utf8
default-collation=utf8_general_ci
...


물론 UTF-8 관련 설정들도 빠짐없는지 확인해야했음은 물론이다. :)

  • Databse, Table 의 캐릭터셋
  • HttpServletRequest 의 인코딩
  • Java 런타임시 -Dfile.encoding=UTF-8 (이사항은 DB 랑은 직접적인 연관은 없다)

참조 : http://mathiasrichter.blogspot.kr/2009/10/character-encoding-utf-8-with.html

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
로그인
mysql -u[id] -p

새로운 계정 추가하기
GRANT ALL PRIVILEGES ON *.* TO '[NEW ID]'@'[HOST]' IDENTIFIED BY '[PASSWORD]' WITH GRANT OPTION;

[HOST] : 모든 호스트에서 가능케 하려면 '%' 를 입력한다

데이타베이스 생성하기
CREATE DATABASE [DB NAME] DEFAULT CHARACTER SET euckr COLLATE euckr_korean_ci;

CREATE DATABASE [DB NAME] DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

백업하기
mysqldump -u [DB사용자] -p [패스워드] [백업할 데이터베이스 이름] > [파일이름]

복구하기
mysql -u [DB사용자] -p [패스워드] [복구할 데이터베이스 이름] < [파일이름]

출처 : http://wiki.javajigi.net/pages/viewpage.action?pageId=577

Added by 박재성, last edited by 박재성 on 12월 06, 2006  


비밀번호 변경하기

비밀번호를 변경하고자하는 계정으로 로그인한다. Prompt상태에서 다음 Command를 실행하여 비밀번호를 변경한다.

set password = password("yournewpassword");

새로운 계정 추가하기

GRANT를 이용하여 새로운 계정 추가하기

GRANT ALL PRIVILEGES ON *.* TO 'javajigi'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;

GRANT를 이용하여 쉽게 계정을 추가할 수 있다. 위와 같이 계정을 추가할 경우 'javajigi'라는 아이디에 'password'라는 비밀번호를 가지는 계정이 추가된다. 그러나 이 계정은 단지 local host에서 밖에 연결이 되지 않는다.

GRANT ALL PRIVILEGES ON *.* TO 'javajigi'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;

위와 같이 'javajigi'@'%'으로 계정을 추가할 경우 Remote에서도 접근하는 것이 가능하게 된다.

참고 문서

MySQL에 Character Set 설정하기

현재 MySQL은 무수히 많은 Character Set을 지원하고 있다. MySQL이 지원하고 있는 Character Set을 보고 싶다면 다음 SQL을 이용하면 된다.

SHOW CHARACTER SET;

MySQL 서버의 Default Character Set을 지정하기 위해서는 서버를 시작할 때 다음과 같이 실행하면 된다.

mysqld --default-character-set=euckr --default-collation=euckr_korean_ci

데이터베이스를 생성할 때도 데이터베이스마다 각각의 Character Set을 지정하는 것이 가능하다.

CREATE DATABASE db_name DEFAULT CHARACTER SET euckr COLLATE euckr_korean_ci;

사용하고 있는 데이터베이스의 Default Character Set을 다음의 쿼리를 통하여 확인할 수 있다.

SHOW VARIABLES LIKE 'character_set%';

또한 테이블마다 Character Set을 지정하는 것이 가능하다.

CREATE TABLE user ( ... )
DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

서버와 클라이언트의 Default Character Set을 변경하고자 한다면..(Windows 시스템에서)
MYSQL_HOME/my.ini 파일을 열어 클라이언트와 서버 사이트의 default-character-set을 변경해 주면 된다. 만약 한글만 사용할 경우라면 euckr을 사용하면 된다.

Character Set의 환경을 변경하고자 한다면..

SET character_set_client = euckr;

SET character_set_results = utf8;

참고문서

MySQL 백업 및 복구하기

MySQL 백업

MySQL을 백업하기 위해서는 mysqldump를 이용하는 것이 가장 쉽다. mysqldump을 사용하는 문법은 다음과 같다.

mysqldump -u [username] -p [password] [databasename] > [backupfile.sql]

특정 Encoding으로 백업하고자 할 경우

mysqldump --default-character-set=euckr -u [username] -p [password] [databasename] > [backupfile.sql]

MySQL 복구

mysql - u sadmin -p pass21 Customers < custback.sql
mysqlimport -u sadmin -p pass21 Customers custback.sql

참고문서

+ Recent posts