[DB2]線上備份資料庫與表空間

zad800發表於2010-08-05

         線上備份資料庫和線上備份表空間,應該是大多數生產環境下使用的備份方式。其最大的優點是,能夠在不斷開使用者連線的情況下,對資料進行備份。

         在還原的時候,若是針對資料庫級的還原,則需要斷開所有使用者的連線;而表空間級別的還原,則可以在online狀態下進行,且還原可直接使用資料庫的備份檔案進行。

一、線上備份與資料庫“離線”還原

1、  備份資料庫,並且備份日誌(備份的是備份期間其他使用者的事務操作,產生的日誌):

在另一個會話中,當備份開始時,就插入一條記錄,並進行提交,本例中將該資料提交完之後,發現備份還在進行之中:

Session A進行備份:

db2 => commit

DB20000I  The SQL command completed successfully.

db2 => backup database sample online to /home/db2inst1/bak_sample include logs

 

Backup successful. The timestamp for this backup image is : 20100804225927

 

Session BSession A備份開始後,立刻插入資料:

db2 => insert into newtable values(777)

DB20000I  The SQL command completed successfully.

db2 => commit

DB20000I  The SQL command completed successfully.

 

Session A在備份完成之後,再次連上資料庫,就發現已經多了一條資料:

db2 => connect to sample

   Database Connection Information

 

 Database server        = DB2/LINUX 9.7.1

 SQL authorization ID   = DB2INST1

 Local database alias   = SAMPLE

 

db2 => select * from newtable

 

AA        

-----------

        123

        222

        333

        444

        555

        777

  6 record(s) selected.

 

2、現在模擬故障,表newtable所在的表空間容器,意外丟失:

[db2inst1@localhost ~]$ rm -f /home/db2inst1/db2inst1/NODE0000/SAMPLE/T0000002/C0000000.LRG

 

db2 => select * from newtable

 

AA        

-----------

SQL0290N  Table space access is not allowed.  SQLSTATE=55039

 

3斷開所有連線,對資料庫進行restorerollforward

db2 => force applications all

DB20000I  The FORCE APPLICATION command completed successfully.

DB21024I  This command is asynchronous and may not be effective immediately.

db2 => restore database sample from /home/db2inst1/bak_sample taken at 20100804225927

SQL2539W  Warning!  Restoring to an existing database that is the same as the

backup image database.  The database files will be deleted.

Do you want to continue ? (y/n) y

DB20000I  The RESTORE DATABASE command completed successfully.

db2 => rollforward database sample to end of logs and stop

 

                                 Rollforward Status

 

 Input database alias                   = sample

 Number of nodes have returned status   = 1

 

 Node number                            = 0

 Rollforward status                     = not pending

 Next log file to be read               =

 Log files processed                    = S0000004.LOG - S0000005.LOG

 Last committed transaction             = 2010-08-04-23.18.19.000000 Local

 

DB20000I  The ROLLFORWARD command completed successfully.

 

4登陸上資料庫,發現在步驟1中插入的記錄,也恢復成功了:

db2 => connect to sample

 

   Database Connection Information

 

 Database server        = DB2/LINUX 9.7.1

 SQL authorization ID   = DB2INST1

 Local database alias   = SAMPLE

 

db2 => select * from newtable

 

AA        

-----------

        123

        222

        333

        444

        555

        777

 

  6 record(s) selected.

 

         通過上述實驗發現,直接restorerollforward資料庫,需要斷開所有使用者的連線,“代價”過大。

 

二、使用資料庫備份檔案,進行表空間線上還原

下面,還是使用上面實驗中的資料庫的備份,我們僅對錶空間進行online狀態下的操作,可以在不斷開使用者連線的情況下進行。

1、  先將表空間容器刪除

[db2inst1@localhost ~]$ rm -f /home/db2inst1/db2inst1/NODE0000/SAMPLE/T0000002/C0000000.LRG

2、  進行restore,用資料庫的備份檔案來還原,僅還原表空間,狀態處於online

db2 => restore database sample  TABLESPACE ( USERSPACE1 )  ONLINE from /home/db2inst1/bak_sample taken at 20100804225927

DB20000I  The RESTORE DATABASE command completed successfully.

3、進行rollforward,狀態同樣是online

db2 => rollforward database sample  to end of logs and stop tablespace (USERSPACE1) online

                                 Rollforward Status

 

 Input database alias                   = sample

 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             = 2010-08-04-23.18.19.000000 Local

 

DB20000I  The ROLLFORWARD command completed successfully.

4、其他已經連線上的使用者,此時就能查詢到結果了。並且在DBA進行恢復的時候,不會強制斷開使用者的連線:

db2 => select * from newtable

 

AA        

-----------

SQL0290N  Table space access is not allowed.  SQLSTATE=55039

db2 => select * from newtable

 

AA        

-----------

        123

        333

        444

        555

        777

 

  5 record(s) selected.

問:第一次查詢時,怎麼顯示了“SQL0290N  Table space access is not allowed.  SQLSTATE=55039”的結果?

答:表空間未完成恢復,狀態不是normal時,是不允許其他使用者訪問表空間的資料的。一旦恢復成功,使用者就能夠進行相應的操作。

 

問:對錶空間進行restorerollforward操作的使用者,其本身與資料的連線,是否會被斷開?

答:會被斷開。詳情如下:

db2 => rollforward database sample  to end of logs and stop tablespace (USERSPACE1) online

 

                                 Rollforward Status

 

 Input database alias                   = sample

 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             = 2010-08-04-23.18.19.000000 Local

 

DB20000I  The ROLLFORWARD command completed successfully.

db2 => select * from newtable

SQL1024N  A database connection does not exist.  SQLSTATE=08003

db2 => connect to sample

 

   Database Connection Information

 

 Database server        = DB2/LINUX 9.7.1

 SQL authorization ID   = DB2INST1

 Local database alias   = SAMPLE

 

db2 => select * from newtable

 

AA        

-----------

        123

        333

        444

        555

        777

 

  5 record(s) selected.

 

db2 =>

    小結:表空間的線上還原,可以在不斷開已有資料庫使用者連線的情況下進行。且當我們沒有表空間的備份檔案的時候,可以選擇一個合適的資料庫的備份檔案來進行還原。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14600958/viewspace-670310/,如需轉載,請註明出處,否則將追究法律責任。

相關文章