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

来源:岁月联盟 编辑:zhu 时间:2008-02-16
专家点拨:AIX逻辑卷LVCB问题巧解决内容简介:【aix教程】 在AIX系统中,用逻辑卷治理器(LVM)来治理存贮设备,这是它区别于传统的UNIX系统的一个重要特征,也是AIX系统的一大优势。 大多数用户的应用系统把数据库空间直接建立在逻辑卷上,而且使用裸设

【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 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系统治理技术》一书。

图片内容