2017-01-27 1 views
0

우리의 Perfino 서버가 최근에 추락했습니다. 그 이후로 다음 오류가 기록되었습니다. (OutOfMemory에 힌트를주는 단서가있어 손상된 DB가됩니다.)"복구 도구"를 사용하여 perfino h2 데이터베이스를 복구하는 방법은 무엇입니까?

'가능한 해결책 : 복구 도구'을 사용하는 것이 좋습니다. 그러나 공식 perfino 문서 나 로그는 진행 방법에 대한 자세한 지침을 제공하지 않습니다.

여기에서 질문 : 복구 도구 사용 방법은 무엇입니까?

스택 트레이스 :

ERROR [collector] server: could not load transaction data 
org.h2.jdbc.JdbcSQLException: File corrupted while reading record: "[495834] stream data key:64898 pos:11 remaining:0". Possible solution: use the recovery tool; SQL statement: 
SELECT value FROM transaction_names WHERE id=? [90030-176] 
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:344) 
    at org.h2.message.DbException.get(DbException.java:178) 
    at org.h2.message.DbException.get(DbException.java:154) 
    at org.h2.index.PageDataIndex.getPage(PageDataIndex.java:242) 
    at org.h2.index.PageDataNode.getNextPage(PageDataNode.java:233) 
    at org.h2.index.PageDataLeaf.getNextPage(PageDataLeaf.java:400) 
    at org.h2.index.PageDataCursor.nextRow(PageDataCursor.java:95) 
    at org.h2.index.PageDataCursor.next(PageDataCursor.java:53) 
    at org.h2.index.IndexCursor.next(IndexCursor.java:278) 
    at org.h2.table.TableFilter.next(TableFilter.java:361) 
    at org.h2.command.dml.Select.queryFlat(Select.java:533) 
    at org.h2.command.dml.Select.queryWithoutCache(Select.java:646) 
    at org.h2.command.dml.Query.query(Query.java:323) 
    at org.h2.command.dml.Query.query(Query.java:291) 
    at org.h2.command.dml.Query.query(Query.java:37) 
    at org.h2.command.CommandContainer.query(CommandContainer.java:91) 
    at org.h2.command.Command.executeQuery(Command.java:197) 
    at org.h2.jdbc.JdbcPreparedStatement.executeQuery(JdbcPreparedStatement.java:109) 
    at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:353) 
    at com.perfino.a.f.b.a.a(ejt:70) 
    at com.perfino.a.f.o.a(ejt:880) 
    at com.perfino.a.f.o.a(ejt:928) 
    at com.perfino.a.f.o.a(ejt:60) 
    at com.perfino.a.f.aa.a(ejt:783) 
    at com.perfino.a.f.o.a(ejt:847) 
    at com.perfino.a.f.o.a(ejt:792) 
    at com.perfino.a.f.o.a(ejt:787) 
    at com.perfino.a.f.o.a(ejt:60) 
    at com.perfino.a.f.ac.a(ejt:1011) 
    at com.perfino.b.a.b(ejt:68) 
    at com.perfino.b.a.c(ejt:82) 
    at com.perfino.a.f.o.a(ejt:1006) 
    at com.perfino.a.i.b.d.a(ejt:168) 
    at com.perfino.a.i.b.d.b(ejt:155) 
    at com.perfino.a.i.b.d.b(ejt:52) 
    at com.perfino.a.i.b.d.a(ejt:45) 
    at com.perfino.a.i.a.b.a(ejt:94) 
    at com.perfino.a.c.a.b(ejt:105) 
    at com.perfino.a.c.a.a(ejt:37) 
    at com.perfino.a.c.c.run(ejt:57) 
    at java.lang.Thread.run(Thread.java:745) 

답변

1

주의 사항 : I는 아래에 설명 된 절차에 내 데이터베이스를 복구 할 수 있습니다. 성공적인 복구의 가능성은 데이터베이스의 손상 정도에 따라 달라 지므로이 게시물을 참조로 보관하고 있으며이 절차가 유효하지 않다는 증거는 없습니다.


는 Perfino는 영속 저장 기본적 H2 Database Engine하여 사용한다. H2는 SQL 문을 가져올 recovery toolrun script tool 있습니다

# 1. Create a dump of the current database using the tool [1] 
# This tool creates a 'config.h2.sql' and a 'perfino.h2.sql' db dump 
cd ${PERFINO_DATA_DIR} 
java -cp ${PATH_TO_H2_LIB}/h2*.jar org.h2.tools.Recover 

# 2. Rename the corrupt database file to e.g. *bkp 
mv perfino.h2.db perfino.h2.db.bkp 

# 3. Import the dump from step 1, ignoring errors 
java -cp ${PATH_TO_H2_LIB}/h2*.jar \ 
    org.h2.tools.RunScript \ 
    -url jdbc:h2:${PERFINO_DATA_DIR}/db/perfino \ 
    -script perfino.h2.sql -checkResults 

[1]은 Perfino ${PERFINO_INSTALL_DIR}/lib/common/h2.jar 아래 h2.jar 버전을 포함한다. 물론 official jar을 다운로드하여 사용해 볼 수도 있지만 제 경우에는 perfino와 함께 제공되는 jar 파일 만 사용하여 데이터베이스를 복원 할 수 있습니다.


이는

Exception in thread "main" org.h2.jdbc.JdbcSQLException: Feature not supported: "Restore page store recovery SQL script can only be restored to a PageStore file" 나를 실패했습니다. 이 당신에게 발생하면

, 시도 :

# 1. Delete database and mv files 
cd ${PERFINO_DATA_DIR} 
rm perfino.h2.db perfino.mv.db 

# 2. Create a PageStore database manually 
touch perfino.h2.db 

# 3. try with MV_STORE=FALSE on the url [2] 
java -cp ${PATH_TO_H2_LIB}/h2*.jar \ 
    org.h2.tools.RunScript \ 
    -url jdbc:h2:${PERFINO_DATA_DIR}/db/perfino;MV_STORE=FALSE \ 
    -checkResults \ 
    -continueOnError 

[2] : 힘 H2 대신 새로운 스토리지 엔진의 pagestore의 DB를 다시

( this thread in metabase 참조)
관련 문제