据记载,在DB2中,TRUNCATE语句与在线备份不兼容,因为它在表上获得Z锁定并阻止在线备份同时运行。 当truncate尝试获取内部联机备份对象的共享锁时,会发生锁等待。
由于这是产品中的设计,我将不得不寻求解决方法,所以这个线程不是一个解决方案,而是为什么它们不能一起工作。我没有找到合理的解释为什么在db2中有这样的限制。
任何见解?
谢谢, 卢西亚诺莫雷拉
答案 0 :(得分:0)
来自http://www.ibm.com/developerworks/data/library/techarticle/dm-0501melnyk/
当表持有Z锁时,没有并发应用程序可以读取或 更新该表中的数据。
现在我们知道Z锁是对表的独占访问权限,拒绝对表的读写访问。
来自http://pic.dhe.ibm.com/infocenter/db2luw/v10r5/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0053474.html
独占访问:没有其他会话可以在表上打开游标,或者在表上保持锁定(SQLSTATE 25001)。
来自https://sites.google.com/site/umeshdanderdbms/difference-between-truncate-and-delete
- 删除是记录操作,其中Truncate使容器级别的表为空。 (记录操作 - DML操作记录到日志中(oracle中的重做日志,DB2中的事务日志等)。它存储在日志中以进行提交或回滚操作。)
醇>
这是最有趣的部分。截断只是'忘记'表的内容,而删除删除逐行处理所有触发器,铃声和口哨。因此,当您截断所有读取游标时将无效。为了防止像这样的愚蠢的东西你只能在没有人试图访问它时完全清空一个表。在线备份显然需要阅读表格。因此,不可能同时访问同一个表。