【问题标题】:Derby Database error not writing to databaseDerby 数据库错误未写入数据库
【发布时间】:2019-04-19 19:30:03
【问题描述】:

不知道为什么,但最近一台运行 derby 数据库 3 年左右的机器停止运行它运行我们编写的软件并使用 derby 数据库。该软件导入图像并将位置写入 derby 数据库。 derby 数据库上似乎有足够的空间,但不确定数据库是否已损坏或为什么它不再写入。以下是一些错误日志:

 9-Apr-2019 19:29:43,575  ERROR 574f7773-98c0-43cd-9550-f41eb34951ab-SIMP StorageResourceDefaultImpl:190 - Error rollbacking transaction for the file: ..\image_storage\image_374\SL000ED88_1556785502569.bif
org.apache.commons.transaction.file.ResourceManagerSystemException: 16a36a59978-2962: Database is set to dirty, this *may* mean it is corrupt. No modifications are allowed until a recovery run has been performed! (ERR_SYSTEM)
at org.apache.commons.transaction.file.FileResourceManager.txInitialSaneCheckForWriting(FileResourceManager.java:996)
at org.apache.commons.transaction.file.FileResourceManager.rollbackTransaction(FileResourceManager.java:615)
at com.bioimagene.iii.ims.service.storage.impl.StorageResourceDefaultImpl.rollback(StorageResourceDefaultImpl.java:187)
at com.bioimagene.iii.ims.service.storage.impl.StorageResourceDefaultImpl.<init>(StorageResourceDefaultImpl.java:103)
at com.bioimagene.iii.ims.service.storage.impl.StorageServiceDefaultImpl.createStorageResource(StorageServiceDefaultImpl.java:59)
at sun.reflect.GeneratedMethodAccessor183.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:196)
at $Proxy64.createStorageResource(Unknown Source)
at com.bioimagene.iii.ims.server.impl.SaveImageRequestProcessorDelegateBase.processSaveImage(SaveImageRequestProcessorDelegateBase.java:115)
at com.bioimagene.iii.ims.server.impl.SaveImageRequestProcessorDelegateBase.processSaveImageRequest(SaveImageRequestProcessorDelegateBase.java:87)
at com.bioimagene.iii.ims.server.impl.SaveLocalImageRequestProcessorDelegate.processSaveLocalImageRequest(SaveLocalImageRequestProcessorDelegate.java:37)
at com.bioimagene.iii.ims.server.impl.ImsServerJbossRemotingImpl.processSaveLocalImageRequest(ImsServerJbossRemotingImpl.java:622)
at sun.reflect.GeneratedMethodAccessor182.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:196)
at $Proxy69.processSaveLocalImageRequest(Unknown Source)
at com.bioimagene.iii.ims.command.impl.SaveLocalImageRequestHandlerCommand.execute(SaveLocalImageRequestHandlerCommand.java:26)
at com.bioimagene.iii.ims.server.impl.DefaultImsClientRequestHandlerImpl.invoke(DefaultImsClientRequestHandlerImpl.java:89)
at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:908)
at org.jboss.remoting.transport.socket.ServerThread.completeInvocation(ServerThread.java:742)
at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:695)
at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:522)
at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:230)
19-Apr-2019 19:29:43,591  ERROR 574f7773-98c0-43cd-9550-f41eb34951ab-SIMP StorageResourceDefaultImpl:121 - Error starting storage transaction [id: 16a36a59978-2962] for the folder: image_storage\image_374
com.bioimagene.iii.ims.commons.exception.ImsStorageRollbackException: Error rollbacking transaction for the file: 

有谁知道如何解决这个问题并停止出现这个错误?谢谢

【问题讨论】:

  • 有 derby.log 吗?有更多信息吗?
  • @BryanPendleton 我知道您在谈论哪个 derby.log,但我似乎不知道它的确切位置,因为我正在运行的应用程序中嵌入了 derby。不过我可以试着四处看看,让你知道。
  • @BryanPendleton 在 2019 年 4 月 15 日星期一 23:00:37 CEST 线程[DRDAConnThread_901,5,derby.daemons] 开始清理操作 java.sql.SQLException:找不到数据库“DB2”。在 org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source)
  • 在您上面包含的异常详细信息中,没有这些消息来自 Derby。 Derby 消息将来自 org.apache.derby.* 类。我认为您需要从了解 org.apache.commons.transaction.* 类的 Apache Commons 专家那里获得帮助。

标签: sql database derby


【解决方案1】:

您提供的日志错误:

... Database is set to dirty, this *may* mean it is corrupt. No modifications are allowed until a recovery run has been performed! (ERR_SYSTEM)

表明数据库处于不一致状态(例如,数据库未完全关闭,或系统崩溃,或由于操作系统磁盘同步或 IO 问题而损坏,突然断电,计划外自动强制 Windows更新重启等)。

尝试通过对受影响(或所有)数据库执行受控启动、关闭和重新启动(即重新启动)来执行崩溃恢复:

如果您在客户端-服务器模式下运行,那么:

ij> /* Startup */
ij> connect 'jdbc:derby://localhost:1527/sample';
ij> 
ij> /* Shutdown */
ij> connect 'jdbc:derby://localhost:1527/;shutdown=true';
ERROR XJ015: DERBY SQL error: ERRORCODE: 50000, SQLSTATE: XJ015, SQLERRMC: Derby system shutdown.
ij> quit;

PS C:\db-derby-10.13.1.1-bin\bin> ### Shutdown Network Server ###
PS C:\db-derby-10.13.1.1-bin\bin> .\NetworkServerControl shutdown
Mon Apr 22 03:14:46 AEST 2019 : Apache Derby Network Server - 10.13.1.1 - (1765088) shutdown
PS C:\db-derby-10.13.1.1-bin\bin>

(如果您在嵌入式模式下运行,那么您需要为每个数据库执行一个ij 关闭连接字符串(例如connect 'jdbc:derby:c:\derby\databases\sample;shutdown=true';)。请参阅“Derby Developer's”中的“数据库连接示例”部分指南”,了解有关嵌入式模式的所有连接字符串样式的信息)。

然后启动 Derby 和/或您的应用程序。

(通过执行受控启动(即启动、关闭和重新启动),在重新启动步骤中,Derby 尝试检测任何可能发生的数据库不一致(由于系统崩溃等原因)。它将尝试使用活动日志将任何不良事务前滚(或回滚)到最后一次已知的良好提交。这是防止数据损坏的第一道防线之一。但是,崩溃恢复有限制,例如,如果您的数据库文件损坏或部分不一致的数据太旧了,超出了活动日志中保存的数据,那么您可能需要从良好的备份中恢复数据库。有关恢复如何工作的更多详细信息,请参阅“Derby 开发人员指南”):

引导数据库

Derby 的默认配置是启动(或 启动)当应用程序第一次连接到数据库时。 当 Derby 引导数据库时,它会检查是否需要恢复 在数据库上运行,因此在某些不寻常的情况下,启动可能需要一些时间 时间。您还可以将系统配置为自动启动所有 系统启动时的数据库;参见“derby.system.bootAll” 在 Derby 参考手册中。

...

存储和恢复

如果系统或操作系统出现意外故障,下次 Derby 时 启动它可以使用日志执行恢复,恢复 从日志中“丢失”事务并回滚未提交的事务 交易。恢复确保所有提交的事务在 系统失败的时间被应用到数据库中,并且所有 活动的事务被回滚。因此数据库是 保持一致、有效的状态。

然后尝试检查表的一致性:

ij>
SELECT schemaname, tablename,
SYSCS_UTIL.SYSCS_CHECK_TABLE(schemaname, tablename)
FROM sys.sysschemas s, sys.systables t
WHERE s.schemaid = t.schemaid;
...
...
...
SYS
   |SYSVIEWS
       |1

31 rows selected
ij>

在最坏的情况下,您可能需要从备份中恢复。

如果您已打开联机日志存档,则可以执行前滚恢复。

(有关 SYSCS_CHECK_TABLE 函数、备份和恢复以及日志归档以及前滚恢复的详细信息,请参阅“Derby 管理指南”的“维护数据库完整性”部分)。

【讨论】:

  • 所以在我关闭它之后再执行这个来启动它? ij> /* 启动 */ ij> connect 'jdbc:derby://localhost:1527/sample';
  • @JCLopez - 是的。尝试通过启动 ij 彻底关闭它,然后输入 connect 'jdbc:derby://&lt;server&gt;:&lt;port&gt;/&lt;database&gt;;shutdown=true';。首先停止您的应用程序可能是个好主意(这样您就可以隔离数据库并在它不处理任何内容时在其上使用 ij)。启动:connect 'jdbc:derby://&lt;server&gt;:&lt;port&gt;/&lt;database&gt;';。如果您的应用程序停止了 Derby 网络服务器,则连接字符串略有不同 - 尝试使用嵌入式模式 URL(即connect 'jdbc:derby:&lt;fullpath_to_database_directory&gt;;shutdown=true';)。然后同样尝试再次启动它。
  • 我认为该应用程序确实会停止 derby 数据库,因为我已尝试连接到它,如果应用程序停止,它将无法连接。但是会在应用程序关闭时尝试连接到它,希望它可以连接。
  • @JCLopez - 您无需运行应用程序即可连接到数据库。只需在ij 连接字符串中指定嵌入式协议(例如connect 'jdbc:derby:c:\myapp\mydatabase';)。这要求您知道数据库在磁盘上的存储位置(在“derby.log”中搜索“Booting Derby version ... on database directory”以找到它)。
  • 在 derby.log 2019 年 4 月 15 日星期一 23:00:37 CEST 线程[DRDAConnThread_901,5,derby.daemons] 开始清理操作 java.sql.SQLException:找不到数据库“DB2” .在 org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source)
猜你喜欢
  • 1970-01-01
  • 2012-09-21
  • 2012-02-04
  • 2015-07-11
  • 1970-01-01
  • 2018-05-23
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
相关资源
最近更新 更多