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数据库中找不到关于这个逻辑卷的信息,那么这个逻辑卷可能就无救了。
如果裸设备是符合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。
加载中,请稍候......