1. 程式人生 > >修改系統時間導致DB2報錯SQL0903N,RC=2

修改系統時間導致DB2報錯SQL0903N,RC=2

問題描述

我的DB2多分割槽資料庫(DPF)環境,作業系統時間被意外/人工修改了,現在我修改回來之後,發現所有的更新操作都會失敗(insert/delete/update/import/create/load)報錯如下:
SQL0903N  COMMIT statement failed, transaction rolled back.  Reason code: "2".

SQLSTATE=40504

原因

在非分割槽的資料庫環境中,修改系統時間對DB2的影響很小,一般不用擔心,具體可以參考連結 Scenario: Changing the system clock

但在DPF環境下,有需要注意的地方。每個節點的DB2的
日誌控制檔案
都會記錄一個虛擬時間戳VTS(Virtual Timestamps), 該時間戳只允許往前走,不允許往後走(working as design),也就是說當系統時間跳至將來某個時間T1,VTS會跟著調至T1,這時候資料庫不會出現問題,但是當系統時間改回原來的正確時間,VTS不會跟著改回來。如果VTS和當前系統時間的差超過了MAX_TIME_DIFF,那就就會出現SQL0903N, Reason Code “2”的報錯,這是DB2的設計。
http://blog.csdn.net/qingsong3333/article/details/57082390

問題重現

DPF環境預設情況下,結論如下:

1. 時間往後修改一天,操作正常
2. 時間往後修改一天,再修改回來,操作報錯 SQL0903N RC=2
3. 時間往前修改一天,操作報錯 SQL0903N RC=2
4. 時間往前修改一天,再修改回來,操作正常

(“往後”在這裡指修改到將來的某個時間點,“往前”指修改到過去的某個時間點)

C:\windows\system32>db2 "insert into t1 values(100)"
DB20000I  The SQL command completed successfully.

C:\windows\system32>date
當前日期: 2017/05/27 週六
輸入新日期: (年月日) 2017/05/28

C:\windows\system32>db2 "insert into t1 values(528)" <-時間往後修改一天,操作正常
DB20000I  The SQL command completed successfully.

C:\windows\system32>date
當前日期: 2017/05/28 週日
輸入新日期: (年月日) 2017/05/27

C:\windows\system32>db2 "insert into t1 values(527)" <-時間往後修改一天,再修改回來,操作報錯 SQL0903N RC=2
DB21034E  The command was processed as an SQL statement because it was not a
valid Command Line Processor command.  During SQL processing it returned:
SQL0903N  COMMIT statement failed, transaction rolled back.  Reason code: "2".
SQLSTATE=40504

=================換另外一個數據庫=============

C:\windows\system32>db2 "insert into t1 values(100)"
DB20000I  The SQL command completed successfully.

C:\windows\system32>date
當前日期: 2017/05/27 週六
輸入新日期: (年月日) 2017/05/26

C:\windows\system32>db2 "insert into t1 values(100)" <-時間往前修改一天,操作報錯 SQL0903N RC=2
DB21034E  The command was processed as an SQL statement because it was not a
valid Command Line Processor command.  During SQL processing it returned:
SQL0903N  COMMIT statement failed, transaction rolled back.  Reason code: "2".
SQLSTATE=40504

C:\windows\system32>date
當前日期: 2017/05/26 週五
輸入新日期: (年月日) 2017/05/27

C:\windows\system32>db2 "insert into t1 values(100)" <-時間往前修改一天,再修改回來,操作正常
DB20000I  The SQL command completed successfully.

注意:上面的問題在單分割槽的環境下是不會出現的,在多分割槽環境下會出現,即使這個多分割槽環境只有一個物理節點。

解決辦法

1. 如果VTS和當前系統時間差小於24小時,可以修改例項配置引數MAX_TIME_DIFF並重啟例項(可以等到VTS和系統時間一致時,再修改回來),修改之後的值超過時間差即可,最大值是24小時。

2.如果時間差超過24小時,可以考慮以下方案:
--重建資料庫
--什麼也不做,等實際時間追上VTS,但這段時間內不能做更新操作
--把日誌控制檔案發給IBM售後技術支援,讓他們幫忙修改一下VTS,不過做完之後需要對資料庫做一個全庫離線備份。

參考資料

SQL0903N Reason code: "2" returned, when running a query on a partitioned database environment

Synchronizing clocks in a partitioned database environment

Scenario: Changing the system clock