错误地,我使用dbaccess会话在informix中执行了此查询。
Delete from table #without where condition
意识到我的错误,我应该使用TRUNCATE
,我做了另一种愚蠢
我杀了dbaccess
会话。但该表是完全锁定的,我无法在该表上执行任何操作。
我可以采取哪些步骤来移除锁定和truncate
表格。
1) Restart Informix server
2) onmode -z <sessionid> # Does not work.
I see hell lot of sessions created for the delete query
还有其他简单方法可以解决此问题吗?
答案 0 :(得分:1)
假设您没有使用Informix SE ......
是否记录了数据库?如果是这样,您是否在显式(BEGIN WORK)事务中运行语句?
如果您有一个未记录的数据库,那么删除服务器的每一行都将消失。如果停止DELETE,则不会撤消部分完成的更改。使用未记录的数据库意味着您不希望保证语句级别恢复。
如果您有一个常规的已记录数据库且没有显式事务,那么在DB-Access会话终止后,该语句可能仍在运行。因为它作为单例语句运行,所以它将完成并提交。在它执行此操作之前,如果您强行关闭服务器,则快速恢复将回滚语句(事务)。鉴于我看到'5小时前',我担心你现在服用服务器的机会有限。
如果你有一个带有显式事务的记录数据库,或者一个MODE ANSI数据库(你总是在一个事务中),那么当DELETE语句完成时,服务器将等待COMMIT,意识到会话连接终止,并将回滚未提交的工作。
如果您有一个未记录的数据库,则只能恢复到上一个存档。由于它是未记录的,因此无法从逻辑日志中恢复(但是记录的同一实例中的其他数据库可以恢复到最后一个逻辑日志)。
如果您有一个已记录的数据库,并且可以在DELETE语句完成之前关闭服务器 - 最好是在控制之下,但在必要时将其崩溃 - 那么快速恢复将处理该问题。
如果DELETE已完成并已提交且您有良好的备份,则可以考虑对数据库进行时间点还原。当你这样做时它将使它脱机(但如果表中的数据全部缺失,那么你的数据库暂时不会起作用)。
如果这些方案都不适用,那么您应该联系IBM技术支持,他们可能会执行轻微(而不是那么小)的奇迹。
但是,正如您可能已经注意到的那样,很大程度上取决于数据库的类型(未记录,记录,MODE ANSI)以及运行语句时是否存在显式事务。
DBMS的问题在于他们信任生物。如果您被授权进行手术,他们会认为您打算做您想做的事情,并且他们会继续并尽其所能。当你不要求它做你想要的事情时,生活变得棘手; DBMS仍然信任你并做你实际要求它做的事情。