2013-10-23 55 views
0

記錄在DB2中,TRUNCATE語句與聯機備份不兼容,因爲它在表上獲取Z鎖並阻止同時運行聯機備份。 當截斷嘗試獲取內部聯機備份對象上的共享鎖時,會發生鎖定等待。聯機備份阻止截斷表

由於這是在產品設計中,我將不得不尋求解決方法,所以這個線程不是解決方案,但爲什麼他們不能一起工作。我沒有找到一個合理的解釋,爲什麼db2有這樣的限制。

任何見解?

謝謝, 盧西亞諾莫雷拉

回答

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

  1. 刪除正在記錄操作,其中作爲截斷是使上容器級別的表爲空。 (日誌操作 - 。DML操作都記錄到日誌(重做日誌在Oracle中,事務日誌DB2等),它存儲在日誌提交或回滾操作)

這是最有趣的部分。截斷只是'忘記'表的內容,而刪除一行一行地刪除所有觸發器,響鈴和哨聲。因此,當您截斷所有閱讀遊標時將會失效。爲了防止這種愚蠢的東西,只有在沒有人嘗試訪問它時才能完全清空表格。在線備份顯然需要讀取表格。因此,不可能同時訪問同一個表。

+0

嗨,彼得,謝謝你的信息。我做了一篇文章的快速審查,並沒有指出我想要的方向。截斷表成功獲取表中的Z鎖,但被「內部在線備份」鎖阻止。 Z鎖總是試圖獲得該鎖嗎?這個問題的原因是嘗試探索爲什麼DB2以這種方式工作的一些細節。 –

+0

嗨,彼得,謝謝你關於Z鎖的細節。我不能同意更多,當備份試圖讀取一個處於截斷操作中間的對象時,它應該被阻塞。 我還是不同意DBMS實現阻塞截斷表直到備份結束,例如SQL Server允許這兩個操作發生。在我們的例子中,我得到了一個15TB的數據庫,每12個小時一個截斷錶針對一個包含500.000行的表發佈,根據計劃它將在截斷完成之前被封鎖幾個小時,生成一個鎖鏈。 –

+0

如果表中有500行,則可能是標準的刪除操作。不知道鎖定,但。順便說一句,如果你馬上就把這個例子放在問題中,它會有所幫助。有時候,人們會爲現實世界問題提出創造性的想法。 ......當我想到這個時候,爲什麼你在桌子上放了500.000行,在12小時後將它們扔掉? –