使用dd修改保留页恢复OFFLINE的dbspace和chunk

注意:使用此方法一定要确定对应的chunk文件在系统层已经恢复为正常状态!此方法也仅供参考。

目的:了解informix数据库保留页。
测试平台:ids v9.40uc4w4 for linux

初始数据库空间状况
请输入图片描述
停掉数据库,然后把dbspace 名为 userdbs_p 下的两个chunk对应的系统文件改名

informix% cd /opt/info9/dbs && mv userdbs_p userdbs_pbak && mv userdbs userdbsbak  

然后再启动数据库,这时数据库将报错
请输入图片描述

然后的数据库dbspace和chunk的状态,userdbs_p及其chunk都是down掉的
请输入图片描述

再次停掉数据库(不管系统输出的af,因为我们知道原因就是chunk没了),将原来的userdbs_p,userdbs文件恢复

informix% cd /opt/info9/dbs && mv userdbs_p userdbs_p && mv userdbsbak userdbs  

再次启动数据库(此次,chunk文件对应的系统文件已经恢复正常),但userdbs_p仍然会是down的,仍如上面图所示

尝试使用onspaces -s 命令转换chunk状态也将失败
请输入图片描述

由于userdbs_p这个dbspace的状态是 ND ,故无法通过onspaces命令改变chunk状态。由于chunk文件在系统层面上已经恢复,我们考虑通过更改rootdbs上的系统保留页上的dbspace及chunk信息来恢复状态。

首先:
1)保留当前系统的保留页信息 oncheck -pr > oncheck_pr.txt 备用
2)输出保留页中的信息备用 oncheck -pP 1 0 > oncheck_pP.txt,oncheck -pP 11 >> oncheck_pP.txt ...,将0-11页的信息都保存下来(实际上,此次测试时仅用到了第4-5页dbspace页和第6-7页chunk页,以下我们也仅介绍第4-7页)
注:第4页和第5页互为备份,第6页和第7页互为备份,数据库启动时轮流读取。以下我们仅修改5-6页,但请记住也要修改第4页和第7页。

完成后,再次停掉数据库(以下使用dd操作时,均是在数据库offline时操作的)
使用dd读出rootdbs保留页中的5-6页(注意的是,保留页从0开始算),同时需要参考chunk的路径,示例中的是:

address  chunk/dbs  offset     size       free       bpages     flags pathname
44c8a928 1     1    0          50000      40254                 PO-B  /opt/info9/dbs/rootdbs

相应的操作命令是

informix% dd if=/opt/info9/dbs/rootdbs bs=2k count=2 skip=5 of=ROOTRSV5_6

命令解释:源文件if,目标文件of,块大小是2k(这里为方便使用页大小),需要的块数是bs,跳过前5页skip(即0-4)

从oncheck -pP 1 5的输出中,可以看到 userdbs_p位于slot2中,记录在301字节处开始,同时可以看到其flags是 5 0 6 0 对应是 0x60005,而正常的flags应是0x60001(rootdbs的flags),这个flags可以oncheck -pr中也可以看到
请输入图片描述
在oncheck -pP 1 6的输出中,对应的两个chunk记录信息开始分别是321和1505,它们的flags标识均是20 0 1 0 即0x10020,正常的应该是0x10040,这个也可以在oncheck -pr的输出中看到

    Chunk number                   2
    Flags                          0x10020    Chunk is offline
    Chunk path                     /opt/info9/dbs/userdbs_p
    Chunk offset                   0 (p)
    Chunk size                     10000 (p)
    Number of free pages           7550
    DBspace number                 2
    Next chunk in DBspace          6

请输入图片描述
我们这里使用UltraEdit打开ROOTRSV5_6,找到dbspace和其对应chunk的flags,改掉即可(要更改的信息在上面已经分析出来)
1)修改dbspace userdbs_p的状态标识
请输入图片描述

2)修改chunk userdbs_p,userdbs的状态标识
请输入图片描述

至此,需要修改的保留页信息均已经修改完毕,保存(打开ROOTRSV5_6时不要转换成dos格式,若ftp传输,需使用bin方式)回数据库服务器上。

最后将ROOTRSV5_6的信息写回rootdbs上

informix% dd if=ROOTRSV5_6 bs=2k count=2 seek=5 conv=notrunc of=/opt/info9/dbs/rootdbs

命令解释:新参数seek是写入时使用的,与读入的skip对应,conv的参数notrunc是让只写需要的部分,其它原文件的内容不改变。

OK!最后一步,使用oncheck -pr检查下改动后的系统保留页,确认都改成功了,启动数据库!查看状态!

informix@suse10:/opt/info9/tmp> oninit -vy
Checking group membership to determine server run modesucceeded
Reading configuration file '/opt/info9/etc/onconfig'...succeeded
Creating /INFORMIXTMP/.infxdirs ... succeeded
Creating infos file "/opt/info9/etc/.infos.ids9_online_net" ... "/opt/info9/etc/.conf.ids9_online_net" ... succeeded
Writing to infos file ... succeeded
Checking config parameters...succeeded
Allocating and attaching to shared memory...succeeded
Creating resident pool 1388 kbytes...succeeded
Creating buffer pool 10002 kbytes...succeeded
Initializing rhead structure...succeeded
Initializing ASF ...succeeded
Initializing Dictionary Cache and SPL Routine Cache...succeeded
Bringing up ADM VP...succeeded
Creating VP classes...succeeded
Onlining 0 additional cpu vps...succeeded
Onlining 2 IO vps...succeeded
Initialization of Encryption...succeeded
Forking main_loop thread...succeeded
Initializing DR structures...succeeded
Forking 1 'soctcp' listener threads...succeeded
Starting tracing...succeeded
Initializing 1 flushers...succeeded
Initializing log/checkpoint information...succeeded
Opening primary chunks...succeeded
Opening mirror chunks...succeeded
Initializing dbspaces...succeeded
Validating chunks...succeeded
Initialize Async Log Flusher...succeeded
Forking btree cleaner...succeeded
Initializing DBSPACETEMP list
Checking database partition index...succeeded
Checking location of physical log...succeeded
Initializing dataskip structure...succeeded
Checking for temporary tables to drop
Forking onmode_mon thread...succeeded
Verbose output complete: mode = 5
informix@suse10:/opt/info9/tmp> onstat -d

IBM Informix Dynamic Server Version 9.40.UC4W4   -- On-Line -- Up 00:00:14 -- 27928 Kbytes

Dbspaces
address  number   flags      fchunk   nchunks  flags    owner    name
44c8a7d8 1        0x60001    1        1        N  B     informix rootdbs
4543c018 2        0x60001    2        2        N  B     informix userdbs_p
4543c168 3        0x60001    3        2        N  B     informix erdbs
4543c2b8 4        0x48001    4        1        N SB     informix ersbs
 4 active, 2047 maximum

Chunks
address  chunk/dbs  offset     size       free       bpages     flags pathname
44c8a928 1     1    0          50000      40254                 PO-B  /opt/info9/dbs/rootdbs
44d88c78 2     2    0          10000      7550                  PO-B  /opt/info9/dbs/userdbs_p
44d88e00 3     3    0          10000      9897                  PO-B  /opt/info9/dbs/erdbs
44c8aaf8 4     4    0          5000       4587       4587       POSB  /opt/info9/dbs/ersbs
                 Metadata 360      268      360     
44c8ac80 5     3    0          5000       4997                  PO-B  /opt/info9/dbs/erdbs2
44c8ae08 6     2    0          5000       4997                  PO-B  /opt/info9/dbs/userdbs
 6 active, 32766 maximum

Expanded chunk capacity mode: always

标签: none

添加新评论