DB2不記錄事務日誌的操作

一些大表的插入更新刪除等操作,會佔用大量的活動日誌,如果用戶不希望對這些
操作不做日誌記錄可以使用activate not logged initially,
對於不記錄事務日誌的問題是:
1.db2的rollback和rollforward都依賴日誌,如果沒有記錄日誌,該事務如果rollback了(鎖超時,
  內存不足等),那麼會導致該表不可以訪問;
2.歸檔日誌模式下的數據庫的restore+rollforward,如果rollforward到不記錄日誌操作的
   時間點後,也會導致該表不可訪問,只能drop了重建,所以應當在這些不記日誌操作之後
   立刻對數據庫或表空間做一個備份。
DB2 load導入數據的操作也是不會通過事務日誌來記錄變化,所以load操作提供copy yes
和copy no的參數,no是load結束後要手動備份,yes是load的過程同時對數據做了一個備份。
db2  "load from tb1.del of del insert into tb2 copy yes to /db2cfg" 
db2 load query table tb2

1.事務中開啓不記錄日誌,事務rollback後,表不可訪問:
[test@demo db2cfg]$ db2 +c "alter table tb1 activate not logged initially"    ---->只在該事務中tb1不記錄日誌
DB20000I  The SQL command completed successfully.
[test@demo db2cfg]$ db2 +c  "insert into tb1 values(666,'yo666') "
DB20000I  The SQL command completed successfully.
[test@demo db2cfg]$ db2 rollback
DB20000I  The SQL command completed successfully.
[test@demo db2cfg]$ db2 "select * from tb1"
ID          NAME      
----------- ----------
SQL1477N  For table "TEST.TB1" an object "4" in table space "4" cannot be 
accessed.  SQLSTATE=55019

2.前滾到不記錄時間之後,表不可訪問,若在不記錄日誌操作後立即備份,便可解決問題
1>首先做一次全備
[test@demo db2cfg]$ db2 backup db testdb online
Backup successful. The timestamp for this backup image is : 20190108183351

2>執行一個事務不記錄日誌,後立刻對該表空間做了備份
[test@demo db2cfg]$ db2 +c "alter table tb1 activate not logged initially"
DB20000I  The SQL command completed successfully.
[test@demo db2cfg]$ db2 +c  "insert into tb1 values(666,'yo666') "
DB20000I  The SQL command completed successfully.
[test@demo db2cfg]$ db2 commit
DB20000I  The SQL command completed successfully.
[test@demo db2cfg]$ db2 "backup db testdb tablespace(ts2) online"
Backup successful. The timestamp for this backup image is : 20190108183712

3>往ts2表空間的tb1表和tb2表都再插入一些數據
[test@demo db2cfg]$ db2 "select * from tb1"
ID          NAME      
----------- ----------
          1 yo1       
          2 yo2       
          3 yo3       
        666 yo666     
  4 record(s) selected.

[test@demo db2cfg]$ db2 "select * from tb2"
ID          NAME      
----------- ----------
          1 yo1       
          2 yo2       
          3 yo3       
  3 record(s) selected.

db2 "insert into tb1 values(6,'yo6'),(66,'yo66')"
db2 "insert into tb2values(6,'yo6'),(66,'yo66')"

4>恢復數據庫並前滾至最新日誌狀態
db2 restore db testdb taken at 20190108183351
db2 rollforward db testdb to end of logs and complete 

[test@demo db2cfg]$ db2 "select * from tb2"  --->tb2表顯示是最新狀態
ID          NAME      
----------- ----------
          1 yo1       
          2 yo2       
          3 yo3       
          6 yo6       
         66 yo66      
  5 record(s) selected.

[test@demo db2cfg]$ db2 "select * from tb1" --->tb1表則不可用
ID          NAME      
----------- ----------
SQL1477N  For table "TEST.TB1" an object "4" in table space "4" cannot be 
accessed.  SQLSTATE=55019

5>使用不記錄日誌後的表空間備份再一次恢復
[test@demo db2cfg]$ db2 "restore db testdb tablespace(ts2) taken at 20190108183712"
DB20000I  The RESTORE DATABASE command completed successfully.
[test@demo db2cfg]$ db2 "rollforward db testdb to end of logs and complete tablespace(ts2)"
                                 Rollforward Status
 Input database alias                   = testdb
 Number of nodes have returned status   = 1
 Node number                            = 0
 Rollforward status                     = not pending
 Next log file to be read               =
 Log files processed                    =  -
 Last committed transaction             = 2019-01-08-10.45.13.000000 UTC
DB20000I  The ROLLFORWARD command completed successfully.

[test@demo db2cfg]$ db2 "select * from tb1"   ---->tb1和tb2都正常並前滾到最新狀態
ID          NAME      
----------- ----------
          1 yo1       
          2 yo2       
          3 yo3       
        666 yo666     
          6 yo6       
         66 yo66      
  6 record(s) selected.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章