加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

AIX裸设备数据迁移总结( 原创 )

(2012-10-24 21:14:00)
标签:

杂谈

AIX裸设备数据迁移总结( 原创 )

 

在AIX系统中,用逻辑卷管理器(LVM)来管理存贮设备,这是它区别于传统的UNIX系统的一个重要特征,也是AIX系统的一大优势。

 

    大多数用户的应用系统把数据库空间直接建立在逻辑卷上,而且使用裸设备的方式存放数据,由于数据库厂商使用不了不同的方法访问裸逻辑卷设备,就出现这样一个问题:数据库程序是否覆盖逻辑卷的LVCB。

   

逻辑卷控制块(LVCB)保存着逻辑卷的重要信息,它位于在逻辑卷开始,占用了512个字节。逻辑卷控制块包括的信息有:逻辑卷创建日期、逻辑卷的镜像拷贝数和安装点(如果在逻辑卷上创建了一个JFS文件系统,才有安装点)。使用命令/usr/sbin/getlvcb能够获得逻辑卷的LVCB。

 

下面是用getlvcb命令显示逻辑卷lv1中的LVCB信息:

 

    #getlvcb -TA lv00

         AIX LVCB

         intrapolicy = m

         copies = 1

         interpolicy = m

         lvid = 000d287353697130.16

         lvname = lv1

         label = /allenfs

         machine id = D28734C00

         number lps = 1

         relocatable = y

         strict = y

         stripe width = 0

         stripe size in exponent = 0

         type = jfs

         upperbound = 32

         fs = log=/dev/hd8:options=rw:account=false

         time created  = Fri Apr 13 17:16:35 2001

         time modified = Fri Apr 13 17:16:38 2001

 

   在getlvcb命令执行后,输出结果的第一行是“AIX LVCB”,这是AIX逻辑卷的标志。上面的显示的LVCB信息同样保存ODM数据库中,getlvcb命令是直接从逻辑卷上获得LVCB的内容。许多LVM命令在运行时需要更新LVCB的内容,并且要保证LVCB的内容与LVM一致。更新LVCB之前,先读取旧的LVCB内容,分析其是否有效,如果确定其正确有效,则更新,否则就会出现问题,不能更新LVCB,同时提示如下错误信息:

    Warning, cannot write lv control block data

用户为了能够让应用程序直接访问逻辑卷而创建了一个裸逻辑卷,大多数情况下应用程序会覆盖逻辑卷的LVCB,然而这并不是致命性的问题,用户仍然能在这个逻辑卷上执行维护命令:extendlv、mklvcopy、rmlv和crfs –d(这个命令会损坏LVCB中的所有信息),但并不是所有的LVM命令都能成功执行,例如就无法输入(Import)一个逻辑卷,所以它需要一个正确有效的LVCB才能执行成功。

    因此通过应用程序直接访问LVCB是比较危险的,直接访问裸逻辑卷一般用于数据库系统。数据库系统使用裸设备存放数据以提高性能,例如informix的数据空间(DBSpace)可以建立在一个熟设备上(例如文件系统中的一个文件),也可建立在一个裸设备上(即裸逻辑卷,有时也称为生设备),当建立在裸逻辑卷时,最好不要让数据空间位于裸逻辑卷的开始,应该有一个偏移量(offset),偏移量的大小应大于LVCB的大小,一般用一个AIX逻辑块的大小做偏移量,即4096字节。但是有一些数据库厂商利用他们自己的方法管理逻辑卷,却覆盖了LVCB。

如果不知道逻辑卷开始的512个字节是LVCB,数据库程序覆盖了一个完整的LVCB,就破坏了逻辑卷的LVCB,这样非常有可能损坏数据库,要解决数据库问题只能找数据库厂商,而大多数数据库系统的最新版本都避免了这种问题的发生,除非是用户在建立数据空间时没有考虑LVCB的存在。

    用上面提到的getlvcb命令可以检查逻辑卷的LVCB是否被损坏,如果字符串“AIX LVCB”出现,则表明LVCB是好的,除此之外,还可以用下面的命令检查逻辑卷的LVCB是否完整:

    #od -c /dev/hd1

    0000000              \0  \0     \0  \0  \0

    0000020   \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0

    0000040   \0  \0  \0  \0  \0  \0  \0  \0  \0  \0        8

    0000060                \0  \0  \0

    0000100   \0  \0  \0      \0  \0  \0  \0  \0  \0  \0  \0  \0

    0000120   \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0

    *

    0000200   \0  \0  \0                        7

    0000220                 \n  \0  \0  \0  \0

    0000240   \0                          1

    0000260               \n  \0  \0  \0  \0  \0   D

    0000300           \0     \0   \0

    0000320   \0 001  \0 001          \0  \0  \0  \0

    0000340   \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0

    *

    0000520   \0  \0  \0  \0              8

    0000540                   o

    0000560            \0  \0  \0  \0  \0  \0  \0

    0000600   \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0

    *

    … …

    当出现“AIX LVCB”字样,就说明LVCB是好的,否则就被损坏。如果逻辑卷的LVCB被损坏,而关于LVCB的内容还在ODM数据库中保存着,因此通过下面的命令可以恢复逻辑卷上的LVCB:

    #echo "AIX LVCB\0" | dd of=/dev/lv1  bs=1 count=9

    #updatelv lv1  datavg       (lv0是逻辑卷名,它属于datavg卷组)

    第一条命令是把逻辑卷标志写到从逻辑卷开始的9个字节中。第二命令是把ODM数据库中关于这个逻辑卷的LVCB内容写到从逻辑卷开始的512个字节中。

    如果LVCB中的fs字段内容被删掉了,还必须用chfs命令按照ODM数据库中的其它内容,更新这一项:

    # chfs -a log=/dev/hd8 /allenfs

    如果在ODM数据库中找不到关于这个逻辑卷的信息,那么这个逻辑卷可能就无救了。

 

   如果裸设备是符合AIX LV的格式,及存在LVCB这512个字节的话,通过cplv后是可以被使用的;cplv并不拷贝LVCB。

   所以,数据库裸设备建立并没有考虑LVCB的offset,这个是非常可怕的,可能会因为某些AIX的操作导致无法修复。需要建议客户,根据lvcb offset重建裸设备,并导入0级备份。符合格式的lv才有利于已经的AIX系统升级。

 

   如果客户依然想按照原有裸设备模式进行迁移的话,cplv就无法对非法格式的lv进行迁移,必须使用dd

 

   dd if=/dev/chunk1 of=/dev/temp_chunk1

  但是需要说明的是,dd并没有对源lv进行检查,也不对目标lv进行优化,特别是如果目标lv已经做过条带化(strip)时,拷贝的数据将不作任何优化。相对的,cplv是调用的AIX底层的命令lvrawcp,此命令在拷贝的同时,会进行相关的校验和优化。在真实环境中,推荐用户使用cplv而非dd。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有