环境:
h2数据库版本:h2-1.4.200.jar(使用的是h2数据库服务器类型)
注:h2数据库支持两种类型1.嵌入式的内存数据库约等于redis 2.服务器模式约等于mysql oracle
损坏原因:
服务器直接关机,没有关闭h2服务
异常信息:
java.lang.IllegalStateException: File corrupted in chunk 1546880 not found [1.4.200/9] [50000-200] HY000/50000
(看提示内容应该是数据库文件某个块损坏了)
修复方案:
1.针对一般损坏,官方提供的Recover恢复工具(将损坏的数据库文件导出成.sql文件,将sql信息重新导入到新的数据库文件中)
1.1 运行Recover命令-生成.sql文件
java -cp h2-1.4.200.jar org.h2.tools.Recover -dir /usr/local/h2 -db dbfile -trace -transactionLog
#/usr/local/h2 为数据库文件所在的当前目录
#dbfile 为数据文件名如 dbfile.mv.db
#transactionLog 为打印具体输出
1.2运行RunScript进行数据库sql导入
java -cp h2-1.4.200.jar org.h2.tools.RunScript -url jdbc:h2:/usr/local/h2/ngg -user aaa -password bbb -script dbfile.h2.sql -continueOnError
# jdbc:h2:/usr/local/h2/ngg 为新数据库具体路径 ngg为新数据库名称
# aaa 新数据库用户名
# bbb 新数据库密码
# 1.1运行完生成的dbfile.h2.sql文件
# continueOnError 如果出现报错可以继续往下执行,根据个人情况判断是否添加
结果:按照官方给出的命令确实生成了.sql文件并且成功导入了,但是新数据库中并没有数据库。
后来结合相关资料,用之前版本的h2-1.4.194.jar恢复成功,大小会比修复的数据库要大。
后经测试用h2-1.4.196.jar h2-1.4.197.jar也可以修复但是运行起来后数据库文件会忽大忽小。所以最终还是选用了h2-1.4.194.jar。
(上述方案只是针对一般情况的数据库损坏,如果跟标题一样的check元数据损坏目前只能通过修改h2-1.4.194.jar源码下的Recover方法对损坏的数据库块进行跳过,需要修改源码,并要承担数据库数据丢失的风险。后续源码正在整理)
jar文件:
194:https://download.youkuaiyun.com/download/qq_33416416/91315784
197:https://download.youkuaiyun.com/download/qq_33416416/91315785?spm=1001.2014.3001.5503
200:https://download.youkuaiyun.com/download/qq_33416416/91315791
1613

被折叠的 条评论
为什么被折叠?



