服务器 频道

专家点拨:AIX逻辑卷LVCB问题巧解决

    【IT168 专稿】在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    A   I   X       L   V   C   B  \0  \0   j   f   s  \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   0   0   0   d   2   8
    0000060    7   3   5   3   6   9   7   1   3   0   .   1   6  \0  \0  \0
    0000100   \0  \0  \0   l   v   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   F   r   i       A   p   r       1   3       1   7
    0000220    :   1   6   :   3   5       2   0   0   1  \n  \0  \0  \0  \0
    0000240   \0   F   r   i       A   p   r       1   3       1   7   :   1
    0000260    6   :   3   8       2   0   0   1  \n  \0  \0  \0  \0  \0   D
    0000300    2   8   7   3   4   C   0   0  \0   y   m   m  \0   y  \0
    0000320   \0 001  \0 001   /   a   l   l   e   n   f   s  \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   l   o   g   =   /   d   e   v   /   h   d   8
    0000540    :   o   p   t   i   o   n   s   =   r   w   :   a   c   c   o
    0000560    u   n   t   =   f   a   l   s   e  \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数据库中找不到关于这个逻辑卷的信息,那么这个逻辑卷可能就无救了。

    注:本文中的相关概念和内容请参阅《IBM UNIX&Linux—AIX 5L系统管理技术》一书。

0
相关文章