증상발견

스키마를 정의하는 sql 을 작성하던 중에 테이블 생성 중에 다음과 같은 메시지와 함께 테이블 생성이 중단되는 문제가 발생했다.

... 로그 생략 ...
Error Code: 1071. Specified key was too long; max key length is 3072 bytes

발생원인

해결방안

  • 사용하고 있는 mysql 엔진의 종류에 따라 제한된 크기 이내로 컬럼의 크기를 조정해야 한다.



오라클 PL/SQL 입문: http://www.yes24.com/24/goods/23566371?scode=032&OzSrank=1

이건 베타리딩한책

오라클을 사용하지 않은지... PL/SQL을 사용하지 않은지 오래되었지만

어쨌든, 책 내용은 좋음


네트워크 더 쉽게, 더 깊게: http://www.yes24.com/24/goods/14963920?scode=032&OzSrank=1

이건 베타리딩 후 받은 책



1. 발생증상

IO Exception: "java.io.IOException: Block not found in id [1, -13, 23, -57, 1] [1.4.188/50]"; "lob: null table: -3 id: 5868" [90031-188] 90031/90031 (Help)
org.h2.jdbc.JdbcSQLException: IO Exception: "java.io.IOException: Block not found in id [1, -13, 23, -57, 1] [1.4.188/50]"; "lob: null table: -3 id: 5868" [90031-188]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
    at org.h2.message.DbException.get(DbException.java:168)
    at org.h2.message.DbException.convertIOException(DbException.java:330)
    at org.h2.value.ValueLobDb.getString(ValueLobDb.java:306)
    at org.h2.jdbc.JdbcResultSet.getString(JdbcResultSet.java:285)
    at org.h2.server.web.WebApp.escapeData(WebApp.java:1773)
    at org.h2.server.web.WebApp.getResultSet(WebApp.java:1686)
    at org.h2.server.web.WebApp.getResult(WebApp.java:1405)
    at org.h2.server.web.WebApp.query(WebApp.java:1061)
    at org.h2.server.web.WebApp.query(WebApp.java:1037)
    at org.h2.server.web.WebApp.process(WebApp.java:223)
    at org.h2.server.web.WebApp.processRequest(WebApp.java:170)
    at org.h2.server.web.WebServlet.doGet(WebServlet.java:125)
    at org.h2.server.web.WebServlet.doPost(WebServlet.java:162)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:808)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1669)
    at org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter.doFilter(WebSocketUpgradeFilter.java:224)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)
    at org.springframework.boot.actuate.autoconfigure.EndpointWebMvcAutoConfiguration$ApplicationContextHeaderFilter.doFilterInternal(EndpointWebMvcAutoConfiguration.java:295)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118)
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:154)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:150)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:199)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:57)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)
    at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:102)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)
    at org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:69)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:585)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:577)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
    at org.eclipse.jetty.server.Server.handle(Server.java:499)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:310)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257)
    at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.io.IOException: Block not found in id [1, -13, 23, -57, 1] [1.4.188/50]
    at org.h2.mvstore.StreamStore$Stream.read(StreamStore.java:466)
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
    at java.io.InputStreamReader.read(InputStreamReader.java:184)
    at java.io.BufferedReader.fill(BufferedReader.java:154)
    at java.io.BufferedReader.read1(BufferedReader.java:205)
    at java.io.BufferedReader.read(BufferedReader.java:279)
    at org.h2.util.IOUtils.copyAndCloseInput(IOUtils.java:200)
    at org.h2.util.IOUtils.readStringAndClose(IOUtils.java:307)
    at org.h2.value.ValueLobDb.getString(ValueLobDb.java:296)
    ... 79 more
Caused by: java.lang.IllegalStateException: Block 199 not found [1.4.188/50]
    at org.h2.mvstore.DataUtils.newIllegalStateException(DataUtils.java:773)
    at org.h2.mvstore.StreamStore.getBlock(StreamStore.java:388)
    at org.h2.mvstore.StreamStore$Stream.nextBuffer(StreamStore.java:503)
    at org.h2.mvstore.StreamStore$Stream.read(StreamStore.java:460)
    ... 89 more

2. 설정

  • 현재 H2Database 옵션은 다음과 같다.

jdbc:h2:file:~/.h2database/db;CACHE_SIZE=10240;DB_CLOSE_DELAY=-1;AUTO_SERVER=TRUE;DB_CLOSE_ON_EXIT=FALSE;MVCC=TRUE;LOCK_TIMEOUT=15000;

인터넷을 찾아보면 MVCC=TRUE 옵션을 사용하지 말라는 이야기가 있지만, 현재 사용하고 있는 Qaurtz Scheduler DBStore 옵션에서는 MVCC=TRUE 옵션을 권장하고 있기에 문제를 찾기 위한 방법을 모색했다.

3. 해결방법

h2database의 lob으로 설정한 컬럼을 null로 저장되지 않도록 처리했다.

이후 추이를 지켜보도록 한다.


현재 개발중인 프로젝트는 SpringBoot를 사용하여 Jetty를 내장형 웹컨테이너로 사용하고 데이터베이스는 H2Database를 사용하고 있다.
H2Database를 파일DB형식으로 사용하도록 정의했다.

spring:
  datasource:
    initialize: false
    driverClassName: org.h2.Driver
    url: jdbc:h2:file:./h2database
    username: sa
    password:

웹애플리케이션을 실행하면 기본설정에 의해서 DB가 잠기게 된다.
그런데 입력된 데이터를 보겠다고 h2console을 실행하면, 웹애플리케이션에 의해 잠긴 DB는 완전히 잠기면서 더이상이 데이터입력이 되지 않는다.
이게 이상하다고 해서…
H2Database를 Server 모드로 실행하도록 했다.

spring:
  datasource:
    initialize: false
    driverClassName: org.h2.Driver
    url: jdbc:h2:file:./h2database;AUTO_SERVER=TRUE
    username: sa
    password:

와 같이 변경했다.
굳이 h2console을 실행하지 않고 이클립스에서 찾는 방법도 확인했다. 외부에서 연결할 떄는 외부연결에 의해서 파일이 잠기지 않도록

url: jdbc:h2:file:./h2database;FILE_LOCK=NO

과 같이 설정하기 바란다.

참고문헌


회사에서 업무를 위해 DB에 저장하는 기초데이터 중 우편번호와 관련된 데이터는 빅데이터가 아닐까? 입려된 데이터의 건수로는 대략 6백7만건에 달하는 양이라서, insert 쿼리의 용량만 2기가에 달하는 녀석이기도 하다. 그래서 몇일간 데이터를 넣고 빼고하면서 

조금 더 빠르게 넣을 수 있는 방법이 없을까?

하고 고민을 하다가 mysql big data fast import 의 키워드로 검색을 하다보니 mysqldump로 하는 게 좋다는 이야기가 나오고 있어서 한번 찾아봤다.

찾아서 해보니... 600만건의 자료를 추출하는데 대략 10분, 넣는데 6분 정도의 시간이 소요되었다. 오홍... +_+)


참고사이트 : http://www.abbeyworkshop.com/howto/lamp/MySQL_Export_Backup/index.html

  • export 하기 : mysqldump 를 이용한 예

    • 데이터베이스 전체를 추출하는 경우
      mysqldump guestdb > guestdb.txt
    • 특정 테이블만 추출하는 경우
      mysqldump guestdb guestTbl > guestdb.txt
    • 특정 테이블에 대한 drop sql 을 추가하려는 경우
      mysqldump -p –user=username –add-drop-table guestdb guestTbl > guestTbl.txt
      Enter password: ********
  • import 하기

    • 데이터베이스 전체를 추출한 경우
      $ mysql -u username -p < guestdb.txt’
    • 특정데이터베이스의 테이블만 추출한 경우
      $ mysql -u username -p –database=guestdb < guestTbl.txt


+ Recent posts