一次一波三折的DB2数据库重定向恢复

作为一个IT人士,写小说之余还是要干点本职工作。接下来跟大家分享一个曾经遇到过的DB2数据库重定向恢复的问题。

以前做过好几次用到redirected restore的数据库迁移,都很顺利,可是这一次却栽了个跟头。不能说“大意了”,只能怪自己“懂得太少”。

环境:9.7 fp9 + zlinux

从prod环境上将备份文件transfer到DEV环境,由于DEV上已经有了同名的数据库SMMNF,所以需要用到redirected restore,将备份文件restore到一个新建的SMMNFP数据库里。

自己懒得写脚本,就直接生成了:

db2 restore database smmnf into smmnfp redirect generate script ./rr.sql

看了下,因为db_path是一样的,所以没改脚本,直接就开炮了!

前边一切顺利,到最后db2 rollforward db smmnfp query status查看处于rollforward pending,突然发现原来备份文件是online的,还是从TSM上取下来的。

跑一下rollfoward db to end of log and complete,出错:

SQL1268N Roll-forward recovery stopped due to error "SQL2033" while

retrieving log file "S0055756.LOG" for database "SMMNFP" on node "0".

原因是restore的时候没有指定LOGTARGET,导致rollforward需要的日志文件没能extract出来。

于是修改生成的rr.sql文件,指定logtarget:

RESTORE DATABASE SMMNF FROM '/db/backups/prod_backup' TAKEN AT 20140425114322 INTO SMMNFP  LOGTARGET /db2/apply/logtarget REDIRECT

前期一切顺利,可是到rollforward的时候又出错了:

baccdsdata:/db2/apply$ db2 rollforward database smmnfp query status

Rollforward Status

Input database alias                   = smmnfp

Number of nodes have returned status   = 1

Node number                            = 0

Rollforward status                     = DB  pending

Next log file to be read               = S0055756.LOG

Log files processed                    =  -

Last committed transaction             = 2014-04-25-12.23.22.000000 UTC

baccdsdata:/db2/apply$ db2 "rollforward db smmnfp to end of logs and complete overflow log path (/db2/apply/logtarget)"

SQL1268N  Roll-forward recovery stopped due to error "SQL2033" while

retrieving log file "S0055757.LOG" for database "SMMNFP" on node "0".


这次肿么又冒出一个S0055757.LOG(⊙o⊙)?

看db2diag.log(记住,日志是你解决问题第一个要看的东西):

2014-05-01-06.38.26.838436+000 E90419A432        LEVEL: Error

PID     : 21430                TID  : 4392547772688PROC : db2sysc 0

INSTANCE: smartmfg             NODE : 000

EDUID   : 38651                EDUNAME: db2lfr (SMMNFP) 0

FUNCTION: DB2 UDB, data protection services, sqlpSearchForLogArchiveOnDisk, probe:4000

MESSAGE : ZRC=0x860F000A=-2045837302=SQLO_FNEX "File not found."

DIA8411C A file "" could not be found.

2014-05-01-06.38.26.897621+000 E90852A361         LEVEL: Error

PID     : 34158                TID  : 4397873211152PROC : db2vend (db2logmgr.meth1 - 38648

INSTANCE: smartmfg             NODE : 000

FUNCTION: DB2 UDB, database utilities, sqluvint, probe:292

DATA #1 : TSM RC, PD_DB2_TYPE_TSM_RC, 4 bytes

TSM RC=0x00000196=406 -- see TSM API Reference for meaning.

2014-05-01-06.38.26.898602+000 E91214A865         LEVEL: Error

PID     : 21430                TID  : 4392681990416PROC : db2sysc 0

INSTANCE: smartmfg             NODE : 000

EDUID   : 38648                EDUNAME: db2logmgr (SMMNFP) 0

FUNCTION: DB2 UDB, data protection services, sqlpInitVendorDevice, probe:1030

MESSAGE : ZRC=0x86100025=-2045771739=SQLP_MEDIA_VENDOR_DEV_ERR

"A vendor device reported a media error."

DATA #1 : String, 29 bytes

Init failed!  Vendor rc info:

DATA #2 : Vendor RC, PD_DB2_TYPE_VENDOR_RC, 4 bytes

Vendor RC=0x0000000B=11 -- see DB2 API Guide for meaning.

DATA #3 : Hexdump, 48 bytes

0x000003FED157F090 : 0000 0196 3239 3220 3430 3600 0000 0000    ....292 406.....

0x000003FED157F0A0 : 0000 0000 0000 0000 0000 0000 0000 0000    ................

0x000003FED157F0B0 : 0000 0000 0000 0000 0000 0000 0000 0000    ................

2014-05-01-06.38.26.898998+000 I92080A438         LEVEL: Error

PID     : 21430                TID  : 4392681990416PROC : db2sysc 0

INSTANCE: smartmfg             NODE : 000

EDUID   : 38648                EDUNAME: db2logmgr (SMMNFP) 0

FUNCTION: DB2 UDB, data protection services, sqlpSearchForLogArchiveOnVendor, probe:8200

RETCODE : ZRC=0x86100025=-2045771739=SQLP_MEDIA_VENDOR_DEV_ERR

"A vendor device reported a media error."

TSM的问题。原来prod上用的是TSM online bakcup,archive log mode。而本地根本就没有配置TSM bakcup。

刚开始想直接将logarchmeth1改成off,发现不行:

baccdsdata:/db/backups/prod_backup$ db2 update db cfg for smmnfp using logarchmeth1 off

SQL5099N  The value "OFF" indicated by the database configuration parameter

"LOGARCHMETH1" is not valid, reason code "17".  SQLSTATE=08004

Cannot switch to circular logging when database is rollforward pending.

那就改成本地archive:

baccdsdata:/db/backups$ mkdir arch_log

baccdsdata:/db/backups$ db2 update db cfg for smmnfp using logarchmeth1 DISK:/db/backups/arch_log

DB20000I  The UPDATE DATABASE CONFIGURATION command completed successfully.

baccdsdata:/db/backups$ rollforward db smmnfp to end of logs and complete overflow log path (/db2/apply/logtarget)

-bash: syntax error near unexpected token `('

baccdsdata:/db/backups$ db2 "rollforward db smmnfp to end of logs and complete overflow log path (/db2/apply/logtarget)"

Rollforward Status

Input database alias                   = smmnfp

Number of nodes have returned status   = 1

Node number                            = 0

Rollforward status                     = not pending

Next log file to be read               =

Log files processed                    = S0055756.LOG - S0055757.LOG

Last committed transaction             = 2014-04-25-12.23.22.000000 UTC

DB20000I  The ROLLFORWARD command completed successfully.

至此终于问题终于解决了。原来bakcup/restore也没有想象中那么简单啊!

只是还有一个问题没能弄清楚:

backup中的logpath和target db的logpath是不一样的,如果做restore的时候没有指定NEWLOGPATH会怎么样呢?

PS: 在windows上用offline的DB做过简单的试验,没有什么发现,指不指定似乎都一样。

你可能感兴趣的:(一次一波三折的DB2数据库重定向恢复)